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: github-unsubscr...@datafusion.apache.org.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For additional commands, e-mail: github-h...@datafusion.apache.org