Skip to content

Commit 7f10d1c

Browse files
authored
fix(query): fix find_leveled_eq_filters works with not in (#18334)
* fix(query): fix find_leveled_eq_filters works with not in * fix(query): fix find_leveled_eq_filters works with not in * fix(query): fix find_leveled_eq_filters works with not in
1 parent 4556bd0 commit 7f10d1c

File tree

3 files changed

+59
-25
lines changed

3 files changed

+59
-25
lines changed

src/query/expression/src/utils/filter_helper.rs

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,42 +63,50 @@ impl FilterHelpers {
6363
values.dedup();
6464

6565
let mut results = Vec::with_capacity(values.len());
66+
let mut invalid_results = Vec::with_capacity(values.len());
6667

6768
if !values.is_empty() {
6869
for value in values.iter() {
69-
// replace eq with false
70-
let expr =
71-
expr.replace_function_literals("eq", &mut |col_name, scalar, func| {
72-
if col_name.name() == *name {
73-
if scalar == value {
74-
let data_type = func.function.signature.return_type.clone();
75-
Some(Expr::Constant(Constant {
76-
span: None,
77-
scalar: Scalar::Boolean(false),
78-
data_type,
79-
}))
70+
// replace eq with false, true
71+
for (idx, t) in [false, true].iter().enumerate() {
72+
let expr =
73+
expr.replace_function_literals("eq", &mut |col_name, scalar, func| {
74+
if col_name.name() == *name {
75+
if scalar == value {
76+
let data_type = func.function.signature.return_type.clone();
77+
Some(Expr::Constant(Constant {
78+
span: None,
79+
scalar: Scalar::Boolean(*t),
80+
data_type,
81+
}))
82+
} else {
83+
// for other values, we just ignore it
84+
None
85+
}
8086
} else {
81-
// for other values, we just ignore it
87+
// for other columns, we just ignore it
8288
None
8389
}
84-
} else {
85-
// for other columns, we just ignore it
86-
None
87-
}
88-
});
90+
});
8991

90-
let (folded_expr, _) = ConstantFolder::fold(&expr, func_ctx, fn_registry);
92+
let (folded_expr, _) = ConstantFolder::fold(&expr, func_ctx, fn_registry);
9193

92-
if let Expr::Constant(Constant {
93-
scalar: Scalar::Boolean(false),
94-
..
95-
}) = folded_expr
96-
{
97-
results.push(value.clone());
94+
if let Expr::Constant(Constant {
95+
scalar: Scalar::Boolean(false),
96+
..
97+
}) = folded_expr
98+
{
99+
if idx == 0 {
100+
results.push(value.clone());
101+
} else {
102+
// may contains negative values
103+
invalid_results.push(value.clone());
104+
}
105+
}
98106
}
99107
}
100108

101-
// let's check if it contains or for other columns
109+
values.retain(|v| !invalid_results.contains(v));
102110
if results.is_empty() && !values.is_empty() {
103111
let mut results_all_used = true;
104112
// let's check or function that
@@ -117,6 +125,7 @@ impl FilterHelpers {
117125
}
118126
}
119127
});
128+
120129
if results_all_used {
121130
results = values;
122131
}

src/query/functions/tests/it/type_check.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,21 @@ fn test_find_leveled_eq_filters() {
220220
],
221221
vec![],
222222
),
223+
224+
(
225+
"not (database = 'default')",
226+
vec![],
227+
vec![],
228+
vec![],
229+
),
230+
231+
232+
(
233+
"not (database = 'default' or database = 'abcd')",
234+
vec![],
235+
vec![],
236+
vec![],
237+
),
223238
];
224239

225240
let cols = vec![

tests/sqllogictests/suites/base/01_system/01_0001_system_tables.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ t b
5050
t c
5151
t100 c
5252

53+
query T
54+
select count() > 0 from system.tables where database not in ('system', 'default');
55+
----
56+
1
57+
58+
query T
59+
select count() > 0 from system.tables where database not in ('default');
60+
----
61+
1
62+
5363
query T
5464
select name, database from system.tables where database='c' or name ='t' or name like 't10%' order by name, database;
5565
----

0 commit comments

Comments
 (0)