aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Neporada <neporada@gmail.com>2022-06-20 18:08:45 +0300
committerAndrey Neporada <neporada@gmail.com>2022-06-20 18:08:45 +0300
commitfd3445c72ca663535f1751d07711f3b86cb19073 (patch)
tree43b3ab6355264261bae5acb09d076a4de3917046
parentd3c3071e6d9055951691edcccbc30b86a2c0a800 (diff)
downloadydb-fd3445c72ca663535f1751d07711f3b86cb19073.tar.gz
[YQL-14969] Extend table_hint grammar to allow multiple hint values (needed for partitioned_by=(a, b, c))
ref:55e33bcd89cd6d24e8b749fb5b4b522dfebaa6a8
-rw-r--r--ydb/library/yql/sql/v1/SQLv1.g.in2
-rw-r--r--ydb/library/yql/sql/v1/sql.cpp18
2 files changed, 17 insertions, 3 deletions
diff --git a/ydb/library/yql/sql/v1/SQLv1.g.in b/ydb/library/yql/sql/v1/SQLv1.g.in
index 5408a7ca84..e8b1cf9df2 100644
--- a/ydb/library/yql/sql/v1/SQLv1.g.in
+++ b/ydb/library/yql/sql/v1/SQLv1.g.in
@@ -577,7 +577,7 @@ table_key: id_table_or_type (VIEW an_id)?;
table_arg: AT? named_expr (VIEW an_id)?;
table_hints: WITH (table_hint | LPAREN table_hint (COMMA table_hint)* RPAREN);
table_hint:
- an_id_hint (EQUALS type_name_tag)?
+ an_id_hint (EQUALS (type_name_tag | LPAREN type_name_tag (COMMA type_name_tag)* COMMA? RPAREN))?
| (SCHEMA | COLUMNS) type_name_or_bind
| SCHEMA LPAREN (struct_arg_positional (COMMA struct_arg_positional)*)? COMMA? RPAREN
;
diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp
index d1b9efb359..fad322c787 100644
--- a/ydb/library/yql/sql/v1/sql.cpp
+++ b/ydb/library/yql/sql/v1/sql.cpp
@@ -2948,7 +2948,7 @@ TNodePtr TSqlTranslation::StructLiteral(const TRule_struct_literal& node) {
bool TSqlTranslation::TableHintImpl(const TRule_table_hint& rule, TTableHints& hints) {
// table_hint:
- // an_id_hint (EQUALS type_name_tag)?
+ // an_id_hint (EQUALS (type_name_tag | LPAREN type_name_tag (COMMA type_name_tag)* COMMA? RPAREN))?
// | (SCHEMA | COLUMNS) type_name_or_bind
// | SCHEMA LPAREN (struct_arg_positional (COMMA struct_arg_positional)*)? COMMA? RPAREN
switch (rule.Alt_case()) {
@@ -2962,7 +2962,21 @@ bool TSqlTranslation::TableHintImpl(const TRule_table_hint& rule, TTableHints& h
}
TVector<TNodePtr> hint_val;
if (alt.HasBlock2()) {
- hint_val.push_back(TypeNameTag(alt.GetBlock2().GetRule_type_name_tag2()));
+ auto& tags = alt.GetBlock2().GetBlock2();
+ switch (tags.Alt_case()) {
+ case TRule_table_hint_TAlt1_TBlock2_TBlock2::kAlt1:
+ hint_val.push_back(TypeNameTag(tags.GetAlt1().GetRule_type_name_tag1()));
+ break;
+ case TRule_table_hint_TAlt1_TBlock2_TBlock2::kAlt2: {
+ hint_val.push_back(TypeNameTag(tags.GetAlt2().GetRule_type_name_tag2()));
+ for (auto& tag : tags.GetAlt2().GetBlock3()) {
+ hint_val.push_back(TypeNameTag(tag.GetRule_type_name_tag2()));
+ }
+ break;
+ }
+ default:
+ Y_FAIL("You should change implementation according to grammar changes");
+ }
}
hints[id] = hint_val;
break;