aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-03-12 11:08:42 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2021-03-12 11:08:42 -0500
commite7f7950f6741a799bdf1dc3d2dbcb85e1b0a3c8c (patch)
tree37a6ebeb7ed032defabe8e55abe6dad4b27f5208 /src/backend
parentce54c024d9bf3022690dc84a17f1207aceec430a (diff)
downloadpostgresql-e7f7950f6741a799bdf1dc3d2dbcb85e1b0a3c8c.tar.gz
postgresql-e7f7950f6741a799bdf1dc3d2dbcb85e1b0a3c8c.zip
Forbid marking an identity column as nullable.
GENERATED ALWAYS AS IDENTITY implies NOT NULL, but the code failed to complain if you overrode that with "GENERATED ALWAYS AS IDENTITY NULL". One might think the old behavior was a feature, but it was inconsistent because the outcome varied depending on the order of the clauses, so it seems to have been just an oversight. Per bug #16913 from Pavel Boev. Back-patch to v10 where identity columns were introduced. Vik Fearing (minor tweaks by me) Discussion: https://postgr.es/m/16913-3b5198410f67d8c6@postgresql.org
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/parser/parse_utilcmd.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 577fe1e752e..a9a98e6b9cf 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -706,7 +706,17 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
column->identity = constraint->generated_when;
saw_identity = true;
+
+ /* An identity column is implicitly NOT NULL */
+ if (saw_nullable && !column->is_not_null)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"",
+ column->colname, cxt->relation->relname),
+ parser_errposition(cxt->pstate,
+ constraint->location)));
column->is_not_null = true;
+ saw_nullable = true;
break;
}