1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-06 00:02:13 +03:00

Apply identity sequence values on COPY

A COPY into a table should apply identity sequence values just like it
does for ordinary defaults.  This was previously forgotten, leading to
null values being inserted, which in turn would fail because identity
columns have not-null constraints.

Author: Michael Paquier <michael.paquier@gmail.com>
Reported-by: Steven Winfield <steven.winfield@cantabcapital.com>
Bug: #14952
This commit is contained in:
Peter Eisentraut
2017-12-08 09:18:18 -05:00
parent a8ef4e81e6
commit ee5b595493
3 changed files with 44 additions and 2 deletions

View File

@@ -25,6 +25,7 @@
#include "access/sysattr.h"
#include "access/xact.h"
#include "access/xlog.h"
#include "catalog/dependency.h"
#include "catalog/pg_type.h"
#include "commands/copy.h"
#include "commands/defrem.h"
@@ -3063,8 +3064,19 @@ BeginCopyFrom(ParseState *pstate,
{
/* attribute is NOT to be copied from input */
/* use default value if one exists */
Expr *defexpr = (Expr *) build_column_default(cstate->rel,
attnum);
Expr *defexpr;
if (attr[attnum - 1]->attidentity)
{
NextValueExpr *nve = makeNode(NextValueExpr);
nve->seqid = getOwnedSequence(RelationGetRelid(cstate->rel),
attnum);
nve->typeId = attr[attnum - 1]->atttypid;
defexpr = (Expr *) nve;
}
else
defexpr = (Expr *) build_column_default(cstate->rel, attnum);
if (defexpr != NULL)
{