putao520 opened a new issue, #2914:
URL: https://github.com/apache/datafusion-sqlparser-rs/issues/2914

   ## Summary
   
   `sqlparser-rs` 0.64.0 parses `SELECT ... FOR UPDATE` / `FOR SHARE`, but has 
no production for the other two PostgreSQL row-lock strengths, and no 
production for any PostgreSQL two-phase-commit statement or the anonymous `DO` 
block. These are the four surfaces PostgreSQL's own regression/isolation suites 
exercise and they cannot be reached through the AST at all.
   
   ## Environment
   
   - `sqlparser` 0.64.0 (crate source, `src/ast/mod.rs`, `src/parser/**`)
   - PostgreSQL dialect (`PostgreSqlDialect`)
   - Consumer: a PostgreSQL-wire-compatible engine driving `REL_16_4` 
`pg_regress` + isolation suites against `sqlparser`'s AST
   
   ## What is missing
   
   | PostgreSQL statement | Expected | Actual (0.64.0) |
   |---|---|---|
   | `SELECT ... FOR NO KEY UPDATE` | a locking-clause AST node | no 
production; `FOR UPDATE` and `FOR SHARE` only |
   | `SELECT ... FOR KEY SHARE` | a locking-clause AST node | no production |
   | `PREPARE TRANSACTION 'gid'` | a statement node | no production |
   | `COMMIT PREPARED 'gid'` / `ROLLBACK PREPARED 'gid'` | statement nodes | no 
production |
   | `DO $$ ... $$` (anonymous code block) | a statement node | no 
`Statement::Do` variant |
   
   ## Evidence (0.64.0 crate source)
   
   - `for no key update` / `for key share`: **0** matches anywhere under `src/` 
(case-insensitive, whitespace-tolerant).
   - `PREPARE TRANSACTION`: **0** matches anywhere under `src/`.
   - `pub enum Statement` has 151 variants; the only matches for the 
interesting prefixes are `Prepare` (the SQL `PREPARE name AS ...` statement), 
`Lock`, `LockTables` (MySQL) — there is no `Do` and no prepared-transaction 
variant.
   
   ## Expected behaviour
   
   Parsing the statements above with `PostgreSqlDialect` yields a 
statement/locking-clause node the consumer can match on, the same way `SELECT 
... FOR UPDATE` already does.
   
   ## Actual behaviour
   
   The parser rejects them, so a downstream engine cannot represent the feature 
through the AST and is forced either to pre-scan the SQL text (which is what we 
want to avoid) or to leave the feature unimplemented.
   
   ## Why it matters here
   
   `pg_regress`'s `lock`, `select` and `transactions` files and the isolation 
suite's `prepared-transactions*`, `lock-committed-*`, `nowait-*`, 
`skip-locked-*` specs all start with these statements. Without an AST face, the 
consumer cannot answer them at all.
   


-- 
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]

Reply via email to