diff options
author | Alexander Smirnov <alex@ydb.tech> | 2025-04-05 00:51:48 +0000 |
---|---|---|
committer | Alexander Smirnov <alex@ydb.tech> | 2025-04-05 00:51:48 +0000 |
commit | d34888289f736d7643a7a33ec004d206c3a3779c (patch) | |
tree | 04b5f6884e3e3722955c2dbf050e4cc4511dedf3 /yql/essentials/udfs | |
parent | 826d25293818e6931deb20b8763948059bd9b6fe (diff) | |
parent | f6a0289bf403b681ad1dae577b47b70575e6afe7 (diff) | |
download | ydb-d34888289f736d7643a7a33ec004d206c3a3779c.tar.gz |
Merge branch 'rightlib' into merge-libs-250405-0050
Diffstat (limited to 'yql/essentials/udfs')
6 files changed, 272 insertions, 0 deletions
diff --git a/yql/essentials/udfs/language/yql/test/canondata/result.json b/yql/essentials/udfs/language/yql/test/canondata/result.json index 0fb3474a34..38975dcc8d 100644 --- a/yql/essentials/udfs/language/yql/test/canondata/result.json +++ b/yql/essentials/udfs/language/yql/test/canondata/result.json @@ -14,11 +14,21 @@ "uri": "file://test.test_ExtractInFuncs_/results.txt" } ], + "test.test[ExtractInsertHints]": [ + { + "uri": "file://test.test_ExtractInsertHints_/results.txt" + } + ], "test.test[ExtractPragmas]": [ { "uri": "file://test.test_ExtractPragmas_/results.txt" } ], + "test.test[ExtractReadHints]": [ + { + "uri": "file://test.test_ExtractReadHints_/results.txt" + } + ], "test.test[ExtractTypes]": [ { "uri": "file://test.test_ExtractTypes_/results.txt" diff --git a/yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractInsertHints_/results.txt b/yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractInsertHints_/results.txt new file mode 100644 index 0000000000..508b8a7a8b --- /dev/null +++ b/yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractInsertHints_/results.txt @@ -0,0 +1,104 @@ +[ + { + "Write" = [ + { + "Type" = [ + "ListType"; + [ + "StructType"; + [ + [ + "q"; + [ + "DataType"; + "String" + ] + ]; + [ + "column1"; + [ + "OptionalType"; + [ + "ListType"; + [ + "TupleType"; + [ + [ + "DataType"; + "String" + ]; + [ + "DataType"; + "String" + ]; + [ + "DataType"; + "Uint64" + ] + ] + ] + ] + ] + ] + ] + ] + ]; + "Data" = [ + [ + "insert into plato.foo with (truncate,user_attrs='{}') select 1"; + [ + [ + [ + "INSERT_HINT"; + "truncate"; + "1" + ]; + [ + "INSERT_HINT"; + "user_attrs"; + "1" + ] + ] + ] + ]; + [ + "insert into plato.foo with columns struct<a:int32> select 1"; + [ + [ + [ + "INSERT_HINT"; + "columns"; + "1" + ] + ] + ] + ]; + [ + "insert into plato.foo with schema(a int32) select 1"; + [ + [ + [ + "INSERT_HINT"; + "schema"; + "1" + ] + ] + ] + ]; + [ + "insert into plato.foo with truncate select 1"; + [ + [ + [ + "INSERT_HINT"; + "truncate"; + "1" + ] + ] + ] + ] + ] + } + ] + } +]
\ No newline at end of file diff --git a/yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractReadHints_/results.txt b/yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractReadHints_/results.txt new file mode 100644 index 0000000000..3d747a3010 --- /dev/null +++ b/yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractReadHints_/results.txt @@ -0,0 +1,80 @@ +[ + { + "Write" = [ + { + "Type" = [ + "ListType"; + [ + "StructType"; + [ + [ + "q"; + [ + "DataType"; + "String" + ] + ]; + [ + "column1"; + [ + "OptionalType"; + [ + "ListType"; + [ + "TupleType"; + [ + [ + "DataType"; + "String" + ]; + [ + "DataType"; + "String" + ]; + [ + "DataType"; + "Uint64" + ] + ] + ] + ] + ] + ] + ] + ] + ]; + "Data" = [ + [ + "select * from foo.bar with (inline, infer_scheme)"; + [ + [ + [ + "READ_HINT"; + "infer_scheme"; + "1" + ]; + [ + "READ_HINT"; + "inline"; + "1" + ] + ] + ] + ]; + [ + "select * from foo.bar with xlock"; + [ + [ + [ + "READ_HINT"; + "xlock"; + "1" + ] + ] + ] + ] + ] + } + ] + } +]
\ No newline at end of file diff --git a/yql/essentials/udfs/language/yql/test/cases/ExtractInsertHints.sql b/yql/essentials/udfs/language/yql/test/cases/ExtractInsertHints.sql new file mode 100644 index 0000000000..6037435eed --- /dev/null +++ b/yql/essentials/udfs/language/yql/test/cases/ExtractInsertHints.sql @@ -0,0 +1,9 @@ +SELECT + q,ListSort(ListFilter(YqlLang::RuleFreq(q),($x)->($x.0 in ("INSERT_HINT")))) +FROM (VALUES + ("insert into plato.foo with truncate select 1"), + ("insert into plato.foo with schema(a int32) select 1"), + ("insert into plato.foo with columns struct<a:int32> select 1"), + ("insert into plato.foo with (truncate,user_attrs='{}') select 1") +) AS a(q) +order by q diff --git a/yql/essentials/udfs/language/yql/test/cases/ExtractReadHints.sql b/yql/essentials/udfs/language/yql/test/cases/ExtractReadHints.sql new file mode 100644 index 0000000000..1e64bfb10b --- /dev/null +++ b/yql/essentials/udfs/language/yql/test/cases/ExtractReadHints.sql @@ -0,0 +1,7 @@ +SELECT + q,ListSort(ListFilter(YqlLang::RuleFreq(q),($x)->($x.0 in ("READ_HINT")))) +FROM (VALUES + ("select * from foo.bar with xlock"), + ("select * from foo.bar with (inline, infer_scheme)") +) AS a(q) +order by q diff --git a/yql/essentials/udfs/language/yql/yql_language_udf.cpp b/yql/essentials/udfs/language/yql/yql_language_udf.cpp index f5df852d81..6460031a6a 100644 --- a/yql/essentials/udfs/language/yql/yql_language_udf.cpp +++ b/yql/essentials/udfs/language/yql/yql_language_udf.cpp @@ -47,6 +47,10 @@ public: VisitSimpleType(dynamic_cast<const TRule_type_name_simple&>(msg)); } else if (descr == TRule_pragma_stmt::GetDescriptor()) { VisitPragmaStmt(dynamic_cast<const TRule_pragma_stmt&>(msg)); + } else if (descr == TRule_into_simple_table_ref::GetDescriptor()) { + VisitInsertTableRef(dynamic_cast<const TRule_into_simple_table_ref&>(msg)); + } else if (descr == TRule_table_ref::GetDescriptor()) { + VisitReadTableRef(dynamic_cast<const TRule_table_ref&>(msg)); } TStringBuf fullName = descr->full_name(); @@ -93,6 +97,64 @@ private: Freqs[std::make_pair("PRAGMA", prefix.empty() ? pragma : (prefix + "." + pragma))] += 1; } + void VisitHint(const TRule_table_hint& msg, const TString& parent) { + switch (msg.Alt_case()) { + case TRule_table_hint::kAltTableHint1: { + const auto& alt = msg.GetAlt_table_hint1(); + const TString id = Id(alt.GetRule_an_id_hint1(), Translation); + Freqs[std::make_pair(parent, id)] += 1; + break; + } + case TRule_table_hint::kAltTableHint2: { + const auto& alt = msg.GetAlt_table_hint2(); + Freqs[std::make_pair(parent, alt.GetToken1().GetValue())] += 1; + break; + } + case TRule_table_hint::kAltTableHint3: { + const auto& alt = msg.GetAlt_table_hint3(); + Freqs[std::make_pair(parent, alt.GetToken1().GetValue())] += 1; + break; + } + case TRule_table_hint::ALT_NOT_SET: + return; + } + } + + void VisitHints(const TRule_table_hints& msg, const TString& parent) { + auto& block = msg.GetBlock2(); + switch (block.Alt_case()) { + case TRule_table_hints::TBlock2::kAlt1: { + VisitHint(block.GetAlt1().GetRule_table_hint1(), parent); + break; + } + case TRule_table_hints::TBlock2::kAlt2: { + VisitHint(block.GetAlt2().GetRule_table_hint2(), parent); + for (const auto& x : block.GetAlt2().GetBlock3()) { + VisitHint(x.GetRule_table_hint2(), parent); + } + + break; + } + case TRule_table_hints::TBlock2::ALT_NOT_SET: + return; + } + } + + void VisitReadTableRef(const TRule_table_ref& msg) { + if (msg.HasBlock4()) { + const auto& hints = msg.GetBlock4().GetRule_table_hints1(); + VisitHints(hints, "READ_HINT"); + } + } + + void VisitInsertTableRef(const TRule_into_simple_table_ref& msg) { + const auto& tableRef = msg.GetRule_simple_table_ref1(); + if (tableRef.HasBlock2()) { + const auto& hints = tableRef.GetBlock2().GetRule_table_hints1(); + VisitHints(hints, "INSERT_HINT"); + } + } + template<typename TUnaryCasualExprRule> void VisitUnaryCasualSubexpr(const TUnaryCasualExprRule& msg) { const auto& block = msg.GetBlock1(); |