@@ -733,18 +733,25 @@ bool FillColumnDescription(NKikimrSchemeOp::TTableDescription& out,
733733 return true ;
734734}
735735
736- bool FillColumnDescription (NKikimrSchemeOp::TColumnTableDescription& out,
737- const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in, Ydb::StatusIds::StatusCode& status, TString& error) {
738- auto * schema = out.MutableSchema ();
736+ NKikimrSchemeOp::TOlapColumnDescription* GetAddColumn (NKikimrSchemeOp::TColumnTableDescription& out) {
737+ return out.MutableSchema ()->AddColumns ();
738+ }
739+
740+ NKikimrSchemeOp::TOlapColumnDescription* GetAddColumn (NKikimrSchemeOp::TAlterColumnTable& out) {
741+ return out.MutableAlterSchema ()->AddAddColumns ();
742+ }
739743
744+ template <typename TColumnTable>
745+ bool FillColumnDescriptionImpl (TColumnTable& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
746+ Ydb::StatusIds::StatusCode& status, TString& error) {
740747 for (const auto & column : in) {
741748 if (column.type ().has_pg_type ()) {
742749 status = Ydb::StatusIds::BAD_REQUEST;
743750 error = " Unsupported column type for column: " + column.name ();
744751 return false ;
745752 }
746753
747- auto * columnDesc = schema-> AddColumns ( );
754+ auto * columnDesc = GetAddColumn (out );
748755 columnDesc->SetName (column.name ());
749756
750757 NScheme::TTypeInfo typeInfo;
@@ -763,6 +770,81 @@ bool FillColumnDescription(NKikimrSchemeOp::TColumnTableDescription& out,
763770 return true ;
764771}
765772
773+ bool FillColumnDescription (NKikimrSchemeOp::TColumnTableDescription& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
774+ Ydb::StatusIds::StatusCode& status, TString& error) {
775+ return FillColumnDescriptionImpl (out, in, status, error);
776+ }
777+
778+ bool FillColumnDescription (NKikimrSchemeOp::TAlterColumnTable& out, const google::protobuf::RepeatedPtrField<Ydb::Table::ColumnMeta>& in,
779+ Ydb::StatusIds::StatusCode& status, TString& error) {
780+ return FillColumnDescriptionImpl (out, in, status, error);
781+ }
782+
783+ bool BuildAlterColumnTableModifyScheme (const TString& path, const Ydb::Table::AlterTableRequest* req,
784+ NKikimrSchemeOp::TModifyScheme* modifyScheme, Ydb::StatusIds::StatusCode& status, TString& error) {
785+ const auto ops = GetAlterOperationKinds (req);
786+ if (ops.empty ()) {
787+ status = Ydb::StatusIds::BAD_REQUEST;
788+ error = " Empty alter" ;
789+ return false ;
790+ }
791+
792+ if (ops.size () > 1 ) {
793+ status = Ydb::StatusIds::UNSUPPORTED;
794+ error = " Mixed alter is unsupported" ;
795+ return false ;
796+ }
797+
798+ const auto OpType = *ops.begin ();
799+
800+ std::pair<TString, TString> pathPair;
801+ try {
802+ pathPair = SplitPathIntoWorkingDirAndName (path);
803+ } catch (const std::exception&) {
804+ status = Ydb::StatusIds::BAD_REQUEST;
805+ return false ;
806+ }
807+
808+ const auto & workingDir = pathPair.first ;
809+ const auto & name = pathPair.second ;
810+ modifyScheme->SetWorkingDir (workingDir);
811+
812+ if (OpType == EAlterOperationKind::Common) {
813+ auto alterColumnTable = modifyScheme->MutableAlterColumnTable ();
814+ alterColumnTable->SetName (name);
815+ modifyScheme->SetOperationType (NKikimrSchemeOp::EOperationType::ESchemeOpAlterColumnTable);
816+
817+ for (const auto & drop : req->drop_columns ()) {
818+ alterColumnTable->MutableAlterSchema ()->AddDropColumns ()->SetName (drop);
819+ }
820+
821+ if (!FillColumnDescription (*alterColumnTable, req->add_columns (), status, error)) {
822+ return false ;
823+ }
824+
825+ if (req->has_set_ttl_settings ()) {
826+ if (!FillTtlSettings (*alterColumnTable->MutableAlterTtlSettings ()->MutableEnabled (), req->Getset_ttl_settings (), status, error)) {
827+ return false ;
828+ }
829+ } else if (req->has_drop_ttl_settings ()) {
830+ alterColumnTable->MutableAlterTtlSettings ()->MutableDisabled ();
831+ }
832+
833+ if (req->has_set_tiering ()) {
834+ alterColumnTable->MutableAlterTtlSettings ()->SetUseTiering (req->set_tiering ());
835+ } else if (req->has_drop_tiering ()) {
836+ alterColumnTable->MutableAlterTtlSettings ()->SetUseTiering (" " );
837+ }
838+ }
839+
840+ return true ;
841+ }
842+
843+ bool BuildAlterColumnTableModifyScheme (
844+ const Ydb::Table::AlterTableRequest* req, NKikimrSchemeOp::TModifyScheme* modifyScheme, Ydb::StatusIds::StatusCode& code, TString& error) {
845+ return BuildAlterColumnTableModifyScheme (req->path (), req, modifyScheme, code, error);
846+ }
847+
766848template <typename TYdbProto>
767849void FillTableBoundaryImpl (TYdbProto& out,
768850 const NKikimrSchemeOp::TTableDescription& in, const NKikimrMiniKQL::TType& splitKeyType) {
@@ -1667,4 +1749,4 @@ bool FillSequenceDescription(NKikimrSchemeOp::TSequenceDescription& out, const Y
16671749 return true ;
16681750}
16691751
1670- } // namespace NKikimr
1752+ } // namespace NKikimr
0 commit comments