mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-16 03:12:43 +00:00
96f2a46a66
The problem with the initial implementation #52653 was:
- OR can have multiple arguments
- It simply not correct to assume that if there are two arguments this is OK.
Consider the following example:
"WHERE (column_not_from_partition_by = 1) OR false OR false"
Will be converted to:
"WHERE false OR false"
And it will simply read nothing.
Yes, we could apply some optimization for bool, but this will not always
work, since to optimize things like "0 = 1" we need to execute it.
And the only way to make handle this correctly (with ability to ignore
some commands during filtering) is to make is_constant() function return
has it use something from the input block, so that we can be sure, that
we have some sensible, and not just "false".
Plus we cannot simply ignore the difference of the input and output
arguments of handling OR, we need to add always-true (1/true) if the
size is different, since otherwise it could break invariants (see
comment in the code).
This includes (but not limited to):
- _part* filtering for MergeTree
- _path/_file for various File/HDFS/... engines
- _table for Merge
- ...
P.S. analyzer does not have this bug, since it execute expression as
whole, and this is what filterBlockWithQuery() should do actually
instead, but this will be a more complex patch.
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
(cherry picked from commit b107712e0c
)
15 lines
478 B
Plaintext
15 lines
478 B
Plaintext
-- { echoOn }
|
|
SELECT * FROM or_bug WHERE (key = 1) OR false OR false;
|
|
1
|
|
SELECT * FROM or_bug WHERE (key = 1) OR false;
|
|
1
|
|
SELECT * FROM or_bug WHERE (key = 1);
|
|
1
|
|
-- { echoOn }
|
|
select * from forms where text_field like '%this%' or 0 = 1 or 0 = 1;
|
|
5840ead423829c1eab29fa97 this is a test
|
|
select * from forms where text_field like '%this%' or 0 = 1;
|
|
5840ead423829c1eab29fa97 this is a test
|
|
select * from forms where text_field like '%this%';
|
|
5840ead423829c1eab29fa97 this is a test
|