Skip to content

Commit 86223ca

Browse files
author
Vladislav Gogov
authored
Fix syntax for Column Family (#10781)
1 parent 46f1b29 commit 86223ca

File tree

5 files changed

+234
-12
lines changed

5 files changed

+234
-12
lines changed

ydb/library/yql/sql/v1/sql_query.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,22 +2021,29 @@ bool TSqlQuery::AlterTableAlterFamily(const TRule_alter_table_alter_column_famil
20212021
<< "' in one alter";
20222022
return false;
20232023
}
2024-
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
2025-
entry->Data = BuildLiteralSmartString(Ctx, stringValue);
2024+
if (!StoreString(value, entry->Data, Ctx)) {
2025+
Ctx.Error() << to_upper(settingName.Name) << " value should be a string literal";
2026+
return false;
2027+
}
20262028
} else if (to_lower(settingName.Name) == "compression") {
20272029
if (entry->Compression) {
20282030
Ctx.Error() << "Redefinition of 'compression' setting for column family '" << name.Name
20292031
<< "' in one alter";
20302032
return false;
20312033
}
2032-
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
2033-
entry->Compression = BuildLiteralSmartString(Ctx, stringValue);
2034+
if (!StoreString(value, entry->Compression, Ctx)) {
2035+
Ctx.Error() << to_upper(settingName.Name) << " value should be a string literal";
2036+
return false;
2037+
}
20342038
} else if (to_lower(settingName.Name) == "compression_level") {
20352039
if (entry->CompressionLevel) {
20362040
Ctx.Error() << "Redefinition of 'compression_level' setting for column family '" << name.Name << "' in one alter";
20372041
return false;
20382042
}
2039-
entry->CompressionLevel = LiteralNumber(Ctx, value.GetAlt_family_setting_value2().GetRule_integer1());
2043+
if (!StoreInt(value, entry->CompressionLevel, Ctx)) {
2044+
Ctx.Error() << to_upper(settingName.Name) << " value should be an integer";
2045+
return false;
2046+
}
20402047
} else {
20412048
Ctx.Error() << "Unknown table setting: " << settingName.Name;
20422049
return false;

ydb/library/yql/sql/v1/sql_translation.cpp

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,17 +1567,59 @@ TNodePtr TSqlTranslation::SerialTypeNode(const TRule_type_name_or_bind& node) {
15671567
return nullptr;
15681568
}
15691569

1570+
bool StoreString(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx) {
1571+
switch (from.Alt_case()) {
1572+
case TRule_family_setting_value::kAltFamilySettingValue1: {
1573+
// STRING_VALUE
1574+
const TString stringValue(ctx.Token(from.GetAlt_family_setting_value1().GetToken1()));
1575+
TNodePtr literal = BuildLiteralSmartString(ctx, stringValue);
1576+
if (!literal) {
1577+
return false;
1578+
}
1579+
to = literal;
1580+
break;
1581+
}
1582+
default:
1583+
return false;
1584+
}
1585+
return true;
1586+
}
1587+
1588+
bool StoreInt(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx) {
1589+
switch (from.Alt_case()) {
1590+
case TRule_family_setting_value::kAltFamilySettingValue2: {
1591+
// integer
1592+
TNodePtr literal = LiteralNumber(ctx, from.GetAlt_family_setting_value2().GetRule_integer1());
1593+
if (!literal) {
1594+
return false;
1595+
}
1596+
to = literal;
1597+
break;
1598+
}
1599+
default:
1600+
return false;
1601+
}
1602+
return true;
1603+
}
1604+
15701605
bool TSqlTranslation::FillFamilySettingsEntry(const TRule_family_settings_entry& settingNode, TFamilyEntry& family) {
15711606
TIdentifier id = IdEx(settingNode.GetRule_an_id1(), *this);
15721607
const TRule_family_setting_value& value = settingNode.GetRule_family_setting_value3();
15731608
if (to_lower(id.Name) == "data") {
1574-
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
1575-
family.Data = BuildLiteralSmartString(Ctx, stringValue);
1609+
if (!StoreString(value, family.Data, Ctx)) {
1610+
Ctx.Error() << to_upper(id.Name) << " value should be a string literal";
1611+
return false;
1612+
}
15761613
} else if (to_lower(id.Name) == "compression") {
1577-
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
1578-
family.Compression = BuildLiteralSmartString(Ctx, stringValue);
1614+
if (!StoreString(value, family.Compression, Ctx)) {
1615+
Ctx.Error() << to_upper(id.Name) << " value should be a string literal";
1616+
return false;
1617+
}
15791618
} else if (to_lower(id.Name) == "compression_level") {
1580-
family.CompressionLevel = LiteralNumber(Ctx, value.GetAlt_family_setting_value2().GetRule_integer1());
1619+
if (!StoreInt(value, family.CompressionLevel, Ctx)) {
1620+
Ctx.Error() << to_upper(id.Name) << " value should be an integer";
1621+
return false;
1622+
}
15811623
} else {
15821624
Ctx.Error() << "Unknown table setting: " << id.Name;
15831625
return false;

ydb/library/yql/sql/v1/sql_translation.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ class TSqlTranslation: public TTranslation {
287287

288288
TNodePtr LiteralNumber(TContext& ctx, const TRule_integer& node);
289289

290+
bool StoreString(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx);
291+
bool StoreInt(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx);
292+
290293
template<typename TChar>
291294
struct TPatternComponent {
292295
TBasicString<TChar> Prefix;

ydb/library/yql/sql/v1/sql_ut.cpp

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7429,7 +7429,7 @@ Y_UNIT_TEST_SUITE(Restore) {
74297429
}
74307430

74317431
Y_UNIT_TEST_SUITE(ColumnFamily) {
7432-
Y_UNIT_TEST(CompressionLevel) {
7432+
Y_UNIT_TEST(CompressionLevelCorrectUsage) {
74337433
NYql::TAstParseResult res = SqlToYql(R"( use plato;
74347434
CREATE TABLE tableName (
74357435
Key Uint32 FAMILY default,
@@ -7462,4 +7462,89 @@ Y_UNIT_TEST_SUITE(ColumnFamily) {
74627462
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
74637463
UNIT_ASSERT_VALUES_EQUAL(2, elementStat["compression_level"]);
74647464
}
7465+
7466+
Y_UNIT_TEST(FieldDataIsNotString) {
7467+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7468+
CREATE TABLE tableName (
7469+
Key Uint32 FAMILY default,
7470+
PRIMARY KEY (Key),
7471+
FAMILY default (
7472+
DATA = 1,
7473+
COMPRESSION = "lz4",
7474+
COMPRESSION_LEVEL = 5
7475+
)
7476+
);
7477+
)");
7478+
UNIT_ASSERT(!res.IsOk());
7479+
UNIT_ASSERT(res.Issues.Size() == 1);
7480+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "DATA value should be a string literal");
7481+
}
7482+
7483+
Y_UNIT_TEST(FieldCompressionIsNotString) {
7484+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7485+
CREATE TABLE tableName (
7486+
Key Uint32 FAMILY default,
7487+
PRIMARY KEY (Key),
7488+
FAMILY default (
7489+
DATA = "test",
7490+
COMPRESSION = 2,
7491+
COMPRESSION_LEVEL = 5
7492+
),
7493+
);
7494+
)");
7495+
UNIT_ASSERT(!res.IsOk());
7496+
UNIT_ASSERT(res.Issues.Size() == 1);
7497+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION value should be a string literal");
7498+
}
7499+
7500+
Y_UNIT_TEST(FieldCompressionLevelIsNotInteger) {
7501+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7502+
CREATE TABLE tableName (
7503+
Key Uint32 FAMILY default,
7504+
PRIMARY KEY (Key),
7505+
FAMILY default (
7506+
DATA = "test",
7507+
COMPRESSION = "lz4",
7508+
COMPRESSION_LEVEL = "5"
7509+
)
7510+
);
7511+
)");
7512+
UNIT_ASSERT(!res.IsOk());
7513+
UNIT_ASSERT(res.Issues.Size() == 1);
7514+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
7515+
}
7516+
7517+
Y_UNIT_TEST(AlterCompressionCorrectUsage) {
7518+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7519+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION "lz4";
7520+
)");
7521+
UNIT_ASSERT(res.IsOk());
7522+
UNIT_ASSERT(res.Issues.Size() == 0);
7523+
}
7524+
7525+
Y_UNIT_TEST(AlterCompressionFieldIsNotString) {
7526+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7527+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION lz4;
7528+
)");
7529+
UNIT_ASSERT(!res.IsOk());
7530+
UNIT_ASSERT(res.Issues.Size() == 1);
7531+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "Unexpected token 'lz4' : cannot match to any predicted input");
7532+
}
7533+
7534+
Y_UNIT_TEST(AlterCompressionLevelCorrectUsage) {
7535+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7536+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL 5;
7537+
)");
7538+
UNIT_ASSERT(res.IsOk());
7539+
UNIT_ASSERT(res.Issues.Size() == 0);
7540+
}
7541+
7542+
Y_UNIT_TEST(AlterCompressionLevelFieldIsNotInteger) {
7543+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7544+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL "5";
7545+
)");
7546+
UNIT_ASSERT(!res.IsOk());
7547+
UNIT_ASSERT(res.Issues.Size() == 1);
7548+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
7549+
}
74657550
}

