Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/frontend/planner_test/tests/testdata/input/parameters.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
- id: explain parameters
sql: |
explain select $1
expected_outputs:
- explain_output
- id: explain parameters in in-expr
sql: |
create table t (id int primary key, a int);
explain select * from t where id in($1)
expected_outputs:
- explain_output
- id: explain parameters in in-expr
sql: |
create table t (id int primary key, a int);
explain select * from t where id in($1, 123)
expected_outputs:
- explain_output
23 changes: 23 additions & 0 deletions src/frontend/planner_test/tests/testdata/output/parameters.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# This file is automatically generated. See `src/frontend/planner_test/README.md` for more information.
- id: explain parameters
sql: |
explain select $1
explain_output: |
BatchProject { exprs: [Parameter(index: 1, type: None) as $expr1] }
└─BatchValues { rows: [[]] }
- id: explain parameters in in-expr
sql: |
create table t (id int primary key, a int);
explain select * from t where id in($1)
explain_output: |
BatchExchange { order: [], dist: Single }
└─BatchFilter { predicate: (t.id = Parameter(index: 1, type: Some(Int32))) }
└─BatchScan { table: t, columns: [id, a] }
- id: explain parameters in in-expr
sql: |
create table t (id int primary key, a int);
explain select * from t where id in($1, 123)
explain_output: |
BatchExchange { order: [], dist: Single }
└─BatchFilter { predicate: (In(t.id, 123:Int32) OR (t.id = Parameter(index: 1, type: Some(Int32)))) }
└─BatchScan { table: t, columns: [id, a] }
36 changes: 25 additions & 11 deletions src/frontend/src/binder/expr/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -278,22 +278,36 @@ impl Binder {
false => non_const_exprs.push(expr),
}
}
let mut ret = FunctionCall::new(ExprType::In, bound_expr_list)?.into();

let mut ret = if bound_expr_list.len() == 1 {
None
} else {
Some(FunctionCall::new(ExprType::In, bound_expr_list)?.into())
};
// Non-const exprs are not part of IN-expr in backend and rewritten into OR-Equal-exprs.
for expr in non_const_exprs {
ret = FunctionCall::new(
ExprType::Or,
vec![
ret,
FunctionCall::new(ExprType::Equal, vec![left.clone(), expr])?.into(),
],
)?
.into();
if let Some(inner_ret) = ret {
ret = Some(
FunctionCall::new(
ExprType::Or,
vec![
inner_ret,
FunctionCall::new(ExprType::Equal, vec![left.clone(), expr])?.into(),
],
)?
.into(),
);
} else {
ret = Some(FunctionCall::new(ExprType::Equal, vec![left.clone(), expr])?.into());
}
}
if negated {
Ok(FunctionCall::new_unchecked(ExprType::Not, vec![ret], DataType::Boolean).into())
Ok(
FunctionCall::new_unchecked(ExprType::Not, vec![ret.unwrap()], DataType::Boolean)
.into(),
)
} else {
Ok(ret)
Ok(ret.unwrap())
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ impl ExprRewriter for ConstEvalRewriter {
expr
}
}
} else if let ExprImpl::Parameter(_) = expr {
unreachable!(
"Parameter should not appear here. It will be replaced by a literal before this step."
)
} else {
default_rewrite_expr(self, expr)
}
Expand Down
Loading