aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2017-12-08 09:18:18 -0500
committerPeter Eisentraut <peter_e@gmx.net>2017-12-08 09:39:55 -0500
commitee5b595493e1609903d55709853f5276ba85c81d (patch)
tree59dee38ffcb3eb0958cdbc66615653490e9f07df
parenta8ef4e81e6f2b7ab77aa57b986742feba57d9d86 (diff)
downloadpostgresql-ee5b595493e1609903d55709853f5276ba85c81d.tar.gz
postgresql-ee5b595493e1609903d55709853f5276ba85c81d.zip
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
-rw-r--r--src/backend/commands/copy.c16
-rw-r--r--src/test/regress/expected/identity.out13
-rw-r--r--src/test/regress/sql/identity.sql17
3 files changed, 44 insertions, 2 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index ef301b6328a..156359476c8 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -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)
{
diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out
index 5fa585d6cc5..174b420a041 100644
--- a/src/test/regress/expected/identity.out
+++ b/src/test/regress/expected/identity.out
@@ -153,6 +153,19 @@ SELECT * FROM itest2;
3 |
(3 rows)
+-- COPY tests
+CREATE TABLE itest9 (a int GENERATED ALWAYS AS IDENTITY, b text, c bigint);
+COPY itest9 FROM stdin;
+COPY itest9 (b, c) FROM stdin;
+SELECT * FROM itest9 ORDER BY c;
+ a | b | c
+-----+------+-----
+ 100 | foo | 200
+ 101 | bar | 201
+ 1 | foo2 | 202
+ 2 | bar2 | 203
+(4 rows)
+
-- DROP IDENTITY tests
ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY;
ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY; -- error
diff --git a/src/test/regress/sql/identity.sql b/src/test/regress/sql/identity.sql
index e1b5a074c96..6e76dd08c86 100644
--- a/src/test/regress/sql/identity.sql
+++ b/src/test/regress/sql/identity.sql
@@ -78,6 +78,23 @@ UPDATE itest2 SET a = DEFAULT WHERE a = 2;
SELECT * FROM itest2;
+-- COPY tests
+
+CREATE TABLE itest9 (a int GENERATED ALWAYS AS IDENTITY, b text, c bigint);
+
+COPY itest9 FROM stdin;
+100 foo 200
+101 bar 201
+\.
+
+COPY itest9 (b, c) FROM stdin;
+foo2 202
+bar2 203
+\.
+
+SELECT * FROM itest9 ORDER BY c;
+
+
-- DROP IDENTITY tests
ALTER TABLE itest4 ALTER COLUMN a DROP IDENTITY;