Skip to content

Merge SQL generation injects AS into USING clause #5910

@deepyaman

Description

@deepyaman

Fully reproducible code snippet

>>> import sqlglot.expressions as exp
>>> exp.merge("WHEN MATCHED THEN UPDATE SET my_table.col1 = source_table.col1",
...           "WHEN NOT MATCHED THEN INSERT (my_table.id, my_table.col1) VALUES (source_table.id, source_table.col1)",
...           into="my_table",
...           using="(SELECT * FROM something) source_table",
...           on="my_table.id = source_table.id").sql()
'MERGE INTO my_table USING (SELECT * FROM something) AS source_table ON my_table.id = source_table.id WHEN MATCHED THEN UPDATE SET my_table.col1 = source_table.col1 WHEN NOT MATCHED THEN INSERT (my_table.id, my_table.col1) VALUES (source_table.id, source_table.col1)'
>>> exp.merge("WHEN MATCHED THEN UPDATE SET my_table.col1 = source_table.col1",
...           "WHEN NOT MATCHED THEN INSERT (my_table.id, my_table.col1) VALUES (source_table.id, source_table.col1)",
...           into="my_table",
...           using="(SELECT * FROM something) source_table",
...           on="my_table.id = source_table.id").sql(dialect="oracle")
'MERGE INTO my_table USING (SELECT * FROM something) AS source_table ON my_table.id = source_table.id WHEN MATCHED THEN UPDATE SET my_table.col1 = source_table.col1 WHEN NOT MATCHED THEN INSERT (my_table.id, my_table.col1) VALUES (source_table.id, source_table.col1)'

At least for Oracle, (SELECT * FROM something) AS source_table should should not include the AS; having it will result in ORA-00969: missing ON keyword.

Official Documentation
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html

Context
I'm currently manually removing the "AS " in ibis-project/ibis#11624 as a hack (and then it works). If it's helpful, here's the actual SQLGlot expression I'm building: https://github.com/ibis-project/ibis/blob/21994eb29f1db104aacc7957181fa4a5a327508a/ibis/backends/sql/__init__.py#L605-L651

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions