diff options
| author | vvvv <[email protected]> | 2025-04-04 18:42:43 +0300 |
|---|---|---|
| committer | vvvv <[email protected]> | 2025-04-04 19:00:06 +0300 |
| commit | 62045f253ad96c258a072f749c708e65b2bebad3 (patch) | |
| tree | cdf701c7cc7b3907bcd26ad24a0c0878a0cdcc50 /yql/essentials/udfs | |
| parent | 34ff7e5c11971367d7c69dab1e65352c21e79a8f (diff) | |
YQL-19747 insert hint freq
commit_hash:01de471fe936ed3f2cd62c15676f8497b764edde
Diffstat (limited to 'yql/essentials/udfs')
4 files changed, 168 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 0fb3474a34c..4742a53519b 100644 --- a/yql/essentials/udfs/language/yql/test/canondata/result.json +++ b/yql/essentials/udfs/language/yql/test/canondata/result.json @@ -14,6 +14,11 @@ "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" 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 00000000000..508b8a7a8bc --- /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/cases/ExtractInsertHints.sql b/yql/essentials/udfs/language/yql/test/cases/ExtractInsertHints.sql new file mode 100644 index 00000000000..6037435eed2 --- /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/yql_language_udf.cpp b/yql/essentials/udfs/language/yql/yql_language_udf.cpp index f5df852d818..dc24dab03bd 100644 --- a/yql/essentials/udfs/language/yql/yql_language_udf.cpp +++ b/yql/essentials/udfs/language/yql/yql_language_udf.cpp @@ -47,6 +47,8 @@ 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)); } TStringBuf fullName = descr->full_name(); @@ -93,6 +95,54 @@ 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 VisitInsertTableRef(const TRule_into_simple_table_ref& msg) { + const TString parent = "INSERT_HINT"; + const auto& tableRef = msg.GetRule_simple_table_ref1(); + if (tableRef.HasBlock2()) { + const auto& hints = tableRef.GetBlock2().GetRule_table_hints1(); + auto& block = hints.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; + } + } + } + template<typename TUnaryCasualExprRule> void VisitUnaryCasualSubexpr(const TUnaryCasualExprRule& msg) { const auto& block = msg.GetBlock1(); |
