summaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-04-04 18:42:43 +0300
committervvvv <[email protected]>2025-04-04 19:00:06 +0300
commit62045f253ad96c258a072f749c708e65b2bebad3 (patch)
treecdf701c7cc7b3907bcd26ad24a0c0878a0cdcc50 /yql/essentials/udfs
parent34ff7e5c11971367d7c69dab1e65352c21e79a8f (diff)
YQL-19747 insert hint freq
commit_hash:01de471fe936ed3f2cd62c15676f8497b764edde
Diffstat (limited to 'yql/essentials/udfs')
-rw-r--r--yql/essentials/udfs/language/yql/test/canondata/result.json5
-rw-r--r--yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractInsertHints_/results.txt104
-rw-r--r--yql/essentials/udfs/language/yql/test/cases/ExtractInsertHints.sql9
-rw-r--r--yql/essentials/udfs/language/yql/yql_language_udf.cpp50
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();