aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/sequence.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2018-03-07 14:38:35 -0500
committerPeter Eisentraut <peter_e@gmx.net>2018-03-13 09:41:30 -0400
commit377b5ac4845c5ffbf992ee95c32d7d16d38b9081 (patch)
tree1db979dde0c8843cd2c1bebbedf345744595edf8 /src/backend/commands/sequence.c
parent1f8a3327a9db9a8a662fb39fdcde2337acffa68c (diff)
downloadpostgresql-377b5ac4845c5ffbf992ee95c32d7d16d38b9081.tar.gz
postgresql-377b5ac4845c5ffbf992ee95c32d7d16d38b9081.zip
Fix CREATE TABLE / LIKE with bigint identity column
CREATE TABLE / LIKE with a bigint identity column would fail on platforms where long is 32 bits. Copying the sequence values used makeInteger(), which would truncate the 64-bit sequence data to 32 bits. To fix, use makeFloat() instead, like the parser. (This does not actually make use of floats, but stores the values as strings.) Bug: #15096 Reviewed-by: Michael Paquier <michael@paquier.xyz>
Diffstat (limited to 'src/backend/commands/sequence.c')
-rw-r--r--src/backend/commands/sequence.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index ef3ca8c00b7..dcc0aa536a0 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -1752,12 +1752,19 @@ sequence_options(Oid relid)
elog(ERROR, "cache lookup failed for sequence %u", relid);
pgsform = (Form_pg_sequence) GETSTRUCT(pgstuple);
- options = lappend(options, makeDefElem("cache", (Node *) makeInteger(pgsform->seqcache), -1));
- options = lappend(options, makeDefElem("cycle", (Node *) makeInteger(pgsform->seqcycle), -1));
- options = lappend(options, makeDefElem("increment", (Node *) makeInteger(pgsform->seqincrement), -1));
- options = lappend(options, makeDefElem("maxvalue", (Node *) makeInteger(pgsform->seqmax), -1));
- options = lappend(options, makeDefElem("minvalue", (Node *) makeInteger(pgsform->seqmin), -1));
- options = lappend(options, makeDefElem("start", (Node *) makeInteger(pgsform->seqstart), -1));
+ /* Use makeFloat() for 64-bit integers, like gram.y does. */
+ options = lappend(options,
+ makeDefElem("cache", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqcache)), -1));
+ options = lappend(options,
+ makeDefElem("cycle", (Node *) makeInteger(pgsform->seqcycle), -1));
+ options = lappend(options,
+ makeDefElem("increment", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqincrement)), -1));
+ options = lappend(options,
+ makeDefElem("maxvalue", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqmax)), -1));
+ options = lappend(options,
+ makeDefElem("minvalue", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqmin)), -1));
+ options = lappend(options,
+ makeDefElem("start", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqstart)), -1));
ReleaseSysCache(pgstuple);