summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/complete/analysis/global/column.cpp
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/complete/analysis/global/column.cpp
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/complete/analysis/global/column.cpp')
-rw-r--r--yql/essentials/sql/v1/complete/analysis/global/column.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/yql/essentials/sql/v1/complete/analysis/global/column.cpp b/yql/essentials/sql/v1/complete/analysis/global/column.cpp
index 3f71ae6763d..d8c73e00b7f 100644
--- a/yql/essentials/sql/v1/complete/analysis/global/column.cpp
+++ b/yql/essentials/sql/v1/complete/analysis/global/column.cpp
@@ -295,6 +295,30 @@ namespace NSQLComplete {
const TNamedNodes* Nodes_;
};
+ class TEnclosingSelectVisitor: public TSQLv1NarrowingVisitor {
+ public:
+ explicit TEnclosingSelectVisitor(const TParsedInput& input)
+ : TSQLv1NarrowingVisitor(input)
+ {
+ }
+
+ std::any visitSelect_core(SQLv1::Select_coreContext* ctx) override {
+ if (!IsEnclosing(ctx)) {
+ return {};
+ }
+
+ Enclosing_ = ctx;
+ return visitChildren(ctx);
+ }
+
+ SQLv1::Select_coreContext* GetEnclosing() && {
+ return Enclosing_;
+ }
+
+ private:
+ SQLv1::Select_coreContext* Enclosing_ = nullptr;
+ };
+
class TVisitor: public TSQLv1NarrowingVisitor {
public:
TVisitor(const TParsedInput& input, const TNamedNodes* nodes)
@@ -343,11 +367,23 @@ namespace NSQLComplete {
const TNamedNodes* Nodes_;
};
+ antlr4::ParserRuleContext* Enclosing(const TParsedInput& input) {
+ TEnclosingSelectVisitor visitor(input);
+ visitor.visit(input.SqlQuery);
+
+ antlr4::ParserRuleContext* ctx = std::move(visitor).GetEnclosing();
+ if (!ctx) {
+ ctx = input.SqlQuery;
+ }
+
+ return ctx;
+ }
+
} // namespace
TMaybe<TColumnContext> InferColumnContext(TParsedInput input, const TNamedNodes& nodes) {
// TODO: add utility `auto ToMaybe<T>(std::any any) -> TMaybe<T>`
- std::any result = TVisitor(input, &nodes).visit(input.SqlQuery);
+ std::any result = TVisitor(input, &nodes).visit(Enclosing(input));
if (!result.has_value()) {
return Nothing();
}