diff options
author | vitya-smirnov <[email protected]> | 2025-06-25 18:07:35 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-06-25 18:20:11 +0300 |
commit | 84acd92b6733ab01d0c4c2c2d1363bb8bc66ccd3 (patch) | |
tree | ae766140f07526027c9a195542c14f778f9220e2 /yql/essentials/sql/v1/complete/analysis/global/global.cpp | |
parent | d938279fd3d2184ca254c4abefc6bad994083876 (diff) |
YQL-19747: Support qualified asterisk
Support `SELECT x.* FROM t AS x`.
commit_hash:64693f65281f385d6c0d3541fb2874b0153aa88c
Diffstat (limited to 'yql/essentials/sql/v1/complete/analysis/global/global.cpp')
-rw-r--r-- | yql/essentials/sql/v1/complete/analysis/global/global.cpp | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/yql/essentials/sql/v1/complete/analysis/global/global.cpp b/yql/essentials/sql/v1/complete/analysis/global/global.cpp index 555d5283c14..f11447c1f12 100644 --- a/yql/essentials/sql/v1/complete/analysis/global/global.cpp +++ b/yql/essentials/sql/v1/complete/analysis/global/global.cpp @@ -19,21 +19,38 @@ namespace NSQLComplete { return std::tie(lhs.TableAlias, lhs.Name) < std::tie(rhs.TableAlias, rhs.Name); } - TVector<TAliased<TTableId>> TColumnContext::TablesWithAlias(TStringBuf alias) const { - if (alias.empty()) { - return TVector<TAliased<TTableId>>(Tables.begin(), Tables.end()); + TColumnContext TColumnContext::ExtractAliased(TMaybe<TStringBuf> alias) { + if (alias.Empty()) { + return *this; } - auto filtered = NFuncTools::Filter([&](const auto& x) { return x.Alias == alias; }, Tables); - return TVector<TAliased<TTableId>>(filtered.begin(), filtered.end()); + auto aliasedTables = std::ranges::partition(Tables, [&](const auto& table) { + return table.Alias != alias; + }); + + auto aliasedColumns = std::ranges::partition(Columns, [&](const auto& column) { + return column.TableAlias != alias; + }); + + TVector<TAliased<TTableId>> tables(aliasedTables.begin(), aliasedTables.end()); + TVector<TColumnId> columns(aliasedColumns.begin(), aliasedColumns.end()); + + Tables.erase(aliasedTables.begin(), aliasedTables.end()); + Columns.erase(aliasedColumns.begin(), aliasedColumns.end()); + + return { + .Tables = std::move(tables), + .Columns = std::move(columns), + }; } bool TColumnContext::IsAsterisk() const { - return Columns.size() == 1 && Columns[0].Name == "*"; + return Columns.size() == 1 && + Columns[0].TableAlias.empty() && + Columns[0].Name == "*"; } TColumnContext TColumnContext::Renamed(TStringBuf alias) && { - Y_ENSURE(!alias.empty()); for (TAliased<TTableId>& table : Tables) { table.Alias = alias; } @@ -152,6 +169,12 @@ namespace NSQLComplete { } } + void DebugPrint(TStringBuf query, antlr4::ParserRuleContext* ctx) { + Cerr << "= = = = = = " << Endl; + Cerr << query << Endl; + Cerr << ctx->toStringTree(&Parser_, true) << Endl; + } + antlr4::ANTLRInputStream Chars_; G::TLexer Lexer_; antlr4::CommonTokenStream Tokens_; |