Skip to content

Commit

Permalink
Fix syntax for Column Family (#10781)
Browse files Browse the repository at this point in the history
  • Loading branch information
vlad-gogov authored Oct 25, 2024
1 parent 46f1b29 commit 86223ca
Show file tree
Hide file tree
Showing 5 changed files with 234 additions and 12 deletions.
17 changes: 12 additions & 5 deletions ydb/library/yql/sql/v1/sql_query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2021,22 +2021,29 @@ bool TSqlQuery::AlterTableAlterFamily(const TRule_alter_table_alter_column_famil
<< "' in one alter";
return false;
}
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
entry->Data = BuildLiteralSmartString(Ctx, stringValue);
if (!StoreString(value, entry->Data, Ctx)) {
Ctx.Error() << to_upper(settingName.Name) << " value should be a string literal";
return false;
}
} else if (to_lower(settingName.Name) == "compression") {
if (entry->Compression) {
Ctx.Error() << "Redefinition of 'compression' setting for column family '" << name.Name
<< "' in one alter";
return false;
}
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
entry->Compression = BuildLiteralSmartString(Ctx, stringValue);
if (!StoreString(value, entry->Compression, Ctx)) {
Ctx.Error() << to_upper(settingName.Name) << " value should be a string literal";
return false;
}
} else if (to_lower(settingName.Name) == "compression_level") {
if (entry->CompressionLevel) {
Ctx.Error() << "Redefinition of 'compression_level' setting for column family '" << name.Name << "' in one alter";
return false;
}
entry->CompressionLevel = LiteralNumber(Ctx, value.GetAlt_family_setting_value2().GetRule_integer1());
if (!StoreInt(value, entry->CompressionLevel, Ctx)) {
Ctx.Error() << to_upper(settingName.Name) << " value should be an integer";
return false;
}
} else {
Ctx.Error() << "Unknown table setting: " << settingName.Name;
return false;
Expand Down
52 changes: 47 additions & 5 deletions ydb/library/yql/sql/v1/sql_translation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1567,17 +1567,59 @@ TNodePtr TSqlTranslation::SerialTypeNode(const TRule_type_name_or_bind& node) {
return nullptr;
}

bool StoreString(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx) {
switch (from.Alt_case()) {
case TRule_family_setting_value::kAltFamilySettingValue1: {
// STRING_VALUE
const TString stringValue(ctx.Token(from.GetAlt_family_setting_value1().GetToken1()));
TNodePtr literal = BuildLiteralSmartString(ctx, stringValue);
if (!literal) {
return false;
}
to = literal;
break;
}
default:
return false;
}
return true;
}

bool StoreInt(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx) {
switch (from.Alt_case()) {
case TRule_family_setting_value::kAltFamilySettingValue2: {
// integer
TNodePtr literal = LiteralNumber(ctx, from.GetAlt_family_setting_value2().GetRule_integer1());
if (!literal) {
return false;
}
to = literal;
break;
}
default:
return false;
}
return true;
}

bool TSqlTranslation::FillFamilySettingsEntry(const TRule_family_settings_entry& settingNode, TFamilyEntry& family) {
TIdentifier id = IdEx(settingNode.GetRule_an_id1(), *this);
const TRule_family_setting_value& value = settingNode.GetRule_family_setting_value3();
if (to_lower(id.Name) == "data") {
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
family.Data = BuildLiteralSmartString(Ctx, stringValue);
if (!StoreString(value, family.Data, Ctx)) {
Ctx.Error() << to_upper(id.Name) << " value should be a string literal";
return false;
}
} else if (to_lower(id.Name) == "compression") {
const TString stringValue(Ctx.Token(value.GetAlt_family_setting_value1().GetToken1()));
family.Compression = BuildLiteralSmartString(Ctx, stringValue);
if (!StoreString(value, family.Compression, Ctx)) {
Ctx.Error() << to_upper(id.Name) << " value should be a string literal";
return false;
}
} else if (to_lower(id.Name) == "compression_level") {
family.CompressionLevel = LiteralNumber(Ctx, value.GetAlt_family_setting_value2().GetRule_integer1());
if (!StoreInt(value, family.CompressionLevel, Ctx)) {
Ctx.Error() << to_upper(id.Name) << " value should be an integer";
return false;
}
} else {
Ctx.Error() << "Unknown table setting: " << id.Name;
return false;
Expand Down
3 changes: 3 additions & 0 deletions ydb/library/yql/sql/v1/sql_translation.h
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,9 @@ class TSqlTranslation: public TTranslation {

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

bool StoreString(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx);
bool StoreInt(const TRule_family_setting_value& from, TNodePtr& to, TContext& ctx);

template<typename TChar>
struct TPatternComponent {
TBasicString<TChar> Prefix;
Expand Down
87 changes: 86 additions & 1 deletion ydb/library/yql/sql/v1/sql_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7429,7 +7429,7 @@ Y_UNIT_TEST_SUITE(Restore) {
}

Y_UNIT_TEST_SUITE(ColumnFamily) {
Y_UNIT_TEST(CompressionLevel) {
Y_UNIT_TEST(CompressionLevelCorrectUsage) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
Expand Down Expand Up @@ -7462,4 +7462,89 @@ Y_UNIT_TEST_SUITE(ColumnFamily) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
UNIT_ASSERT_VALUES_EQUAL(2, elementStat["compression_level"]);
}

Y_UNIT_TEST(FieldDataIsNotString) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
PRIMARY KEY (Key),
FAMILY default (
DATA = 1,
COMPRESSION = "lz4",
COMPRESSION_LEVEL = 5
)
);
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "DATA value should be a string literal");
}

Y_UNIT_TEST(FieldCompressionIsNotString) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
PRIMARY KEY (Key),
FAMILY default (
DATA = "test",
COMPRESSION = 2,
COMPRESSION_LEVEL = 5
),
);
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION value should be a string literal");
}

Y_UNIT_TEST(FieldCompressionLevelIsNotInteger) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
PRIMARY KEY (Key),
FAMILY default (
DATA = "test",
COMPRESSION = "lz4",
COMPRESSION_LEVEL = "5"
)
);
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
}

