čt 20. 3. 2025 v 22:30 odesílatel Pavel Stehule <pavel.steh...@gmail.com>
napsal:

> Hi
>
> út 18. 3. 2025 v 21:33 odesílatel Álvaro Herrera <alvhe...@alvh.no-ip.org>
> napsal:
>
>> On 2025-Mar-18, Pavel Stehule wrote:
>>
>> > Maybe I found a bug
>> >
>> > (2025-03-18 19:28:06) postgres=# create table foo(a int constraint gzero
>> > check(a > 10) NOT ENFORCED);
>> > CREATE TABLE
>> > (2025-03-18 19:29:37) postgres=# insert into foo values(0);
>> > INSERT 0 1
>> > (2025-03-18 19:29:49) postgres=# insert into foo values(6);
>> > INSERT 0 1
>> > (2025-03-18 19:29:55) postgres=# alter table foo alter constraint gzero
>> > enforced;
>> > ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
>> > LINE 1: alter table foo alter constraint gzero enforced;
>> >
>> > I know so altering enforcing constraint is not supported yet, but the
>> error
>> > message is surely wrong
>>
>> Yep, this is a bug all right -- I reported this and related problems a
>> few days ago [1].  There's a proposal in that thread for how to fix this
>> (see Amul's email [2] and my followup), but I haven't had time to fully
>> implement it.  If you want to give it a couple of hours to complete it,
>> that'd be great.  I have a couple of patches that I need to handle
>> before coming back to that.
>>
>> [1] https://postgr.es/m/202503041822.aobpqke3igvb@alvherre.pgsql
>> [2]
>> https://postgr.es/m/caaj_b97hd-jmts7ajgu6tdbczdx_kyukxg+k-dtymoieg+g...@mail.gmail.com
>
>
> I am looking this issue, and I am not sure if proposed way is the best
>
> cannot we change processCASbits just like ?
>
>
>     if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
>     {
>         if (deferrable)
>             *deferrable = true;
>         else if (constrType)
>             ereport(ERROR,
>                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
>             /* translator: %s is CHECK, UNIQUE, or similar */
>                      constrType ?
>                      errmsg("%s constraints cannot be marked DEFERRABLE",
>                             constrType) :
>                      errmsg("constraint cannot be marked DEFERRABLE"),
>                      parser_errposition(location)));
>     }
>     ...
>
> Probably can be better to not try to read from catalog in this moment, and
> then we can accept so we don't know constraint type
>

something like attached patch

Regards

Pavel


>
> Regards
>
> Pavel
>
>
>
>
>
>
>
>
>>
>> --
>> Álvaro Herrera         PostgreSQL Developer  —
>> https://www.EnterpriseDB.com/
>>
>
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 271ae26cbaf..7b0e66a8940 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -2663,7 +2663,7 @@ alter_table_cmd:
 					n->def = (Node *) c;
 					c->conname = $3;
 					c->alterDeferrability = true;
-					processCASbits($4, @4, "FOREIGN KEY",
+					processCASbits($4, @4, NULL,
 									&c->deferrable,
 									&c->initdeferred,
 									NULL, NULL, NULL, yyscanner);
@@ -19531,9 +19531,11 @@ processCASbits(int cas_bits, int location, const char *constrType,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-			/* translator: %s is CHECK, UNIQUE, or similar */
+					 constrType ?
+					 /* translator: %s is CHECK, UNIQUE, TRIGGER, or similar */
 					 errmsg("%s constraints cannot be marked DEFERRABLE",
-							constrType),
+							constrType) :
+					 errmsg("constraint cannot be marked DEFERRABLE"),
 					 parser_errposition(location)));
 	}
 
@@ -19544,9 +19546,11 @@ processCASbits(int cas_bits, int location, const char *constrType,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-			/* translator: %s is CHECK, UNIQUE, or similar */
+					 constrType ?
+					 /* translator: %s is CHECK, UNIQUE, TRIGGER, or similar */
 					 errmsg("%s constraints cannot be marked DEFERRABLE",
-							constrType),
+							constrType) :
+					 errmsg("constraint cannot be marked DEFERRABLE"),
 					 parser_errposition(location)));
 	}
 
@@ -19557,9 +19561,11 @@ processCASbits(int cas_bits, int location, const char *constrType,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-			/* translator: %s is CHECK, UNIQUE, or similar */
+					 constrType ?
+					 /* translator: %s is CHECK, UNIQUE, TRIGGER, or similar */
 					 errmsg("%s constraints cannot be marked NOT VALID",
-							constrType),
+							constrType) :
+					 errmsg("constraint cannot be marked NOT VALID"),
 					 parser_errposition(location)));
 	}
 
@@ -19570,9 +19576,11 @@ processCASbits(int cas_bits, int location, const char *constrType,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-			/* translator: %s is CHECK, UNIQUE, or similar */
+					 constrType ?
+					 /* translator: %s is CHECK, UNIQUE, TRIGGER, or similar */
 					 errmsg("%s constraints cannot be marked NO INHERIT",
-							constrType),
+							constrType) :
+					 errmsg("constraint cannot be marked NO INHERIT"),
 					 parser_errposition(location)));
 	}
 
@@ -19583,9 +19591,11 @@ processCASbits(int cas_bits, int location, const char *constrType,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-					 /* translator: %s is CHECK, UNIQUE, or similar */
+					 constrType ?
+					 /* translator: %s is CHECK, UNIQUE, TRIGGER, or similar */
 					 errmsg("%s constraints cannot be marked NOT ENFORCED",
-							constrType),
+							constrType) :
+					 errmsg("constraint cannot be marked NOT ENFORCED"),
 					 parser_errposition(location)));
 
 		/*
@@ -19605,9 +19615,11 @@ processCASbits(int cas_bits, int location, const char *constrType,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-					 /* translator: %s is CHECK, UNIQUE, or similar */
+					 constrType ?
+					 /* translator: %s is CHECK, UNIQUE, TRIGGER, or similar */
 					 errmsg("%s constraints cannot be marked ENFORCED",
-							constrType),
+							constrType) :
+					 errmsg("constraint cannot be marked ENFORCED"),
 					 parser_errposition(location)));
 	}
 }
diff --git a/src/test/regress/expected/constraints.out b/src/test/regress/expected/constraints.out
index 4f39100fcdf..226a1b4c9e6 100644
--- a/src/test/regress/expected/constraints.out
+++ b/src/test/regress/expected/constraints.out
@@ -745,11 +745,11 @@ ERROR:  misplaced NOT ENFORCED clause
 LINE 1: CREATE TABLE UNIQUE_NOTEN_TBL(i int UNIQUE NOT ENFORCED);
                                                    ^
 ALTER TABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key ENFORCED;
-ERROR:  FOREIGN KEY constraints cannot be marked ENFORCED
+ERROR:  constraint cannot be marked 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;
-ERROR:  FOREIGN KEY constraints cannot be marked NOT ENFORCED
+ERROR:  constraint cannot be marked NOT ENFORCED
 LINE 1: ...ABLE unique_tbl ALTER CONSTRAINT unique_tbl_i_key NOT ENFORC...
                                                              ^
 DROP TABLE unique_tbl;
diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out
index 6a3374d5152..776f1059b2d 100644
--- a/src/test/regress/expected/foreign_key.out
+++ b/src/test/regress/expected/foreign_key.out
@@ -1284,11 +1284,11 @@ ERROR:  constraint declared INITIALLY DEFERRED must be DEFERRABLE
 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
+ERROR:  constraint 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
+ERROR:  constraint 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

Reply via email to