ryanschneider opened a new issue, #1962:
URL: https://github.com/apache/datafusion-sqlparser-rs/issues/1962
Some DBs support using placeholders for `IN` clauses in prepared statements.
For example in DuckDB:
```
$ duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D PREPARE qry AS SELECT 'a' in $list;
D EXECUTE qry(list := ['a', 'b']);
┌──────────────────────┐
│ contains($list, 'a') │
│ boolean │
├──────────────────────┤
│ true │
└──────────────────────┘
```
However, currently the parser doesn't handle this, for example:
```rust
#[test]
fn test_parse_in_placeholder() {
let stmt = all_dialects().verified_stmt("SELECT i IN $placeholder");
dbg!(&stmt);
}
```
Fails w/ `SELECT i IN $placeholder: ParserError("Expected: (, found:
$placeholder")`.
To fix this, I think we would need to make two changes:
First off, the definition of `Expr::InList`:
```rust
/// `[ NOT ] IN (val1, val2, ...)`
InList {
expr: Box<Expr>,
list: Vec<Expr>,
negated: bool,
},
```
The issue is that `list` is always a Vec, where in this case we want list to
be a `Expr::Value` w/ `value = Placeholder("$placeholder")`.
If `InList` supports that, then in `parse_in` we can do a check like this
before the `expect_token(LParen)`:
```rust
if let Token::Placeholder(_) = &self.peek_token_ref().token {
let placeholder = self.parse_expr()?;
return Ok(Expr::InList {
expr: Box::new(expr),
list: placeholder,
negated,
})
};
self.expect_token(&Token::LParen)?;
```
But, how can we cleanly support this, without too much breakage for existing
consumers? Note that I considered just putting the placeholder inside the
list, but that doesn't work since that would represent `IN ($placeholder)`
which has a very different meaning.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]