diff options
author | gvit <gvit@ydb.tech> | 2023-11-07 15:49:02 +0300 |
---|---|---|
committer | gvit <gvit@ydb.tech> | 2023-11-07 16:11:07 +0300 |
commit | 03ffc7e5fc8734ac44705fc1d4fbdc74a5b7accd (patch) | |
tree | e95af7cc203129c840123273a375ec8114b98263 | |
parent | 69078ba0ecd4a17b6871cc1ffea02b6c06e3e62c (diff) | |
download | ydb-03ffc7e5fc8734ac44705fc1d4fbdc74a5b7accd.tar.gz |
don't allow to add columns with serial data type KIKIMR-19959
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_exec.cpp | 25 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_type_ann.cpp | 16 | ||||
-rw-r--r-- | ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 35 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/query.cpp | 19 |
4 files changed, 72 insertions, 23 deletions
diff --git a/ydb/core/kqp/provider/yql_kikimr_exec.cpp b/ydb/core/kqp/provider/yql_kikimr_exec.cpp index e8193f7c53..bd05a99d72 100644 --- a/ydb/core/kqp/provider/yql_kikimr_exec.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_exec.cpp @@ -1090,16 +1090,25 @@ public: auto actualType = notNull ? type : type->Cast<TOptionalExprType>()->GetItemType(); auto dataType = actualType->Cast<TDataExprType>(); SetColumnType(*add_column->mutable_type(), TString(dataType->GetName()), notNull); - if (columnTuple.Size() > 2) { - auto families = columnTuple.Item(2).Cast<TCoAtomList>(); - if (families.Size() > 1) { - ctx.AddError(TIssue(ctx.GetPosition(families.Pos()), - "Unsupported number of families")); + + auto columnConstraints = columnTuple.Item(2).Cast<TCoNameValueTuple>(); + for(const auto& constraint: columnConstraints.Value().Cast<TCoNameValueTupleList>()) { + if (constraint.Name().Value() == "serial") { + ctx.AddError(TIssue(ctx.GetPosition(constraint.Pos()), + "Column addition with serial data type is unsupported")); return SyncError(); } - for (auto family : families) { - add_column->set_family(TString(family.Value())); - } + } + + auto families = columnTuple.Item(3).Cast<TCoAtomList>(); + if (families.Size() > 1) { + ctx.AddError(TIssue(ctx.GetPosition(families.Pos()), + "Unsupported number of families")); + return SyncError(); + } + + for (auto family : families) { + add_column->set_family(TString(family.Value())); } } } else if (name == "dropColumns") { diff --git a/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp b/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp index 2e84f4f1ef..c75a9e7fc1 100644 --- a/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp @@ -1206,15 +1206,13 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over return IGraphTransformer::TStatus::Error; } - if (columnTuple.Size() > 2) { - auto families = columnTuple.Item(2); - if (families.Cast<TCoAtomList>().Size() > 1) { - ctx.AddError(TIssue(ctx.GetPosition(nameNode.Pos()), TStringBuilder() - << "AlterTable : " << NCommon::FullTableName(table->Metadata->Cluster, table->Metadata->Name) - << " Column: \"" << name - << "\". Several column families for a single column are not yet supported")); - return TStatus::Error; - } + auto families = columnTuple.Item(3); + if (families.Cast<TCoAtomList>().Size() > 1) { + ctx.AddError(TIssue(ctx.GetPosition(nameNode.Pos()), TStringBuilder() + << "AlterTable : " << NCommon::FullTableName(table->Metadata->Cluster, table->Metadata->Name) + << " Column: \"" << name + << "\". Several column families for a single column are not yet supported")); + return TStatus::Error; } } } else if (name == "dropColumns") { diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index e76fc7f8bb..b7567804a2 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -3579,6 +3579,41 @@ Y_UNIT_TEST_SUITE(KqpScheme) { } } + Y_UNIT_TEST(SerialTypeCreateAndAlter) { + NKikimrConfig::TAppConfig appConfig; + appConfig.MutableTableServiceConfig()->SetEnableSequences(false); + auto serverSettings = TKikimrSettings().SetAppConfig(appConfig); + TKikimrRunner kikimr(serverSettings); + auto db = kikimr.GetTableClient(); + auto session = db.CreateSession().GetValueSync().GetSession(); + + { + auto query = R"( + --!syntax_v1 + CREATE TABLE `/Root/SerialTableCreateAndAlter` ( + Key Int32, + Value String, + PRIMARY KEY (Key) + ); + )"; + + auto result = session.ExecuteSchemeQuery(query).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, + result.GetIssues().ToString()); + } + + { + auto query = R"( + --!syntax_v1 + ALTER TABLE `/Root/SerialTableCreateAndAlter` ADD COLUMN SeqNo Serial; + )"; + + auto result = session.ExecuteSchemeQuery(query).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, + result.GetIssues().ToString()); + } + } + Y_UNIT_TEST(SerialTypeNegative1) { NKikimrConfig::TAppConfig appConfig; appConfig.MutableTableServiceConfig()->SetEnableSequences(true); diff --git a/ydb/library/yql/sql/v1/query.cpp b/ydb/library/yql/sql/v1/query.cpp index 8231288697..0918e59133 100644 --- a/ydb/library/yql/sql/v1/query.cpp +++ b/ydb/library/yql/sql/v1/query.cpp @@ -1080,14 +1080,21 @@ public: if (col.Nullable) { type = Y("AsOptionalType", type); } + columnDesc = L(columnDesc, type); - if (col.Families) { - auto familiesDesc = Y(); - for (const auto& family : col.Families) { - familiesDesc = L(familiesDesc, BuildQuotedAtom(family.Pos, family.Name)); - } - columnDesc = L(columnDesc, Q(familiesDesc)); + auto columnConstraints = Y(); + if (col.Serial) { + columnConstraints = L(columnConstraints, Q(Y(Q("serial"), Q("true")))); + } + + columnDesc = L(columnDesc, Q(Y(Q("columnConstrains"), Q(columnConstraints)))); + + auto familiesDesc = Y(); + for (const auto& family : col.Families) { + familiesDesc = L(familiesDesc, BuildQuotedAtom(family.Pos, family.Name)); } + columnDesc = L(columnDesc, Q(familiesDesc)); + columns = L(columns, Q(columnDesc)); } actions = L(actions, Q(Y(Q("addColumns"), Q(columns)))); |