aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpnv1 <pnv1@yandex-team.ru>2022-03-02 14:30:11 +0300
committerpnv1 <pnv1@yandex-team.ru>2022-03-02 14:30:11 +0300
commitccdb20e53d6374ff382bbffadfc1fdec4d676384 (patch)
tree8c8c68cc0e786478fe2274db30494a98c2ac466d
parent46a460ae54f37547e2c9e789c301816538c15bd7 (diff)
downloadydb-ccdb20e53d6374ff382bbffadfc1fdec4d676384.tar.gz
Add family constraints and tests, YQL-14377
ref:f27316972c81b8cd1b60e3c4908a8dc68118ec5f
-rw-r--r--ydb/core/kqp/ut/kqp_scheme_ut.cpp71
-rw-r--r--ydb/library/yql/sql/v1/query.cpp62
2 files changed, 108 insertions, 25 deletions
diff --git a/ydb/core/kqp/ut/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/kqp_scheme_ut.cpp
index df102e5cfeb..d53ec535519 100644
--- a/ydb/core/kqp/ut/kqp_scheme_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_scheme_ut.cpp
@@ -2151,6 +2151,77 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
}
}
+
+ Y_UNIT_TEST(FamilyColumnTest) {
+ TKikimrRunner kikimr;
+ auto db = kikimr.GetTableClient();
+ auto session = db.CreateSession().GetValueSync().GetSession();
+ TString tableName = "/Root/TableFamiliesTest";
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64,
+ Value String,
+ FAMILY Uint32,
+ PRIMARY KEY (Key)
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+
+ auto describeResult = session.DescribeTable(tableName, NYdb::NTable::TDescribeTableSettings()).GetValueSync();
+ UNIT_ASSERT_C(describeResult.IsSuccess(), result.GetIssues().ToString());
+ const auto tableDesc = session.DescribeTable(tableName).GetValueSync().GetTableDescription();
+ TVector<TTableColumn> columns = tableDesc.GetTableColumns();
+ UNIT_ASSERT_VALUES_EQUAL(columns.size(), 3);
+ TTableColumn& familyColumn = columns[2];
+ UNIT_ASSERT_EQUAL(familyColumn.Name, "FAMILY");
+ TTypeParser parser(familyColumn.Type);
+ auto optionalKind = parser.GetKind();
+ UNIT_ASSERT_EQUAL(optionalKind, TTypeParser::ETypeKind::Optional);
+ parser.OpenOptional();
+ auto kind = parser.GetKind();
+ UNIT_ASSERT_EQUAL(kind, TTypeParser::ETypeKind::Primitive);
+ auto primitive = parser.GetPrimitive();
+ UNIT_ASSERT_EQUAL(primitive, EPrimitiveType::Uint32);
+
+ const auto& columnFamilies = tableDesc.GetColumnFamilies();
+ UNIT_ASSERT_VALUES_EQUAL(columnFamilies.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(columnFamilies[0].GetName(), "default");
+ }
+
+ Y_UNIT_TEST(UnknownFamilyTest) {
+ TKikimrRunner kikimr;
+ auto db = kikimr.GetTableClient();
+ auto session = db.CreateSession().GetValueSync().GetSession();
+ TString tableName = "/Root/TableFamiliesTest";
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64,
+ Value1 String FAMILY Family1,
+ PRIMARY KEY (Key)
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ }
+
+ Y_UNIT_TEST(TwoSimilarFamiliesTest) {
+ TKikimrRunner kikimr;
+ auto db = kikimr.GetTableClient();
+ auto session = db.CreateSession().GetValueSync().GetSession();
+ TString tableName = "/Root/TableFamiliesTest";
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64,
+ Value1 String FAMILY Family1,
+ PRIMARY KEY (Key),
+ FAMILY Family1 (),
+ FAMILY Family1 ()
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
+ }
}
} // namespace NKqp
diff --git a/ydb/library/yql/sql/v1/query.cpp b/ydb/library/yql/sql/v1/query.cpp
index 964f15f9ddc..23cfe4d344b 100644
--- a/ydb/library/yql/sql/v1/query.cpp
+++ b/ydb/library/yql/sql/v1/query.cpp
@@ -692,6 +692,39 @@ public:
}
}
}
+
+ auto opts = Y();
+ if (Table.Options) {
+ if (!Table.Options->Init(ctx, src)) {
+ return false;
+ }
+ opts = Table.Options;
+ }
+
+ opts = L(opts, Q(Y(Q("mode"), Q("create"))));
+
+ THashSet<TString> columnFamilyNames;
+
+ if (Params.ColumnFamilies) {
+ auto columnFamilies = Y();
+ for (const auto& family : Params.ColumnFamilies) {
+ if (!columnFamilyNames.insert(family.Name.Name).second) {
+ ctx.Error(family.Name.Pos) << "Family " << family.Name.Name << " specified more than once";
+ return false;
+ }
+ auto familyDesc = Y();
+ familyDesc = L(familyDesc, Q(Y(Q("name"), BuildQuotedAtom(family.Name.Pos, family.Name.Name))));
+ if (family.Data) {
+ familyDesc = L(familyDesc, Q(Y(Q("data"), family.Data)));
+ }
+ if (family.Compression) {
+ familyDesc = L(familyDesc, Q(Y(Q("compression"), family.Compression)));
+ }
+ columnFamilies = L(columnFamilies, Q(familyDesc));
+ }
+ opts = L(opts, Q(Y(Q("columnFamilies"), Q(columnFamilies))));
+ }
+
auto columns = Y();
for (auto& col : Params.Columns) {
auto columnDesc = Y();
@@ -704,21 +737,16 @@ public:
if (col.Families) {
auto familiesDesc = Y();
for (const auto& family : col.Families) {
+ if (columnFamilyNames.find(family.Name) == columnFamilyNames.end()) {
+ ctx.Error(family.Pos) << "Unknown family " << family.Name;
+ return false;
+ }
familiesDesc = L(familiesDesc, BuildQuotedAtom(family.Pos, family.Name));
}
columnDesc = L(columnDesc, Q(familiesDesc));
}
columns = L(columns, Q(columnDesc));
}
-
- auto opts = Y();
- if (Table.Options) {
- if (!Table.Options->Init(ctx, src)) {
- return false;
- }
- opts = Table.Options;
- }
- opts = L(opts, Q(Y(Q("mode"), Q("create"))));
opts = L(opts, Q(Y(Q("columns"), Q(columns))));
if (Table.Service == RtmrProviderName) {
@@ -771,22 +799,6 @@ public:
opts = L(opts, Q(Y(Q("changefeed"), Q(desc))));
}
- if (Params.ColumnFamilies) {
- auto columnFamilies = Y();
- for (const auto& family : Params.ColumnFamilies) {
- auto familyDesc = Y();
- familyDesc = L(familyDesc, Q(Y(Q("name"), BuildQuotedAtom(family.Name.Pos, family.Name.Name))));
- if (family.Data) {
- familyDesc = L(familyDesc, Q(Y(Q("data"), family.Data)));
- }
- if (family.Compression) {
- familyDesc = L(familyDesc, Q(Y(Q("compression"), family.Compression)));
- }
- columnFamilies = L(columnFamilies, Q(familyDesc));
- }
- opts = L(opts, Q(Y(Q("columnFamilies"), Q(columnFamilies))));
- }
-
if (Params.TableSettings.IsSet()) {
auto settings = Y();