aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2025-04-05 00:51:48 +0000
committerAlexander Smirnov <alex@ydb.tech>2025-04-05 00:51:48 +0000
commitd34888289f736d7643a7a33ec004d206c3a3779c (patch)
tree04b5f6884e3e3722955c2dbf050e4cc4511dedf3 /yql/essentials/udfs
parent826d25293818e6931deb20b8763948059bd9b6fe (diff)
parentf6a0289bf403b681ad1dae577b47b70575e6afe7 (diff)
downloadydb-d34888289f736d7643a7a33ec004d206c3a3779c.tar.gz
Merge branch 'rightlib' into merge-libs-250405-0050
Diffstat (limited to 'yql/essentials/udfs')
-rw-r--r--yql/essentials/udfs/language/yql/test/canondata/result.json10
-rw-r--r--yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractInsertHints_/results.txt104
-rw-r--r--yql/essentials/udfs/language/yql/test/canondata/test.test_ExtractReadHints_/results.txt80
-rw-r--r--yql/essentials/udfs/language/yql/test/cases/ExtractInsertHints.sql9
-rw-r--r--yql/essentials/udfs/language/yql/test/cases/ExtractReadHints.sql7
-rw-r--r--yql/essentials/udfs/language/yql/yql_language_udf.cpp62
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();