diff options
| author | vitya-smirnov <[email protected]> | 2025-10-01 20:51:41 +0300 |
|---|---|---|
| committer | vitya-smirnov <[email protected]> | 2025-10-01 21:25:50 +0300 |
| commit | f3f7b33a285e94cb3e27aaa4d9b23b543ece4106 (patch) | |
| tree | 89740eeddb803123f1ed3d6b6f7be2bcd865f68c /yql/essentials/sql/v1/proto_parser | |
| parent | 5cfb01d33937d2b2e038abf3b50e04136dcf7496 (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.cpp | 110 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/proto_parser/parse_tree.h | 17 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/proto_parser/ya.make | 3 |
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 ) - |
