mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Set default value cross_to_inner_join_rewrite = 2 for comma join
This commit is contained in:
parent
acb1fa53ed
commit
10e4ef135d
@ -758,7 +758,7 @@ static constexpr UInt64 operator""_GiB(unsigned long long value)
|
||||
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(UInt64, cross_to_inner_join_rewrite, 1, "Use inner join instead of comma/cross join if possible. Possible values: 0 - no rewrite, 1 - apply if possible, 2 - force rewrite all cross joins", 0) \
|
||||
M(UInt64, cross_to_inner_join_rewrite, 2, "Use inner join instead of comma/cross join if possible. Possible values: 0 - no rewrite, 1 - apply if possible for comma/cross, 2 - force rewrite all comma joins, cross - if possible", 0) \
|
||||
\
|
||||
M(Bool, output_format_arrow_low_cardinality_as_dictionary, false, "Enable output LowCardinality type as Dictionary Arrow type", 0) \
|
||||
M(Bool, output_format_arrow_string_as_string, false, "Use Arrow String type instead of Binary for String columns", 0) \
|
||||
|
@ -39,7 +39,10 @@ struct JoinedElement
|
||||
: element(table_element)
|
||||
{
|
||||
if (element.table_join)
|
||||
{
|
||||
join = element.table_join->as<ASTTableJoin>();
|
||||
original_kind = join->kind;
|
||||
}
|
||||
}
|
||||
|
||||
void checkTableName(const DatabaseAndTableWithAlias & table, const String & current_database) const
|
||||
@ -61,6 +64,8 @@ struct JoinedElement
|
||||
join->kind = ASTTableJoin::Kind::Cross;
|
||||
}
|
||||
|
||||
ASTTableJoin::Kind getOriginalKind() const { return original_kind; }
|
||||
|
||||
bool rewriteCrossToInner(ASTPtr on_expression)
|
||||
{
|
||||
if (join->kind != ASTTableJoin::Kind::Cross)
|
||||
@ -83,6 +88,8 @@ struct JoinedElement
|
||||
private:
|
||||
const ASTTablesInSelectQueryElement & element;
|
||||
ASTTableJoin * join = nullptr;
|
||||
|
||||
ASTTableJoin::Kind original_kind;
|
||||
};
|
||||
|
||||
bool isAllowedToRewriteCrossJoin(const ASTPtr & node, const Aliases & aliases)
|
||||
@ -251,10 +258,17 @@ void CrossToInnerJoinMatcher::visit(ASTSelectQuery & select, ASTPtr &, Data & da
|
||||
}
|
||||
}
|
||||
|
||||
if (data.cross_to_inner_join_rewrite > 1 && !rewritten)
|
||||
if (joined.getOriginalKind() == ASTTableJoin::Kind::Comma &&
|
||||
data.cross_to_inner_join_rewrite > 1 &&
|
||||
!rewritten)
|
||||
{
|
||||
throw Exception(ErrorCodes::INCORRECT_QUERY, "Failed to rewrite '{} WHERE {}' to INNER JOIN",
|
||||
query_before, queryToString(select.where()));
|
||||
throw Exception(
|
||||
ErrorCodes::INCORRECT_QUERY,
|
||||
"Failed to rewrite comma join to INNER. "
|
||||
"Please, try to simplify WHERE section "
|
||||
"or set the setting `cross_to_inner_join_rewrite` to 1 to allow slow CROSS JOIN for this case"
|
||||
"(cannot rewrite '{} WHERE {}' to INNER JOIN)",
|
||||
query_before, queryToString(select.where()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,7 @@
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
@ -0,0 +1,22 @@
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
|
||||
CREATE TABLE t1 ( x Int ) Engine = Memory;
|
||||
INSERT INTO t1 VALUES ( 1 ), ( 2 ), ( 3 );
|
||||
|
||||
CREATE TABLE t2 ( x Int ) Engine = Memory;
|
||||
INSERT INTO t2 VALUES ( 2 ), ( 3 ), ( 4 );
|
||||
|
||||
SET cross_to_inner_join_rewrite = 1;
|
||||
SELECT count() = 1 FROM t1, t2 WHERE t1.x > t2.x;
|
||||
SELECT count() = 1 2ROM t1, t2 WHERE t1.x = t2.x;
|
||||
SELECT count() = 1 2ROM t1 CROSS JOIN t2 WHERE t1.x = t2.x;
|
||||
SELECT count() = 1 FROM t1 CROSS JOIN t2 WHERE t1.x > t2.x;
|
||||
|
||||
SET cross_to_inner_join_rewrite = 2;
|
||||
SELECT count() = 1 FROM t1, t2 WHERE t1.x > t2.x; -- { serverError INCORRECT_QUERY }
|
||||
SELECT count() = 2 FROM t1, t2 WHERE t1.x = t2.x;
|
||||
SELECT count() = 2 FROM t1 CROSS JOIN t2 WHERE t1.x = t2.x;
|
||||
SELECT count() = 1 FROM t1 CROSS JOIN t2 WHERE t1.x > t2.x; -- do not force rewrite explicit CROSS
|
Loading…
Reference in New Issue
Block a user