From 645de005a57f021a1b051fb0249505ed503e472d Mon Sep 17 00:00:00 2001 From: zzoraemon043 <195147269+zzoraemon043@users.noreply.github.com> Date: Mon, 19 Oct 2026 10:19:11 +0800 Subject: [PATCH] Support MERGE in PostgreSQL Fixes #986 --- src/languages/postgresql/postgresql.formatter.ts | 6 +++++- src/languages/postgresql/postgresql.functions.ts | 3 +++ test/postgresql.test.ts | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index d3d8a51fd2..912048c283 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -21,11 +21,15 @@ const reservedClauses = expandPhrases([ 'FOR {UPDATE | NO KEY UPDATE | SHARE | KEY SHARE} [OF]', // Data manipulation // - insert: - 'INSERT INTO', + 'INSERT [INTO]', 'VALUES', 'DEFAULT VALUES', // - update: 'SET', + // - merge: + 'MERGE [INTO]', + 'WHEN [NOT] MATCHED [BY SOURCE | BY TARGET] [THEN]', + 'UPDATE SET', // other 'RETURNING', ]); diff --git a/src/languages/postgresql/postgresql.functions.ts b/src/languages/postgresql/postgresql.functions.ts index 6c142e100e..d6e43672be 100644 --- a/src/languages/postgresql/postgresql.functions.ts +++ b/src/languages/postgresql/postgresql.functions.ts @@ -271,6 +271,9 @@ export const functions: string[] = [ 'UUID_EXTRACT_TIMESTAMP', 'UUID_EXTRACT_VERSION', + // https://www.postgresql.org/docs/17/functions-merge-support.html + 'MERGE_ACTION', + // https://www.postgresql.org/docs/14/functions-xml.html 'CURSOR_TO_XML', 'CURSOR_TO_XMLSCHEMA', diff --git a/test/postgresql.test.ts b/test/postgresql.test.ts index e8e99adfea..26fa949af2 100644 --- a/test/postgresql.test.ts +++ b/test/postgresql.test.ts @@ -19,6 +19,7 @@ import supportsCreateView from './features/createView.js'; import supportsIsDistinctFrom from './features/isDistinctFrom.js'; import supportsArrayLiterals from './features/arrayLiterals.js'; import supportsDataTypeCase from './options/dataTypeCase.js'; +import supportsMergeInto from './features/mergeInto.js'; import behavesLikePostgresqlFormatter from './behavesLikePostgresqlFormatter.js'; describe('PostgreSqlFormatter', () => { @@ -147,6 +148,7 @@ describe('PostgreSqlFormatter', () => { supportsParams(format, { numbered: ['$'] }); supportsLimiting(format, { limit: true, offset: true, fetchFirst: true, fetchNext: true }); supportsDataTypeCase(format); + supportsMergeInto(format); // Regression test for issue #935 it('preserves pg_dump restrict commands', () => {