Skip to content

Conversation

@xitep
Copy link
Contributor

@xitep xitep commented Nov 19, 2025

Oracle supports small extensions to the standard MERGE syntax (that I'd need to support.) In particular:

  • ... WHEN MATCHED ... UPDATE ... ***[WHERE <expr>] [DELETE WHERE <expr>]***
  • ... WHEN NOT MATCHED ... INSERT ... ***[WHERE <expr>]***

Here's the documentation for reference.

Quoted column names

Additionally, Oracle also allows quoted names in MERGE INTO a.b ... INSERT (a.b.col1, a.b.col2) ... (or event ... INSERT (b.col1, b.col2) ... with the same meaning as ... INSERT (col1, col2) as long as a.b denotes the target table of the merge.

For the sake of compatibility, this draft PR makes a trade-off: the parser validates that "a.b." corresponds to the target table, and strips away the prefix in order to keep MergeInsertExpr::columns a Vec<Ident>. While preserving semantics, the implication is that such a parsed statements doesn't render back in the exact same form, though.

Not doing the validation and stripping, we'd probably need to end up with a Vec<QualifiedName>. I would be glad to hear your opinion how to move forward. Personally, I'd be fine with the Vec<QualifiedName> allowing me to re-produce the statement as originally written.

Note

  1. This draft builds on top of impl Spanned for MERGE statements #2100 as it made my work easier; it's only the latest commit that is relevant. I will continue rebasing / adopting this PR accordingly.
  2. I have moved the MERGE parsing code to a dedicated sub-module (and make Parser::merge_parse_clauses private.)
  3. I'd appreciate any early feedback to be able to steer this into a desired direction.

Missing

  • Location information in error messages

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant