čt 20. 3. 2025 v 22:30 odesílatel Pavel Stehule <[email protected]>
napsal:
> Hi
>
> út 18. 3. 2025 v 21:33 odesílatel Álvaro Herrera <[email protected]>
> 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/[email protected]
>> [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