diff options
author | pnv1 <pnv1@yandex-team.ru> | 2022-03-02 14:30:11 +0300 |
---|---|---|
committer | pnv1 <pnv1@yandex-team.ru> | 2022-03-02 14:30:11 +0300 |
commit | ccdb20e53d6374ff382bbffadfc1fdec4d676384 (patch) | |
tree | 8c8c68cc0e786478fe2274db30494a98c2ac466d | |
parent | 46a460ae54f37547e2c9e789c301816538c15bd7 (diff) | |
download | ydb-ccdb20e53d6374ff382bbffadfc1fdec4d676384.tar.gz |
Add family constraints and tests, YQL-14377
ref:f27316972c81b8cd1b60e3c4908a8dc68118ec5f
-rw-r--r-- | ydb/core/kqp/ut/kqp_scheme_ut.cpp | 71 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/query.cpp | 62 |
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(); |