diff options
author | vitya-smirnov <[email protected]> | 2025-07-02 13:22:58 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-07-02 13:34:13 +0300 |
commit | d92bd641fb97e9b3768d08a5b3a98d444d827b2c (patch) | |
tree | c6d4228bc5965f4df9e2468e8ad608528b9e91da /yql/essentials/sql/v1/complete/analysis/global/column.cpp | |
parent | dbe1b39bd441dc9ae17f4d4879ce1b3f36000157 (diff) |
YQL-19747: Support JOIN ON, WHERE, GROUP/ORDER BY
Before this patch we completed columns only at
SELECT projection. Now we complete it at these
constructions. Also it respects visibility rules.
commit_hash:aa1e6d4900e9b032801ddbf3bcd347750c2939b1
Diffstat (limited to 'yql/essentials/sql/v1/complete/analysis/global/column.cpp')
-rw-r--r-- | yql/essentials/sql/v1/complete/analysis/global/column.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/yql/essentials/sql/v1/complete/analysis/global/column.cpp b/yql/essentials/sql/v1/complete/analysis/global/column.cpp index 5cecb40fb13..527871bfdbf 100644 --- a/yql/essentials/sql/v1/complete/analysis/global/column.cpp +++ b/yql/essentials/sql/v1/complete/analysis/global/column.cpp @@ -130,7 +130,12 @@ namespace NSQLComplete { TColumnContext imported; for (const TColumnId& qualified : asterisks) { - auto aliased = source.ExtractAliased(qualified.TableAlias); + TMaybe<TStringBuf> alias = qualified.TableAlias; + if (alias->Empty()) { + alias = Nothing(); + } + + auto aliased = source.ExtractAliased(alias); imported = std::move(imported) | std::move(aliased); } @@ -233,16 +238,29 @@ namespace NSQLComplete { } std::any visitSelect_core(SQLv1::Select_coreContext* ctx) override { - SQLv1::Join_sourceContext* source = ctx->join_source(0); - if (source == nullptr) { - source = ctx->join_source(1); + antlr4::ParserRuleContext* source = nullptr; + if (IsEnclosingStrict(ctx->expr(0)) || + IsEnclosingStrict(ctx->group_by_clause()) || + IsEnclosingStrict(ctx->expr(1)) || + IsEnclosingStrict(ctx->window_clause()) || + IsEnclosingStrict(ctx->ext_order_by_clause())) { + source = ctx; + } else { + source = ctx->join_source(0); + source = source == nullptr ? ctx->join_source(1) : source; } + if (source == nullptr) { return {}; } return TInferenceVisitor().visit(source); } + + private: + bool IsEnclosingStrict(antlr4::ParserRuleContext* ctx) const { + return ctx != nullptr && IsEnclosing(ctx); + } }; } // namespace |