mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix ALTER TABLE error message
This bogus error message was introduced in 2013 by commitf177cbfe67, because of misunderstanding the processCASbits() API; at the time, no test cases were added that would be affected by this change. Only inca87c415e2was one added (along with a couple of typos), with an XXX note that the error message was bogus. Fix the whole, add some test cases. Backpatch all the way back. Reviewed-by: Nathan Bossart <nathandbossart@gmail.com> Discussion: https://postgr.es/m/202503041822.aobpqke3igvb@alvherre.pgsql
This commit is contained in:
		@@ -2663,7 +2663,7 @@ alter_table_cmd:
 | 
				
			|||||||
					n->def = (Node *) c;
 | 
										n->def = (Node *) c;
 | 
				
			||||||
					c->conname = $3;
 | 
										c->conname = $3;
 | 
				
			||||||
					c->alterDeferrability = true;
 | 
										c->alterDeferrability = true;
 | 
				
			||||||
					processCASbits($4, @4, "ALTER CONSTRAINT statement",
 | 
										processCASbits($4, @4, "FOREIGN KEY",
 | 
				
			||||||
									&c->deferrable,
 | 
														&c->deferrable,
 | 
				
			||||||
									&c->initdeferred,
 | 
														&c->initdeferred,
 | 
				
			||||||
									NULL, NULL, NULL, yyscanner);
 | 
														NULL, NULL, NULL, yyscanner);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -735,7 +735,7 @@ SELECT * FROM unique_tbl;
 | 
				
			|||||||
 3 | threex
 | 
					 3 | threex
 | 
				
			||||||
(5 rows)
 | 
					(5 rows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- enforcibility cannot be specified or set for unique constrain
 | 
					-- enforceability cannot be specified or set for unique constraint
 | 
				
			||||||
CREATE TABLE UNIQUE_EN_TBL(i int UNIQUE ENFORCED);
 | 
					CREATE TABLE UNIQUE_EN_TBL(i int UNIQUE ENFORCED);
 | 
				
			||||||
ERROR:  misplaced ENFORCED clause
 | 
					ERROR:  misplaced ENFORCED clause
 | 
				
			||||||
LINE 1: CREATE TABLE UNIQUE_EN_TBL(i int UNIQUE ENFORCED);
 | 
					LINE 1: CREATE TABLE UNIQUE_EN_TBL(i int UNIQUE ENFORCED);
 | 
				
			||||||
@@ -744,13 +744,12 @@ CREATE TABLE UNIQUE_NOTEN_TBL(i int UNIQUE NOT ENFORCED);
 | 
				
			|||||||
ERROR:  misplaced NOT ENFORCED clause
 | 
					ERROR:  misplaced NOT ENFORCED clause
 | 
				
			||||||
LINE 1: CREATE TABLE UNIQUE_NOTEN_TBL(i int UNIQUE NOT ENFORCED);
 | 
					LINE 1: CREATE TABLE UNIQUE_NOTEN_TBL(i int UNIQUE NOT ENFORCED);
 | 
				
			||||||
                                                   ^
 | 
					                                                   ^
 | 
				
			||||||
-- XXX: error message is misleading here
 | 
					 | 
				
			||||||
ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
 | 
					ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
 | 
				
			||||||
ERROR:  ALTER CONSTRAINT statement constraints cannot be marked ENFORCED
 | 
					ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
 | 
				
			||||||
LINE 1: ...TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
 | 
					LINE 1: ...TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
 | 
				
			||||||
                                                              ^
 | 
					                                                              ^
 | 
				
			||||||
ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORCED;
 | 
					ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORCED;
 | 
				
			||||||
ERROR:  ALTER CONSTRAINT statement constraints cannot be marked NOT ENFORCED
 | 
					ERROR:  FOREIGN KEY constraints cannot be marked NOT ENFORCED
 | 
				
			||||||
LINE 1: ...ABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORC...
 | 
					LINE 1: ...ABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORC...
 | 
				
			||||||
                                                             ^
 | 
					                                                             ^
 | 
				
			||||||
DROP TABLE unique_tbl;
 | 
					DROP TABLE unique_tbl;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1278,11 +1278,19 @@ DETAIL:  Key (fk)=(20) is not present in table "pktable".
 | 
				
			|||||||
COMMIT;
 | 
					COMMIT;
 | 
				
			||||||
-- try additional syntax
 | 
					-- try additional syntax
 | 
				
			||||||
ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE;
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE;
 | 
				
			||||||
-- illegal option
 | 
					-- illegal options
 | 
				
			||||||
ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED;
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED;
 | 
				
			||||||
ERROR:  constraint declared INITIALLY DEFERRED must be DEFERRABLE
 | 
					ERROR:  constraint declared INITIALLY DEFERRED must be DEFERRABLE
 | 
				
			||||||
LINE 1: ...e ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY ...
 | 
					LINE 1: ...e ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY ...
 | 
				
			||||||
                                                             ^
 | 
					                                                             ^
 | 
				
			||||||
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NO INHERIT;
 | 
				
			||||||
 | 
					ERROR:  FOREIGN KEY constraints cannot be marked NO INHERIT
 | 
				
			||||||
 | 
					LINE 1: ...ER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NO INHERIT...
 | 
				
			||||||
 | 
					                                                             ^
 | 
				
			||||||
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT VALID;
 | 
				
			||||||
 | 
					ERROR:  FOREIGN KEY constraints cannot be marked NOT VALID
 | 
				
			||||||
 | 
					LINE 1: ...ER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT VALID;
 | 
				
			||||||
 | 
					                                                             ^
 | 
				
			||||||
-- test order of firing of FK triggers when several RI-induced changes need to
 | 
					-- test order of firing of FK triggers when several RI-induced changes need to
 | 
				
			||||||
-- be made to the same row.  This was broken by subtransaction-related
 | 
					-- be made to the same row.  This was broken by subtransaction-related
 | 
				
			||||||
-- changes in 8.0.
 | 
					-- changes in 8.0.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -531,10 +531,9 @@ COMMIT;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SELECT * FROM unique_tbl;
 | 
					SELECT * FROM unique_tbl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- enforcibility cannot be specified or set for unique constrain
 | 
					-- enforceability cannot be specified or set for unique constraint
 | 
				
			||||||
CREATE TABLE UNIQUE_EN_TBL(i int UNIQUE ENFORCED);
 | 
					CREATE TABLE UNIQUE_EN_TBL(i int UNIQUE ENFORCED);
 | 
				
			||||||
CREATE TABLE UNIQUE_NOTEN_TBL(i int UNIQUE NOT ENFORCED);
 | 
					CREATE TABLE UNIQUE_NOTEN_TBL(i int UNIQUE NOT ENFORCED);
 | 
				
			||||||
-- XXX: error message is misleading here
 | 
					 | 
				
			||||||
ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
 | 
					ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
 | 
				
			||||||
ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORCED;
 | 
					ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORCED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -970,8 +970,10 @@ COMMIT;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
-- try additional syntax
 | 
					-- try additional syntax
 | 
				
			||||||
ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE;
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE;
 | 
				
			||||||
-- illegal option
 | 
					-- illegal options
 | 
				
			||||||
ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED;
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED;
 | 
				
			||||||
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NO INHERIT;
 | 
				
			||||||
 | 
					ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT VALID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- test order of firing of FK triggers when several RI-induced changes need to
 | 
					-- test order of firing of FK triggers when several RI-induced changes need to
 | 
				
			||||||
-- be made to the same row.  This was broken by subtransaction-related
 | 
					-- be made to the same row.  This was broken by subtransaction-related
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user