From 9572aca032f66905044bb7718405c18b1dd38718 Mon Sep 17 00:00:00 2001 From: psteinroe Date: Thu, 9 Oct 2025 13:00:13 +0200 Subject: [PATCH] fix(statement-splitter): merge into then update --- crates/pgt_statement_splitter/src/lib.rs | 26 +++++++++++++++++++ .../src/splitter/common.rs | 2 ++ 2 files changed, 28 insertions(+) diff --git a/crates/pgt_statement_splitter/src/lib.rs b/crates/pgt_statement_splitter/src/lib.rs index eacd887b8..03fe8fd40 100644 --- a/crates/pgt_statement_splitter/src/lib.rs +++ b/crates/pgt_statement_splitter/src/lib.rs @@ -537,6 +537,32 @@ values ('insert', new.id, now());", ]); } + #[test] + fn merge_into() { + Tester::from( + "MERGE INTO course_permissions AS cp +USING (SELECT 1 AS user_id, 2 AS course_id, 'Owner'::enum_course_role AS course_role) AS data +ON (cp.course_id = data.course_id AND cp.user_id = data.user_id) +WHEN MATCHED THEN UPDATE SET course_role = data.course_role +WHEN NOT MATCHED THEN +INSERT + (user_id, course_id, course_role) +VALUES + (data.user_id, data.course_id, data.course_role);", + ) + .expect_statements(vec![ + "MERGE INTO course_permissions AS cp +USING (SELECT 1 AS user_id, 2 AS course_id, 'Owner'::enum_course_role AS course_role) AS data +ON (cp.course_id = data.course_id AND cp.user_id = data.user_id) +WHEN MATCHED THEN UPDATE SET course_role = data.course_role +WHEN NOT MATCHED THEN +INSERT + (user_id, course_id, course_role) +VALUES + (data.user_id, data.course_id, data.course_role);", + ]); + } + #[test] fn commas_and_newlines() { Tester::from( diff --git a/crates/pgt_statement_splitter/src/splitter/common.rs b/crates/pgt_statement_splitter/src/splitter/common.rs index fcb851dac..9c6064b78 100644 --- a/crates/pgt_statement_splitter/src/splitter/common.rs +++ b/crates/pgt_statement_splitter/src/splitter/common.rs @@ -263,6 +263,8 @@ pub(crate) fn unknown(p: &mut Splitter, exclude: &[SyntaxKind]) { SyntaxKind::DO_KW, // FOR NO KEY UPDATE SyntaxKind::KEY_KW, + // WHEN MATCHED THEN + SyntaxKind::THEN_KW, ] .iter() .all(|x| Some(x) != prev.as_ref())