summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/proto_parser
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-10-01 20:51:41 +0300
committervitya-smirnov <[email protected]>2025-10-01 21:25:50 +0300
commitf3f7b33a285e94cb3e27aaa4d9b23b543ece4106 (patch)
tree89740eeddb803123f1ed3d6b6f7be2bcd865f68c /yql/essentials/sql/v1/proto_parser
parent5cfb01d33937d2b2e038abf3b50e04136dcf7496 (diff)
YQL-20307: Support inline subqueries
- Alter grammar to support inline subqueries. - Support inline subqueries in `sql/v1` (translator). - Introduce `sql/v1/proto_ast/parse_tree.h` for reusable parse tree predicates. - Support inline subqueries in `sql/v1/format`. - Support inline subqueries in `sql/v1/complete`. - Add some SQL-tests. - Pass all tests. commit_hash:075b2240778d071e1c7542f912d3cc83019ef849
Diffstat (limited to 'yql/essentials/sql/v1/proto_parser')
-rw-r--r--yql/essentials/sql/v1/proto_parser/parse_tree.cpp110
-rw-r--r--yql/essentials/sql/v1/proto_parser/parse_tree.h17
-rw-r--r--yql/essentials/sql/v1/proto_parser/ya.make3
3 files changed, 129 insertions, 1 deletions
diff --git a/yql/essentials/sql/v1/proto_parser/parse_tree.cpp b/yql/essentials/sql/v1/proto_parser/parse_tree.cpp
new file mode 100644
index 00000000000..a9318368436
--- /dev/null
+++ b/yql/essentials/sql/v1/proto_parser/parse_tree.cpp
@@ -0,0 +1,110 @@
+#include "parse_tree.h"
+
+namespace NSQLTranslationV1 {
+
+ const TRule_select_or_expr* GetSelectOrExpr(const TRule_smart_parenthesis& msg) {
+ if (!msg.GetBlock2().HasAlt1()) {
+ return nullptr;
+ }
+
+ return &msg.GetBlock2()
+ .GetAlt1()
+ .GetRule_select_subexpr1()
+ .GetRule_select_subexpr_intersect1()
+ .GetRule_select_or_expr1();
+ }
+
+ const TRule_tuple_or_expr* GetTupleOrExpr(const TRule_smart_parenthesis& msg) {
+ const auto* select_or_expr = GetSelectOrExpr(msg);
+ if (!select_or_expr) {
+ return nullptr;
+ }
+
+ if (!select_or_expr->HasAlt_select_or_expr2()) {
+ return nullptr;
+ }
+
+ return &select_or_expr
+ ->GetAlt_select_or_expr2()
+ .GetRule_tuple_or_expr1();
+ }
+
+ const TRule_smart_parenthesis* GetParenthesis(const TRule_expr& msg) {
+ if (!msg.HasAlt_expr1()) {
+ return nullptr;
+ }
+
+ const auto& con = msg.GetAlt_expr1()
+ .GetRule_or_subexpr1()
+ .GetRule_and_subexpr1()
+ .GetRule_xor_subexpr1()
+ .GetRule_eq_subexpr1()
+ .GetRule_neq_subexpr1()
+ .GetRule_bit_subexpr1()
+ .GetRule_add_subexpr1()
+ .GetRule_mul_subexpr1()
+ .GetRule_con_subexpr1();
+
+ if (!con.HasAlt_con_subexpr1()) {
+ return nullptr;
+ }
+
+ const auto& unary_subexpr = con.GetAlt_con_subexpr1()
+ .GetRule_unary_subexpr1();
+
+ if (!unary_subexpr.HasAlt_unary_subexpr1()) {
+ return nullptr;
+ }
+
+ const auto& block = unary_subexpr.GetAlt_unary_subexpr1()
+ .GetRule_unary_casual_subexpr1()
+ .GetBlock1();
+
+ if (!block.HasAlt2()) {
+ return nullptr;
+ }
+
+ const auto& atom = block.GetAlt2()
+ .GetRule_atom_expr1();
+
+ if (!atom.HasAlt_atom_expr3()) {
+ return nullptr;
+ }
+
+ return &atom.GetAlt_atom_expr3()
+ .GetRule_lambda1()
+ .GetRule_smart_parenthesis1();
+ }
+
+ bool IsSelect(const TRule_smart_parenthesis& msg) {
+ const auto* select_or_expr = GetSelectOrExpr(msg);
+ if (!select_or_expr) {
+ return false;
+ }
+
+ if (select_or_expr->HasAlt_select_or_expr1()) {
+ return true;
+ }
+
+ return IsSelect(
+ select_or_expr
+ ->GetAlt_select_or_expr2()
+ .GetRule_tuple_or_expr1()
+ .GetRule_expr1());
+ }
+
+ bool IsSelect(const TRule_expr& msg) {
+ const auto* parenthesis = GetParenthesis(msg);
+ if (!parenthesis) {
+ return false;
+ }
+
+ return IsSelect(*parenthesis);
+ }
+
+ bool IsOnlySubExpr(const TRule_select_subexpr& node) {
+ return node.GetBlock2().size() == 0 &&
+ node.GetRule_select_subexpr_intersect1().GetBlock2().size() == 0;
+ }
+
+} // namespace NSQLTranslationV1
diff --git a/yql/essentials/sql/v1/proto_parser/parse_tree.h b/yql/essentials/sql/v1/proto_parser/parse_tree.h
new file mode 100644
index 00000000000..74936d90466
--- /dev/null
+++ b/yql/essentials/sql/v1/proto_parser/parse_tree.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <yql/essentials/parser/proto_ast/gen/v1_proto_split/SQLv1Parser.pb.main.h>
+
+namespace NSQLTranslationV1 {
+
+ using namespace NSQLv1Generated;
+
+ const TRule_tuple_or_expr* GetTupleOrExpr(const TRule_smart_parenthesis& msg);
+
+ bool IsSelect(const TRule_smart_parenthesis& msg);
+
+ bool IsSelect(const TRule_expr& msg);
+
+ bool IsOnlySubExpr(const TRule_select_subexpr& msg);
+
+} // namespace NSQLTranslationV1
diff --git a/yql/essentials/sql/v1/proto_parser/ya.make b/yql/essentials/sql/v1/proto_parser/ya.make
index d87741f8a91..0fbe9f45469 100644
--- a/yql/essentials/sql/v1/proto_parser/ya.make
+++ b/yql/essentials/sql/v1/proto_parser/ya.make
@@ -3,9 +3,11 @@ LIBRARY()
PEERDIR(
yql/essentials/utils
yql/essentials/parser/proto_ast/collect_issues
+ yql/essentials/parser/proto_ast/gen/v1_proto_split
)
SRCS(
+ parse_tree.cpp
proto_parser.cpp
)
@@ -17,4 +19,3 @@ RECURSE(
antlr4
antlr4_ansi
)
-