aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgvit <gvit@ydb.tech>2023-11-07 15:49:02 +0300
committergvit <gvit@ydb.tech>2023-11-07 16:11:07 +0300
commit03ffc7e5fc8734ac44705fc1d4fbdc74a5b7accd (patch)
treee95af7cc203129c840123273a375ec8114b98263
parent69078ba0ecd4a17b6871cc1ffea02b6c06e3e62c (diff)
downloadydb-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.cpp25
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_type_ann.cpp16
-rw-r--r--ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp35
-rw-r--r--ydb/library/yql/sql/v1/query.cpp19
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))));