mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-29 13:10:48 +00:00
Add option cross_to_inner_join_rewrite
This commit is contained in:
parent
ed9d49abc3
commit
9afa6b5b1b
@ -503,6 +503,7 @@ class IColumn;
|
||||
M(Bool, output_format_write_statistics, true, "Write statistics about read rows, bytes, time elapsed in suitable output formats.", 0) \
|
||||
M(Bool, output_format_pretty_row_numbers, false, "Add row numbers before each row for pretty output format", 0) \
|
||||
M(Bool, insert_distributed_one_random_shard, false, "If setting is enabled, inserting into distributed table will choose a random shard to write when there is no sharding key", 0) \
|
||||
M(Bool, cross_to_inner_join_rewrite, true, "Use inner join instead of comma/cross join if possible", 0) \
|
||||
|
||||
|
||||
// End of FORMAT_FACTORY_SETTINGS
|
||||
|
@ -326,21 +326,21 @@ void CrossToInnerJoinMatcher::visit(ASTSelectQuery & select, ASTPtr &, Data & da
|
||||
|
||||
/// CROSS to INNER
|
||||
|
||||
if (!select.where())
|
||||
return;
|
||||
|
||||
std::map<size_t, std::vector<ASTPtr>> asts_to_join_on;
|
||||
bool can_move_where = canMoveExpressionToJoinOn(
|
||||
select.where(), joined_tables, data.tables_with_columns, data.aliases, asts_to_join_on);
|
||||
if (can_move_where)
|
||||
if (select.where() && data.cross_to_inner_join_rewrite)
|
||||
{
|
||||
for (size_t i = 1; i < joined_tables.size(); ++i)
|
||||
std::map<size_t, std::vector<ASTPtr>> asts_to_join_on;
|
||||
bool can_move_where
|
||||
= canMoveExpressionToJoinOn(select.where(), joined_tables, data.tables_with_columns, data.aliases, asts_to_join_on);
|
||||
if (can_move_where)
|
||||
{
|
||||
const auto & expr_it = asts_to_join_on.find(i);
|
||||
if (expr_it != asts_to_join_on.end())
|
||||
for (size_t i = 1; i < joined_tables.size(); ++i)
|
||||
{
|
||||
if (joined_tables[i].rewriteCrossToInner(makeOnExpression(expr_it->second)))
|
||||
data.done = true;
|
||||
const auto & expr_it = asts_to_join_on.find(i);
|
||||
if (expr_it != asts_to_join_on.end())
|
||||
{
|
||||
if (joined_tables[i].rewriteCrossToInner(makeOnExpression(expr_it->second)))
|
||||
data.done = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ public:
|
||||
const Aliases & aliases;
|
||||
const String current_database;
|
||||
bool done = false;
|
||||
bool cross_to_inner_join_rewrite = true;
|
||||
};
|
||||
|
||||
static bool needChildVisit(ASTPtr &, const ASTPtr &);
|
||||
|
@ -197,7 +197,7 @@ static Context getSubqueryContext(const Context & context)
|
||||
return subquery_context;
|
||||
}
|
||||
|
||||
static void rewriteMultipleJoins(ASTPtr & query, const TablesWithColumns & tables, const String & database)
|
||||
static void rewriteMultipleJoins(ASTPtr & query, const TablesWithColumns & tables, const String & database, const Settings & settings)
|
||||
{
|
||||
ASTSelectQuery & select = query->as<ASTSelectQuery &>();
|
||||
|
||||
@ -207,6 +207,7 @@ static void rewriteMultipleJoins(ASTPtr & query, const TablesWithColumns & table
|
||||
QueryAliasesNoSubqueriesVisitor(aliases).visit(select.select());
|
||||
|
||||
CrossToInnerJoinVisitor::Data cross_to_inner{tables, aliases, database};
|
||||
cross_to_inner.cross_to_inner_join_rewrite = settings.cross_to_inner_join_rewrite;
|
||||
CrossToInnerJoinVisitor(cross_to_inner).visit(query);
|
||||
|
||||
JoinToSubqueryTransformVisitor::Data join_to_subs_data{tables, aliases};
|
||||
@ -324,7 +325,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
/// Rewrite JOINs
|
||||
if (!has_input && joined_tables.tablesCount() > 1)
|
||||
{
|
||||
rewriteMultipleJoins(query_ptr, joined_tables.tablesWithColumns(), context->getCurrentDatabase());
|
||||
rewriteMultipleJoins(query_ptr, joined_tables.tablesWithColumns(), context->getCurrentDatabase(), context->getSettingsRef());
|
||||
|
||||
joined_tables.reset(getSelectQuery());
|
||||
joined_tables.resolveTables();
|
||||
|
Loading…
Reference in New Issue
Block a user