mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
Support ALIASed columns in JOIN ON expression
This commit is contained in:
parent
241b64d02c
commit
2949cd1e6f
@ -61,7 +61,7 @@ struct TableWithColumnNamesAndTypes
|
|||||||
names.insert(col.name);
|
names.insert(col.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasColumn(const String & name) const { return names.count(name); }
|
bool hasColumn(const String & name) const { return names.contains(name); }
|
||||||
|
|
||||||
void addHiddenColumns(const NamesAndTypesList & addition)
|
void addHiddenColumns(const NamesAndTypesList & addition)
|
||||||
{
|
{
|
||||||
|
@ -806,7 +806,8 @@ JoinPtr SelectQueryExpressionAnalyzer::appendJoin(ExpressionActionsChain & chain
|
|||||||
}
|
}
|
||||||
|
|
||||||
ExpressionActionsChain::Step & step = chain.lastStep(columns_after_array_join);
|
ExpressionActionsChain::Step & step = chain.lastStep(columns_after_array_join);
|
||||||
chain.steps.push_back(std::make_unique<ExpressionActionsChain::JoinStep>(syntax->analyzed_join, table_join, step.getResultColumns()));
|
chain.steps.push_back(std::make_unique<ExpressionActionsChain::JoinStep>(
|
||||||
|
syntax->analyzed_join, table_join, step.getResultColumns()));
|
||||||
chain.addStep();
|
chain.addStep();
|
||||||
return table_join;
|
return table_join;
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,6 @@
|
|||||||
#include <Interpreters/JoinToSubqueryTransformVisitor.h>
|
#include <Interpreters/JoinToSubqueryTransformVisitor.h>
|
||||||
#include <Interpreters/CrossToInnerJoinVisitor.h>
|
#include <Interpreters/CrossToInnerJoinVisitor.h>
|
||||||
#include <Interpreters/TableJoin.h>
|
#include <Interpreters/TableJoin.h>
|
||||||
#include <Interpreters/JoinSwitcher.h>
|
|
||||||
#include <Interpreters/JoinedTables.h>
|
#include <Interpreters/JoinedTables.h>
|
||||||
#include <Interpreters/OpenTelemetrySpanLog.h>
|
#include <Interpreters/OpenTelemetrySpanLog.h>
|
||||||
#include <Interpreters/QueryAliasesVisitor.h>
|
#include <Interpreters/QueryAliasesVisitor.h>
|
||||||
|
@ -508,14 +508,10 @@ void setJoinStrictness(ASTSelectQuery & select_query, JoinStrictness join_defaul
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Find the columns that are obtained by JOIN.
|
/// Find the columns that are obtained by JOIN.
|
||||||
void collectJoinedColumns(TableJoin & analyzed_join, const ASTSelectQuery & select_query,
|
void collectJoinedColumns(TableJoin & analyzed_join, const ASTTableJoin & table_join,
|
||||||
const TablesWithColumns & tables, const Aliases & aliases)
|
const TablesWithColumns & tables, const Aliases & aliases)
|
||||||
{
|
{
|
||||||
const ASTTablesInSelectQueryElement * node = select_query.join();
|
assert(tables.size() >= 2);
|
||||||
if (!node || tables.size() < 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const auto & table_join = node->table_join->as<ASTTableJoin &>();
|
|
||||||
|
|
||||||
if (table_join.using_expression_list)
|
if (table_join.using_expression_list)
|
||||||
{
|
{
|
||||||
@ -936,7 +932,16 @@ TreeRewriterResultPtr TreeRewriter::analyzeSelect(
|
|||||||
setJoinStrictness(
|
setJoinStrictness(
|
||||||
*select_query, settings.join_default_strictness, settings.any_join_distinct_right_table_keys, result.analyzed_join->table_join);
|
*select_query, settings.join_default_strictness, settings.any_join_distinct_right_table_keys, result.analyzed_join->table_join);
|
||||||
|
|
||||||
collectJoinedColumns(*result.analyzed_join, *select_query, tables_with_columns, result.aliases);
|
if (const auto * join_ast = select_query->join(); join_ast && tables_with_columns.size() >= 2)
|
||||||
|
{
|
||||||
|
auto & table_join_ast = join_ast->table_join->as<ASTTableJoin &>();
|
||||||
|
if (table_join_ast.using_expression_list && result.metadata_snapshot)
|
||||||
|
replaceAliasColumnsInQuery(table_join_ast.using_expression_list, result.metadata_snapshot->getColumns(), result.array_join_result_to_source, getContext());
|
||||||
|
if (table_join_ast.on_expression && result.metadata_snapshot)
|
||||||
|
replaceAliasColumnsInQuery(table_join_ast.on_expression, result.metadata_snapshot->getColumns(), result.array_join_result_to_source, getContext());
|
||||||
|
|
||||||
|
collectJoinedColumns(*result.analyzed_join, table_join_ast, tables_with_columns, result.aliases);
|
||||||
|
}
|
||||||
|
|
||||||
result.aggregates = getAggregates(query, *select_query);
|
result.aggregates = getAggregates(query, *select_query);
|
||||||
result.window_function_asts = getWindowFunctions(query, *select_query);
|
result.window_function_asts = getWindowFunctions(query, *select_query);
|
||||||
|
@ -20,3 +20,5 @@
|
|||||||
-
|
-
|
||||||
fact1t1_val1 fact1t2_val2
|
fact1t1_val1 fact1t2_val2
|
||||||
fact2t1_val2 fact2t1_val2
|
fact2t1_val2 fact2t1_val2
|
||||||
|
-
|
||||||
|
2020-02-02 13:00:00 2020-02-05 13:00:00
|
||||||
|
@ -33,6 +33,5 @@ SELECT '-';
|
|||||||
SELECT * FROM t1 JOIN t2 ON t1.foo = t2.bar WHERE t2.aliascol2 == 'fact2t1_val2';
|
SELECT * FROM t1 JOIN t2 ON t1.foo = t2.bar WHERE t2.aliascol2 == 'fact2t1_val2';
|
||||||
SELECT '-';
|
SELECT '-';
|
||||||
SELECT t1.aliascol1, t2.aliascol2 FROM t1 JOIN t2 ON t1.foo = t2.bar ORDER BY t1.time, t2.time;
|
SELECT t1.aliascol1, t2.aliascol2 FROM t1 JOIN t2 ON t1.foo = t2.bar ORDER BY t1.time, t2.time;
|
||||||
-- SELECT '-';
|
SELECT '-';
|
||||||
-- SELECT * FROM t1 JOIN t2 ON t1.aliascol1 = t2.aliascol2 ORDER BY t1.time, t2.time;
|
SELECT t1.time, t2.time FROM t1 JOIN t2 ON t1.aliascol1 = t2.aliascol2 ORDER BY t1.time, t2.time;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user