Skip to content

Commit 2deabee

Browse files
authored
feat(query): add settings enable_selector_executor (#18434)
1 parent 58e8483 commit 2deabee

File tree

7 files changed

+62
-40
lines changed

7 files changed

+62
-40
lines changed

src/query/expression/src/filter/filter_executor.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use databend_common_exception::Result;
1919

2020
use crate::filter::SelectExpr;
2121
use crate::filter::Selector;
22+
use crate::types::BooleanType;
2223
use crate::ColumnSet;
2324
use crate::DataBlock;
2425
use crate::Evaluator;
@@ -40,6 +41,8 @@ pub struct FilterExecutor {
4041
selection_range: Vec<Range<u32>>,
4142
fn_registry: &'static FunctionRegistry,
4243
keep_order: bool,
44+
45+
filter: Expr,
4346
}
4447

4548
impl FilterExecutor {
@@ -59,6 +62,7 @@ impl FilterExecutor {
5962
} else {
6063
vec![]
6164
};
65+
6266
Self {
6367
select_expr,
6468
func_ctx,
@@ -70,14 +74,24 @@ impl FilterExecutor {
7074
selection_range: vec![],
7175
fn_registry,
7276
keep_order,
77+
filter: expr,
7378
}
7479
}
7580

7681
// Filter a DataBlock, return the filtered DataBlock.
7782
pub fn filter(&mut self, data_block: DataBlock) -> Result<DataBlock> {
78-
let origin_count = data_block.num_rows();
79-
let result_count = self.select(&data_block)?;
80-
self.take(data_block, origin_count, result_count)
83+
if self.func_ctx.enable_selector_executor {
84+
let origin_count = data_block.num_rows();
85+
let result_count = self.select(&data_block)?;
86+
self.take(data_block, origin_count, result_count)
87+
} else {
88+
let evaluator = Evaluator::new(&data_block, &self.func_ctx, self.fn_registry);
89+
let filter = evaluator
90+
.run(&self.filter)?
91+
.try_downcast::<BooleanType>()
92+
.unwrap();
93+
data_block.filter_boolean_value(&filter)
94+
}
8195
}
8296

8397
// Store the filtered indices of data_block in `true_selection` and return the number of filtered indices.

src/query/expression/src/function.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ pub struct FunctionContext {
161161
pub now: Zoned,
162162
pub rounding_mode: bool,
163163
pub disable_variant_check: bool,
164+
pub enable_selector_executor: bool,
164165

165166
pub openai_api_chat_base_url: String,
166167
pub openai_api_embedding_base_url: String,
@@ -184,6 +185,7 @@ impl Default for FunctionContext {
184185
now: Default::default(),
185186
rounding_mode: false,
186187
disable_variant_check: false,
188+
enable_selector_executor: true,
187189
openai_api_chat_base_url: "".to_string(),
188190
openai_api_embedding_base_url: "".to_string(),
189191
openai_api_key: "".to_string(),

src/query/service/src/sessions/query_ctx.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,7 @@ impl TableContext for QueryContext {
10141014
tz,
10151015
rounding_mode,
10161016
disable_variant_check,
1017+
enable_selector_executor: settings.get_enable_selector_executor()?,
10171018

10181019
openai_api_key: query_config.openai_api_key.clone(),
10191020
openai_api_version: query_config.openai_api_version.clone(),

src/query/settings/src/settings_default.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,13 @@ impl DefaultSettings {
11921192
scope: SettingScope::Both,
11931193
range: Some(SettingRange::Numeric(0..=1)),
11941194
}),
1195+
("enable_selector_executor", DefaultSettingValue {
1196+
value: UserSettingValue::UInt64(1),
1197+
desc: "Enables selector executor for filter expression",
1198+
mode: SettingMode::Both,
1199+
scope: SettingScope::Both,
1200+
range: Some(SettingRange::Numeric(0..=1)),
1201+
}),
11951202
("dynamic_sample_time_budget_ms", DefaultSettingValue {
11961203
value: UserSettingValue::UInt64(0),
11971204
desc: "Time budget for dynamic sample in milliseconds",

src/query/settings/src/settings_getter_setter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,10 @@ impl Settings {
865865
Ok(self.try_get_u64("random_function_seed")? == 1)
866866
}
867867

868+
pub fn get_enable_selector_executor(&self) -> Result<bool> {
869+
Ok(self.try_get_u64("enable_selector_executor")? == 1)
870+
}
871+
868872
pub fn get_dynamic_sample_time_budget_ms(&self) -> Result<u64> {
869873
self.try_get_u64("dynamic_sample_time_budget_ms")
870874
}

tests/sqllogictests/suites/query/filter.test

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ statement ok
33
drop table if exists t;
44

55
statement ok
6-
create table t(a int null, b varchar null);
6+
create or replace table t(a int null, b varchar null);
77

88
statement ok
99
insert into t(a, b) values (3, NULL), (3,'hello'), (3,'hello'), (3,'hello'), (3,'hello'), (3,'hello'), (3,'hello'), (3,'hello'), (1,'4'), (1,'4');
@@ -14,28 +14,10 @@ select a, b from t where a = 1 and cast(b as int) >= 2;
1414
1 4
1515
1 4
1616

17-
# OR filter short circuit
18-
statement ok
19-
drop table if exists t;
20-
21-
statement ok
22-
create table t(a int);
23-
24-
statement ok
25-
insert into t values(0), (1), (2), (3), (NULL)
26-
27-
query I
28-
select a from t where a = 0 or 3 / a > 2 order by a
29-
----
30-
0
31-
1
32-
33-
statement ok
34-
drop table if exists t;
3517

3618
# AND filter short circuit
3719
statement ok
38-
create table t(a varchar);
20+
create or replace table t(a varchar);
3921

4022
statement ok
4123
insert into t values('null'), ('202405');
@@ -45,15 +27,9 @@ SELECT count(1) FROM t WHERE a <> 'null' AND a IS NOT NULL AND to_date(a || '01'
4527
----
4628
1
4729

48-
statement ok
49-
drop table if exists t;
5030

51-
# Boolean comparison
5231
statement ok
53-
drop table if exists t;
54-
55-
statement ok
56-
create table t(a boolean, b boolean);
32+
create or replace table t(a boolean, b boolean);
5733

5834
statement ok
5935
insert into t values(true, true), (true, false), (false, false);
@@ -101,14 +77,7 @@ select * from t where not(not(not(a)))
10177
0 0
10278

10379
statement ok
104-
drop table if exists t;
105-
106-
# Like Test
107-
statement ok
108-
drop table if exists t;
109-
110-
statement ok
111-
create table t(a int, b varchar);
80+
create or replace table t(a int, b varchar);
11281

11382
statement ok
11483
insert into t values(1, 'databend'), (2, ' databend query'), (3, 'query databend'), (4, 'query databend, query'), (5, 'databend cloud data warehouse'), (6, 'databend%cloud data warehouse');
@@ -216,8 +185,6 @@ select * from t where _origin_version is null;
216185
1
217186
2
218187

219-
statement ok
220-
drop table if exists t;
221188

222189
#issue 17388
223190

@@ -232,5 +199,9 @@ SELECT * FROM t2 WHERE payload:key2 = 'null';
232199
----
233200
2 {"key":"val2","key2":"null"}
234201

202+
203+
statement ok
204+
drop table if exists t;
205+
235206
statement ok
236207
drop table if exists t2;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
statement ok
2+
set enable_selector_executor = 0;
3+
4+
include ./filter.test
5+
6+
statement ok
7+
unset enable_selector_executor;
8+
9+
10+
statement ok
11+
create or replace table t(a int);
12+
13+
statement ok
14+
insert into t values(0), (1), (2), (3), (NULL)
15+
16+
query I
17+
select a from t where a = 0 or 3 / a > 2 order by a
18+
----
19+
0
20+
1
21+
22+
statement ok
23+
drop table if exists t;

0 commit comments

Comments
 (0)