diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index bca6512cef..74068181e4 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.92 2003/03/20 03:34:55 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.93 2003/03/20 05:18:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -24,19 +24,6 @@ #include "utils/acl.h" #include "utils/builtins.h" - -#ifndef INT64_IS_BUSTED -#ifdef HAVE_LL_CONSTANTS -#define SEQ_MAXVALUE ((int64) 0x7FFFFFFFFFFFFFFFLL) -#else -#define SEQ_MAXVALUE ((int64) 0x7FFFFFFFFFFFFFFF) -#endif -#else /* INT64_IS_BUSTED */ -#define SEQ_MAXVALUE ((int64) 0x7FFFFFFF) -#endif /* INT64_IS_BUSTED */ - -#define SEQ_MINVALUE (-SEQ_MAXVALUE) - /* * We don't want to log each fetching of a value from a sequence, * so we pre-log a few fetches in advance. In the event of diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 41c7a66762..38677f1d36 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -12,7 +12,7 @@ * by PostgreSQL * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.319 2003/03/10 22:28:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.320 2003/03/20 05:18:14 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -52,6 +52,8 @@ int optreset; #include "catalog/pg_trigger.h" #include "catalog/pg_type.h" +#include "commands/sequence.h" + #include "libpq-fe.h" #include "libpq/libpq-fs.h" @@ -5986,9 +5988,11 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, PGresult *res; char *last, *incby, - *maxv, - *minv, + *maxv = NULL, + *minv = NULL, *cache; + char bufm[100], + bufx[100]; bool cycled, called; PQExpBuffer query = createPQExpBuffer(); @@ -5997,9 +6001,21 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, /* Make sure we are in proper schema */ selectSourceSchema(tbinfo->relnamespace->nspname); + snprintf(bufm, sizeof(bufm), INT64_FORMAT, SEQ_MINVALUE); + snprintf(bufx, sizeof(bufx), INT64_FORMAT, SEQ_MAXVALUE); + appendPQExpBuffer(query, - "SELECT sequence_name, last_value, increment_by, max_value, " - "min_value, cache_value, is_cycled, is_called from %s", + "SELECT sequence_name, last_value, increment_by, " + "CASE WHEN increment_by > 0 AND max_value = %s THEN NULL " + " WHEN increment_by < 0 AND max_value = -1 THEN NULL " + " ELSE max_value " + "END AS max_value, " + "CASE WHEN increment_by > 0 AND min_value = 1 THEN NULL " + " WHEN increment_by < 0 AND min_value = %s THEN NULL " + " ELSE min_value " + "END AS min_value, " + "cache_value, is_cycled, is_called from %s", + bufx, bufm, fmtId(tbinfo->relname)); res = PQexec(g_conn, query->data); @@ -6028,8 +6044,10 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, last = PQgetvalue(res, 0, 1); incby = PQgetvalue(res, 0, 2); - maxv = PQgetvalue(res, 0, 3); - minv = PQgetvalue(res, 0, 4); + if (!PQgetisnull(res, 0, 3)) + maxv = PQgetvalue(res, 0, 3); + if (!PQgetisnull(res, 0, 4)) + minv = PQgetvalue(res, 0, 4); cache = PQgetvalue(res, 0, 5); cycled = (strcmp(PQgetvalue(res, 0, 6), "t") == 0); called = (strcmp(PQgetvalue(res, 0, 7), "t") == 0); @@ -6060,12 +6078,23 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, resetPQExpBuffer(query); appendPQExpBuffer(query, - "CREATE SEQUENCE %s\n START %s\n INCREMENT %s\n" - " MAXVALUE %s\n MINVALUE %s\n CACHE %s%s;\n", + "CREATE SEQUENCE %s\n START WITH %s\n INCREMENT BY %s\n", fmtId(tbinfo->relname), - (called ? minv : last), - incby, maxv, minv, cache, - (cycled ? "\n CYCLE" : "")); + (called ? minv : last), incby); + + if (maxv) + appendPQExpBuffer(query, " MAXVALUE %s\n", maxv); + else + appendPQExpBuffer(query, " NO MAXVALUE\n"); + + if (minv) + appendPQExpBuffer(query, " MINVALUE %s\n", minv); + else + appendPQExpBuffer(query, " NO MINVALUE\n"); + + appendPQExpBuffer(query, + " CACHE %s%s;\n", + cache, (cycled ? "\n CYCLE" : "")); ArchiveEntry(fout, tbinfo->oid, tbinfo->relname, tbinfo->relnamespace->nspname, tbinfo->usename, diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index e8bf2bf75e..d4513de8c2 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: sequence.h,v 1.21 2002/06/20 20:29:49 momjian Exp $ + * $Id: sequence.h,v 1.22 2003/03/20 05:18:15 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -89,4 +89,17 @@ extern void seq_redo(XLogRecPtr lsn, XLogRecord *rptr); extern void seq_undo(XLogRecPtr lsn, XLogRecord *rptr); extern void seq_desc(char *buf, uint8 xl_info, char *rec); +/* Set the upper and lower bounds of a sequence */ +#ifndef INT64_IS_BUSTED +#ifdef HAVE_LL_CONSTANTS +#define SEQ_MAXVALUE ((int64) 0x7FFFFFFFFFFFFFFFLL) +#else +#define SEQ_MAXVALUE ((int64) 0x7FFFFFFFFFFFFFFF) +#endif +#else /* INT64_IS_BUSTED */ +#define SEQ_MAXVALUE ((int64) 0x7FFFFFFF) +#endif /* INT64_IS_BUSTED */ + +#define SEQ_MINVALUE (-SEQ_MAXVALUE) + #endif /* SEQUENCE_H */