summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Rasheed2023-01-10 14:17:47 +0000
committerDean Rasheed2023-01-10 14:17:47 +0000
commitf026c16a2c5a3ee5d7aa6f85333ec80c905913ba (patch)
tree4bc010d468cee93ccae63304a915a6c4fb2066f4
parentd952373a987bad331c0e499463159dd142ced1ef (diff)
Fix MERGE's test for unreachable WHEN clauses.
The former code would only detect an unreachable WHEN clause if it had an AND condition. Fix, so that unreachable unconditional WHEN clauses are also detected. Back-patch to v15, where MERGE was added. Discussion: https://postgr.es/m/CAEZATCVQ=7E2z4cSBB49jjeGGsB6WeoYQY32NDeSvcHiLUZ=ow@mail.gmail.com
-rw-r--r--src/backend/parser/parse_merge.c6
-rw-r--r--src/test/regress/expected/merge.out2
-rw-r--r--src/test/regress/sql/merge.sql2
3 files changed, 5 insertions, 5 deletions
diff --git a/src/backend/parser/parse_merge.c b/src/backend/parser/parse_merge.c
index 611dfce1d6..d8866373b8 100644
--- a/src/backend/parser/parse_merge.c
+++ b/src/backend/parser/parse_merge.c
@@ -155,12 +155,12 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt)
/*
* Check for unreachable WHEN clauses
*/
- if (mergeWhenClause->condition == NULL)
- is_terminal[when_type] = true;
- else if (is_terminal[when_type])
+ if (is_terminal[when_type])
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("unreachable WHEN clause specified after unconditional WHEN clause")));
+ if (mergeWhenClause->condition == NULL)
+ is_terminal[when_type] = true;
}
/*
diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out
index 6c8a18f7b5..bc53b2105b 100644
--- a/src/test/regress/expected/merge.out
+++ b/src/test/regress/expected/merge.out
@@ -659,7 +659,7 @@ USING source AS s
ON t.tid = s.sid
WHEN MATCHED THEN /* Terminal WHEN clause for MATCHED */
DELETE
-WHEN MATCHED AND s.delta > 0 THEN
+WHEN MATCHED THEN
UPDATE SET balance = t.balance - s.delta;
ERROR: unreachable WHEN clause specified after unconditional WHEN clause
ROLLBACK;
diff --git a/src/test/regress/sql/merge.sql b/src/test/regress/sql/merge.sql
index 98fe1040bd..fdbcd70882 100644
--- a/src/test/regress/sql/merge.sql
+++ b/src/test/regress/sql/merge.sql
@@ -438,7 +438,7 @@ USING source AS s
ON t.tid = s.sid
WHEN MATCHED THEN /* Terminal WHEN clause for MATCHED */
DELETE
-WHEN MATCHED AND s.delta > 0 THEN
+WHEN MATCHED THEN
UPDATE SET balance = t.balance - s.delta;
ROLLBACK;