ydb/library/yql/sql/v1/sql_ut_antlr4.cpp

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7401,7 +7401,7 @@ Y_UNIT_TEST_SUITE(Restore) {
74017401
}
74027402

74037403
Y_UNIT_TEST_SUITE(ColumnFamily) {
7404-
Y_UNIT_TEST(CompressionLevel) {
7404+
Y_UNIT_TEST(CompressionLevelCorrectUsage) {
74057405
NYql::TAstParseResult res = SqlToYql(R"( use plato;
74067406
CREATE TABLE tableName (
74077407
Key Uint32 FAMILY default,
@@ -7434,4 +7434,89 @@ Y_UNIT_TEST_SUITE(ColumnFamily) {
74347434
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
74357435
UNIT_ASSERT_VALUES_EQUAL(2, elementStat["compression_level"]);
74367436
}
7437+
7438+
Y_UNIT_TEST(FieldDataIsNotString) {
7439+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7440+
CREATE TABLE tableName (
7441+
Key Uint32 FAMILY default,
7442+
PRIMARY KEY (Key),
7443+
FAMILY default (
7444+
DATA = 1,
7445+
COMPRESSION = "lz4",
7446+
COMPRESSION_LEVEL = 5
7447+
)
7448+
);
7449+
)");
7450+
UNIT_ASSERT(!res.IsOk());
7451+
UNIT_ASSERT(res.Issues.Size() == 1);
7452+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "DATA value should be a string literal");
7453+
}
7454+
7455+
Y_UNIT_TEST(FieldCompressionIsNotString) {
7456+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7457+
CREATE TABLE tableName (
7458+
Key Uint32 FAMILY default,
7459+
PRIMARY KEY (Key),
7460+
FAMILY default (
7461+
DATA = "test",
7462+
COMPRESSION = 2,
7463+
COMPRESSION_LEVEL = 5
7464+
),
7465+
);
7466+
)");
7467+
UNIT_ASSERT(!res.IsOk());
7468+
UNIT_ASSERT(res.Issues.Size() == 1);
7469+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION value should be a string literal");
7470+
}
7471+
7472+
Y_UNIT_TEST(FieldCompressionLevelIsNotInteger) {
7473+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7474+
CREATE TABLE tableName (
7475+
Key Uint32 FAMILY default,
7476+
PRIMARY KEY (Key),
7477+
FAMILY default (
7478+
DATA = "test",
7479+
COMPRESSION = "lz4",
7480+
COMPRESSION_LEVEL = "5"
7481+
)
7482+
);
7483+
)");
7484+
UNIT_ASSERT(!res.IsOk());
7485+
UNIT_ASSERT(res.Issues.Size() == 1);
7486+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
7487+
}
7488+
7489+
Y_UNIT_TEST(AlterCompressionCorrectUsage) {
7490+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7491+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION "lz4";
7492+
)");
7493+
UNIT_ASSERT(res.IsOk());
7494+
UNIT_ASSERT(res.Issues.Size() == 0);
7495+
}
7496+
7497+
Y_UNIT_TEST(AlterCompressionFieldIsNotString) {
7498+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7499+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION lz4;
7500+
)");
7501+
UNIT_ASSERT(!res.IsOk());
7502+
UNIT_ASSERT(res.Issues.Size() == 1);
7503+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "mismatched input 'lz4' expecting {STRING_VALUE, DIGITS, INTEGER_VALUE}");
7504+
}
7505+
7506+
Y_UNIT_TEST(AlterCompressionLevelCorrectUsage) {
7507+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7508+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL 5;
7509+
)");
7510+
UNIT_ASSERT(res.IsOk());
7511+
UNIT_ASSERT(res.Issues.Size() == 0);
7512+
}
7513+
7514+
Y_UNIT_TEST(AlterCompressionLevelFieldIsNotInteger) {
7515+
NYql::TAstParseResult res = SqlToYql(R"( use plato;
7516+
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL "5";
7517+
)");
7518+
UNIT_ASSERT(!res.IsOk());
7519+
UNIT_ASSERT(res.Issues.Size() == 1);
7520+
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
7521+
}
74377522
}

0 commit comments

Comments
 (0)