Y_UNIT_TEST(AlterCompressionCorrectUsage) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION "lz4";
)");
UNIT_ASSERT(res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 0);
}

Y_UNIT_TEST(AlterCompressionFieldIsNotString) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION lz4;
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "Unexpected token 'lz4' : cannot match to any predicted input");
}

Y_UNIT_TEST(AlterCompressionLevelCorrectUsage) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL 5;
)");
UNIT_ASSERT(res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 0);
}

Y_UNIT_TEST(AlterCompressionLevelFieldIsNotInteger) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL "5";
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
}
}
87 changes: 86 additions & 1 deletion ydb/library/yql/sql/v1/sql_ut_antlr4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7401,7 +7401,7 @@ Y_UNIT_TEST_SUITE(Restore) {
}

Y_UNIT_TEST_SUITE(ColumnFamily) {
Y_UNIT_TEST(CompressionLevel) {
Y_UNIT_TEST(CompressionLevelCorrectUsage) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
Expand Down Expand Up @@ -7434,4 +7434,89 @@ Y_UNIT_TEST_SUITE(ColumnFamily) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
UNIT_ASSERT_VALUES_EQUAL(2, elementStat["compression_level"]);
}

Y_UNIT_TEST(FieldDataIsNotString) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
PRIMARY KEY (Key),
FAMILY default (
DATA = 1,
COMPRESSION = "lz4",
COMPRESSION_LEVEL = 5
)
);
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "DATA value should be a string literal");
}

Y_UNIT_TEST(FieldCompressionIsNotString) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
PRIMARY KEY (Key),
FAMILY default (
DATA = "test",
COMPRESSION = 2,
COMPRESSION_LEVEL = 5
),
);
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION value should be a string literal");
}

Y_UNIT_TEST(FieldCompressionLevelIsNotInteger) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
CREATE TABLE tableName (
Key Uint32 FAMILY default,
PRIMARY KEY (Key),
FAMILY default (
DATA = "test",
COMPRESSION = "lz4",
COMPRESSION_LEVEL = "5"
)
);
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
}

Y_UNIT_TEST(AlterCompressionCorrectUsage) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION "lz4";
)");
UNIT_ASSERT(res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 0);
}

Y_UNIT_TEST(AlterCompressionFieldIsNotString) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION lz4;
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "mismatched input 'lz4' expecting {STRING_VALUE, DIGITS, INTEGER_VALUE}");
}

Y_UNIT_TEST(AlterCompressionLevelCorrectUsage) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL 5;
)");
UNIT_ASSERT(res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 0);
}

Y_UNIT_TEST(AlterCompressionLevelFieldIsNotInteger) {
NYql::TAstParseResult res = SqlToYql(R"( use plato;
ALTER TABLE tableName ALTER FAMILY default SET COMPRESSION_LEVEL "5";
)");
UNIT_ASSERT(!res.IsOk());
UNIT_ASSERT(res.Issues.Size() == 1);
UNIT_ASSERT_STRING_CONTAINS(res.Issues.ToString(), "COMPRESSION_LEVEL value should be an integer");
}
}

0 comments on commit 86223ca

Please sign in to comment.