diff options
author | aneporada <[email protected]> | 2022-07-27 19:56:52 +0300 |
---|---|---|
committer | aneporada <[email protected]> | 2022-07-27 19:56:52 +0300 |
commit | 560e255bda77be9fcc7ea91e81a7d61dd4842412 (patch) | |
tree | b81a08a6247483f0abbf3c0ec06e9675bad757b0 | |
parent | 08dd5dd0d88c58d1572d4b0f17b1e066c7b09ff0 (diff) |
[] Support optional EQUALS after WITH SCHEMA
-rw-r--r-- | ydb/library/yql/sql/v1/SQLv1.g.in | 4 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql.cpp | 12 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql_ut.cpp | 6 |
3 files changed, 14 insertions, 8 deletions
diff --git a/ydb/library/yql/sql/v1/SQLv1.g.in b/ydb/library/yql/sql/v1/SQLv1.g.in index 7385be22530..36f9b7a3f15 100644 --- a/ydb/library/yql/sql/v1/SQLv1.g.in +++ b/ydb/library/yql/sql/v1/SQLv1.g.in @@ -580,8 +580,8 @@ 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 | 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 + | (SCHEMA | COLUMNS) EQUALS? type_name_or_bind + | SCHEMA EQUALS? LPAREN (struct_arg_positional (COMMA struct_arg_positional)*)? COMMA? RPAREN ; simple_table_ref: (((cluster_expr DOT)? id_or_at) | AT? bind_parameter) table_hints?; diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp index 4dae6fe8a52..1945b734f23 100644 --- a/ydb/library/yql/sql/v1/sql.cpp +++ b/ydb/library/yql/sql/v1/sql.cpp @@ -3004,8 +3004,8 @@ 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 | 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 + // | (SCHEMA | COLUMNS) EQUALS? type_name_or_bind + // | SCHEMA EQUALS? LPAREN (struct_arg_positional (COMMA struct_arg_positional)*)? COMMA? RPAREN switch (rule.Alt_case()) { case TRule_table_hint::kAltTableHint1: { const auto& alt = rule.GetAlt_table_hint1(); @@ -3039,7 +3039,7 @@ bool TSqlTranslation::TableHintImpl(const TRule_table_hint& rule, TTableHints& h case TRule_table_hint::kAltTableHint2: { const auto& alt2 = rule.GetAlt_table_hint2(); - auto node = TypeNodeOrBind(alt2.GetRule_type_name_or_bind2()); + auto node = TypeNodeOrBind(alt2.GetRule_type_name_or_bind3()); if (!node) { return false; } @@ -3052,7 +3052,7 @@ bool TSqlTranslation::TableHintImpl(const TRule_table_hint& rule, TTableHints& h const auto& alt = rule.GetAlt_table_hint3(); TVector<TNodePtr> labels; TVector<TNodePtr> structTypeItems; - if (alt.HasBlock3()) { + if (alt.HasBlock4()) { bool warn = false; auto processItem = [&](const TRule_struct_arg_positional& arg) { // struct_arg_positional: @@ -3087,11 +3087,11 @@ bool TSqlTranslation::TableHintImpl(const TRule_table_hint& rule, TTableHints& h return true; }; - if (!processItem(alt.GetBlock3().GetRule_struct_arg_positional1())) { + if (!processItem(alt.GetBlock4().GetRule_struct_arg_positional1())) { return false; } - for (auto& entry : alt.GetBlock3().GetBlock2()) { + for (auto& entry : alt.GetBlock4().GetBlock2()) { if (!processItem(entry.GetRule_struct_arg_positional2())) { return false; } diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp index 6de785df3e5..dbe336b2616 100644 --- a/ydb/library/yql/sql/v1/sql_ut.cpp +++ b/ydb/library/yql/sql/v1/sql_ut.cpp @@ -1662,6 +1662,12 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) { UNIT_ASSERT(SqlToYql("$ true = false; SELECT $ true or false;").IsOk()); UNIT_ASSERT(SqlToYql("$False = 0; SELECT $False;").IsOk()); } + + Y_UNIT_TEST(WithSchemaEquals) { + UNIT_ASSERT(SqlToYql("select * from plato.T with schema Struct<a:Int32, b:String>;").IsOk()); + UNIT_ASSERT(SqlToYql("select * from plato.T with columns = Struct<a:Int32, b:String>;").IsOk()); + UNIT_ASSERT(SqlToYql("select * from plato.T with (format=csv_with_names, schema=(year Int32, month String, day String, a Utf8, b Uint16));").IsOk()); + } } Y_UNIT_TEST_SUITE(ExternalFunction) { |