diff --git a/ydb/core/grpc_services/rpc_create_table.cpp b/ydb/core/grpc_services/rpc_create_table.cpp index 556004f466d0..88fed4de46d3 100644 --- a/ydb/core/grpc_services/rpc_create_table.cpp +++ b/ydb/core/grpc_services/rpc_create_table.cpp @@ -181,8 +181,28 @@ class TCreateTableRPC : public TRpcSchemeRequestActorcolumns()) { + switch (column.default_value_case()) { + case Ydb::Table::ColumnMeta::kFromSequence: { + auto* seqDesc = modifyScheme->MutableCreateIndexedTable()->MutableSequenceDescription()->Add(); + if (!FillSequenceDescription(*seqDesc, column.from_sequence(), code, error)) { + NYql::TIssues issues; + issues.AddIssue(NYql::TIssue(error)); + return Reply(code, issues, ctx); + } + hasSerial = true; + break; + } + default: break; + } + } + NKikimrSchemeOp::TTableDescription* tableDesc = nullptr; - if (req->indexesSize()) { + if (req->indexesSize() || hasSerial) { modifyScheme->SetOperationType(NKikimrSchemeOp::EOperationType::ESchemeOpCreateIndexedTable); tableDesc = modifyScheme->MutableCreateIndexedTable()->MutableTableDescription(); } else { @@ -192,9 +212,6 @@ class TCreateTableRPC : public TRpcSchemeRequestActorSetName(name); - StatusIds::StatusCode code = StatusIds::SUCCESS; - TString error; - if (!FillColumnDescription(*tableDesc, req->columns(), code, error)) { NYql::TIssues issues; issues.AddIssue(NYql::TIssue(error)); diff --git a/ydb/core/ydb_convert/table_description.cpp b/ydb/core/ydb_convert/table_description.cpp index 40011334c058..65e6e442bfd2 100644 --- a/ydb/core/ydb_convert/table_description.cpp +++ b/ydb/core/ydb_convert/table_description.cpp @@ -1423,7 +1423,6 @@ bool FillTableDescription(NKikimrSchemeOp::TModifyScheme& out, const Ydb::Table::CreateTableRequest& in, const TTableProfiles& profiles, Ydb::StatusIds::StatusCode& status, TString& error, bool indexedTable) { - NKikimrSchemeOp::TTableDescription* tableDesc = nullptr; if (indexedTable) { tableDesc = out.MutableCreateIndexedTable()->MutableTableDescription(); diff --git a/ydb/library/backup/backup.cpp b/ydb/library/backup/backup.cpp index 5dae04564bd8..c283bb82dcef 100644 --- a/ydb/library/backup/backup.cpp +++ b/ydb/library/backup/backup.cpp @@ -742,19 +742,26 @@ void BackupFolder(TDriver driver, const TString& database, const TString& relDbP // Restore //////////////////////////////////////////////////////////////////////////////// -TString ProcessColumnType(const TString& name, TTypeParser parser, NTable::TTableBuilder *builder) { +TString ProcessColumnType(const TString& name, TTypeParser parser, NTable::TTableBuilder *builder, bool isSerial) { TStringStream ss; ss << "name: " << name << "; "; if (parser.GetKind() == TTypeParser::ETypeKind::Optional) { ss << " optional; "; parser.OpenOptional(); } + if (isSerial) { + ss << "serial; "; + } ss << "kind: " << parser.GetKind() << "; "; switch (parser.GetKind()) { case TTypeParser::ETypeKind::Primitive: ss << " type_id: " << parser.GetPrimitive() << "; "; if (builder) { - builder->AddNullableColumn(name, parser.GetPrimitive()); + if (isSerial) { + builder->AddSerialColumn(name, parser.GetPrimitive()); + } else { + builder->AddNullableColumn(name, parser.GetPrimitive()); + } } break; case TTypeParser::ETypeKind::Decimal: @@ -776,7 +783,17 @@ NTable::TTableDescription TableDescriptionFromProto(const Ydb::Table::CreateTabl NTable::TTableBuilder builder; for (const auto &col : proto.Getcolumns()) { - LOG_DEBUG("AddNullableColumn: " << ProcessColumnType(col.Getname(), TType(col.Gettype()), &builder)); + bool isSerial = false; + switch (col.default_value_case()) { + case Ydb::Table::ColumnMeta::kFromSequence: { + if (col.from_sequence().name() == "_serial_" + col.Getname()) { + isSerial = true; + } + break; + } + default: break; + } + LOG_DEBUG("AddColumn: " << ProcessColumnType(col.Getname(), TType(col.Gettype()), &builder, isSerial)); } for (const auto &primary : proto.Getprimary_key()) { @@ -805,7 +822,7 @@ TString SerializeColumnsToString(const TVector& columns, TVector isSerial; + switch (col.default_value_case()) { + case Ydb::Table::ColumnMeta::kFromSequence: { + if (col.from_sequence().name() == "_serial_column_" + col.name()) { + isSerial = true; + } + break; + } + default: break; + } + Columns_.emplace_back(col.name(), col.type(), col.family(), not_null, isSerial); } // indexes @@ -453,8 +463,8 @@ class TTableDescription::TImpl { return Proto_; } - void AddColumn(const TString& name, const Ydb::Type& type, const TString& family, std::optional notNull) { - Columns_.emplace_back(name, type, family, notNull); + void AddColumn(const TString& name, const Ydb::Type& type, const TString& family, std::optional notNull, std::optional isSerial) { + Columns_.emplace_back(name, type, family, notNull, isSerial); } void SetPrimaryKeyColumns(const TVector& primaryKeyColumns) { @@ -737,8 +747,8 @@ const TVector& TTableDescription::GetKeyRanges() const { return Impl_->GetKeyRanges(); } -void TTableDescription::AddColumn(const TString& name, const Ydb::Type& type, const TString& family, std::optional notNull) { - Impl_->AddColumn(name, type, family, notNull); +void TTableDescription::AddColumn(const TString& name, const Ydb::Type& type, const TString& family, std::optional notNull, std::optional isSerial) { + Impl_->AddColumn(name, type, family, notNull, isSerial); } void TTableDescription::SetPrimaryKeyColumns(const TVector& primaryKeyColumns) { @@ -914,6 +924,10 @@ void TTableDescription::SerializeTo(Ydb::Table::CreateTableRequest& request) con if (column.NotNull.has_value()) { protoColumn.set_not_null(column.NotNull.value()); } + if (column.IsSerial.has_value() && column.IsSerial.value()) { + auto* fromSequence = protoColumn.mutable_from_sequence(); + fromSequence->set_name("_serial_column_" + column.Name); + } } for (const auto& pk : Impl_->GetPrimaryKeyColumns()) { @@ -1121,7 +1135,7 @@ TTableBuilder& TTableBuilder::AddNullableColumn(const TString& name, const EPrim .EndOptional() .Build(); - TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, false); + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, false, false); return *this; } @@ -1131,7 +1145,7 @@ TTableBuilder& TTableBuilder::AddNullableColumn(const TString& name, const TDeci .Decimal(type) .EndOptional() .Build(); - TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, false); + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, false, false); return *this; } @@ -1140,7 +1154,7 @@ TTableBuilder& TTableBuilder::AddNullableColumn(const TString& name, const TPgTy .Pg(type) .Build(); - TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, false); + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, false, false); return *this; } @@ -1149,7 +1163,7 @@ TTableBuilder& TTableBuilder::AddNonNullableColumn(const TString& name, const EP .Primitive(type) .Build(); - TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true); + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true, false); return *this; } @@ -1158,7 +1172,7 @@ TTableBuilder& TTableBuilder::AddNonNullableColumn(const TString& name, const TD .Decimal(type) .Build(); - TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true); + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true, false); return *this; } @@ -1167,7 +1181,16 @@ TTableBuilder& TTableBuilder::AddNonNullableColumn(const TString& name, const TP .Pg(type) .Build(); - TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true); + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true, false); + return *this; +} + +TTableBuilder& TTableBuilder::AddSerialColumn(const TString& name, const EPrimitiveType& type, const TString& family) { + auto columnType = TTypeBuilder() + .Primitive(type) + .Build(); + + TableDescription_.AddColumn(name, TProtoAccessor::GetProto(columnType), family, true, true); return *this; } diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.h b/ydb/public/sdk/cpp/client/ydb_table/table.h index d87ccf9be983..2ad2887022ef 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.h +++ b/ydb/public/sdk/cpp/client/ydb_table/table.h @@ -105,14 +105,16 @@ struct TTableColumn { TType Type; TString Family; std::optional NotNull; + std::optional IsSerial; TTableColumn() = default; - TTableColumn(TString name, TType type, TString family = TString(), std::optional notNull = std::nullopt) + TTableColumn(TString name, TType type, TString family, std::optional notNull, std::optional isSerial) : Name(std::move(name)) , Type(std::move(type)) , Family(std::move(family)) , NotNull(std::move(notNull)) + , IsSerial(isSerial) { } // Conversion from TColumn for API compatibility @@ -636,7 +638,7 @@ class TTableDescription { TTableDescription(); explicit TTableDescription(const Ydb::Table::CreateTableRequest& request); - void AddColumn(const TString& name, const Ydb::Type& type, const TString& family, std::optional notNull); + void AddColumn(const TString& name, const Ydb::Type& type, const TString& family, std::optional notNull, std::optional isSerial); void SetPrimaryKeyColumns(const TVector& primaryKeyColumns); // common @@ -854,6 +856,7 @@ class TTableBuilder { TTableBuilder& AddNonNullableColumn(const TString& name, const TPgType& type, const TString& family = TString()); TTableBuilder& SetPrimaryKeyColumns(const TVector& primaryKeyColumns); TTableBuilder& SetPrimaryKeyColumn(const TString& primaryKeyColumn); + TTableBuilder& AddSerialColumn(const TString& name, const EPrimitiveType& type, const TString& family = TString()); // common TTableBuilder& AddSecondaryIndex(const TIndexDescription& indexDescription);