summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/complete/analysis/global/column.cpp
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-07-02 13:22:58 +0300
committervitya-smirnov <[email protected]>2025-07-02 13:34:13 +0300
commitd92bd641fb97e9b3768d08a5b3a98d444d827b2c (patch)
treec6d4228bc5965f4df9e2468e8ad608528b9e91da /yql/essentials/sql/v1/complete/analysis/global/column.cpp
parentdbe1b39bd441dc9ae17f4d4879ce1b3f36000157 (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.cpp26
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