summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <[email protected]>2022-07-27 19:56:52 +0300
committeraneporada <[email protected]>2022-07-27 19:56:52 +0300
commit560e255bda77be9fcc7ea91e81a7d61dd4842412 (patch)
treeb81a08a6247483f0abbf3c0ec06e9675bad757b0
parent08dd5dd0d88c58d1572d4b0f17b1e066c7b09ff0 (diff)
[] Support optional EQUALS after WITH SCHEMA
-rw-r--r--ydb/library/yql/sql/v1/SQLv1.g.in4
-rw-r--r--ydb/library/yql/sql/v1/sql.cpp12
-rw-r--r--ydb/library/yql/sql/v1/sql_ut.cpp6
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) {