mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Prevent setting a column as identity if its not-null constraint is invalid
We don't allow null values to appear in identity-generated columns in
other ways, so we shouldn't let unvalidated not-null constraints do it
either. Oversight in commit a379061a22.
Author: jian he <jian.universality@gmail.com>
Backpatch-through: 18
Discussion: https://postgr.es/m/CACJufxGQM_+vZoYJMaRoZfNyV=L2jxosjv_0TLAScbuLJXWRfQ@mail.gmail.com
This commit is contained in:
@@ -8281,6 +8281,31 @@ ATExecAddIdentity(Relation rel, const char *colName,
|
||||
errmsg("column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added",
|
||||
colName, RelationGetRelationName(rel))));
|
||||
|
||||
/*
|
||||
* On the other hand, if a not-null constraint exists, then verify that
|
||||
* it's compatible.
|
||||
*/
|
||||
if (attTup->attnotnull)
|
||||
{
|
||||
HeapTuple contup;
|
||||
Form_pg_constraint conForm;
|
||||
|
||||
contup = findNotNullConstraintAttnum(RelationGetRelid(rel),
|
||||
attnum);
|
||||
if (!HeapTupleIsValid(contup))
|
||||
elog(ERROR, "cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
|
||||
colName, RelationGetRelationName(rel));
|
||||
|
||||
conForm = (Form_pg_constraint) GETSTRUCT(contup);
|
||||
if (!conForm->convalidated)
|
||||
ereport(ERROR,
|
||||
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("incompatible NOT VALID constraint \"%s\" on relation \"%s\"",
|
||||
NameStr(conForm->conname), RelationGetRelationName(rel)),
|
||||
errhint("You might need to validate it using %s.",
|
||||
"ALTER TABLE ... VALIDATE CONSTRAINT"));
|
||||
}
|
||||
|
||||
if (attTup->attidentity)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
|
||||
@@ -1404,6 +1404,10 @@ ALTER TABLE notnull_tbl1 ADD PRIMARY KEY (a);
|
||||
ERROR: cannot create primary key on column "a"
|
||||
DETAIL: The constraint "nn" on column "a" of table "notnull_tbl1", marked NOT VALID, is incompatible with a primary key.
|
||||
HINT: You might need to validate it using ALTER TABLE ... VALIDATE CONSTRAINT.
|
||||
-- cannot set column as generated-as-identity if it has an invalid not-null
|
||||
ALTER TABLE notnull_tbl1 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;
|
||||
ERROR: incompatible NOT VALID constraint "nn" on relation "notnull_tbl1"
|
||||
HINT: You might need to validate it using ALTER TABLE ... VALIDATE CONSTRAINT.
|
||||
-- ALTER column SET NOT NULL validates an invalid constraint (but this fails
|
||||
-- because of rows with null values)
|
||||
ALTER TABLE notnull_tbl1 ALTER a SET NOT NULL;
|
||||
|
||||
@@ -832,6 +832,9 @@ ALTER TABLE notnull_tbl1 ADD CONSTRAINT nn NOT NULL a;
|
||||
-- cannot add primary key on a column with an invalid not-null
|
||||
ALTER TABLE notnull_tbl1 ADD PRIMARY KEY (a);
|
||||
|
||||
-- cannot set column as generated-as-identity if it has an invalid not-null
|
||||
ALTER TABLE notnull_tbl1 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;
|
||||
|
||||
-- ALTER column SET NOT NULL validates an invalid constraint (but this fails
|
||||
-- because of rows with null values)
|
||||
ALTER TABLE notnull_tbl1 ALTER a SET NOT NULL;
|
||||
|
||||
Reference in New Issue
Block a user