summaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/pg_dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump/pg_dump.c')
-rw-r--r--src/bin/pg_dump/pg_dump.c103
1 files changed, 57 insertions, 46 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 9afacdb9002..7364a12c25e 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -15912,39 +15912,29 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
PGresult *res;
char *startv,
*incby,
- *maxv = NULL,
- *minv = NULL,
- *cache;
- char bufm[100],
- bufx[100];
+ *maxv,
+ *minv,
+ *cache,
+ *seqtype;
bool cycled;
+ bool is_ascending;
PQExpBuffer query = createPQExpBuffer();
PQExpBuffer delqry = createPQExpBuffer();
PQExpBuffer labelq = createPQExpBuffer();
- snprintf(bufm, sizeof(bufm), INT64_FORMAT, PG_INT64_MIN);
- snprintf(bufx, sizeof(bufx), INT64_FORMAT, PG_INT64_MAX);
-
if (fout->remoteVersion >= 100000)
{
/* Make sure we are in proper schema */
selectSourceSchema(fout, "pg_catalog");
appendPQExpBuffer(query,
- "SELECT seqstart, seqincrement, "
- "CASE WHEN seqincrement > 0 AND seqmax = %s THEN NULL "
- " WHEN seqincrement < 0 AND seqmax = -1 THEN NULL "
- " ELSE seqmax "
- "END AS seqmax, "
- "CASE WHEN seqincrement > 0 AND seqmin = 1 THEN NULL "
- " WHEN seqincrement < 0 AND seqmin = %s THEN NULL "
- " ELSE seqmin "
- "END AS seqmin, "
+ "SELECT format_type(seqtypid, NULL), "
+ "seqstart, seqincrement, "
+ "seqmax, seqmin, "
"seqcache, seqcycle "
"FROM pg_class c "
"JOIN pg_sequence s ON (s.seqrelid = c.oid) "
"WHERE c.oid = '%u'::oid",
- bufx, bufm,
tbinfo->dobj.catId.oid);
}
else if (fout->remoteVersion >= 80400)
@@ -15958,17 +15948,9 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
appendPQExpBuffer(query,
- "SELECT start_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, "
+ "SELECT 'bigint'::name AS sequence_type, "
+ "start_value, increment_by, max_value, min_value, "
"cache_value, is_cycled FROM %s",
- bufx, bufm,
fmtId(tbinfo->dobj.name));
}
else
@@ -15977,17 +15959,9 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
appendPQExpBuffer(query,
- "SELECT 0 AS start_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, "
+ "SELECT 'bigint'::name AS sequence_type, "
+ "0 AS start_value, increment_by, max_value, min_value, "
"cache_value, is_cycled FROM %s",
- bufx, bufm,
fmtId(tbinfo->dobj.name));
}
@@ -16002,14 +15976,48 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
exit_nicely(1);
}
- startv = PQgetvalue(res, 0, 0);
- incby = PQgetvalue(res, 0, 1);
- if (!PQgetisnull(res, 0, 2))
- maxv = PQgetvalue(res, 0, 2);
- if (!PQgetisnull(res, 0, 3))
- minv = PQgetvalue(res, 0, 3);
- cache = PQgetvalue(res, 0, 4);
- cycled = (strcmp(PQgetvalue(res, 0, 5), "t") == 0);
+ seqtype = PQgetvalue(res, 0, 0);
+ startv = PQgetvalue(res, 0, 1);
+ incby = PQgetvalue(res, 0, 2);
+ maxv = PQgetvalue(res, 0, 3);
+ minv = PQgetvalue(res, 0, 4);
+ cache = PQgetvalue(res, 0, 5);
+ cycled = (strcmp(PQgetvalue(res, 0, 6), "t") == 0);
+
+ is_ascending = incby[0] != '-';
+
+ if (is_ascending && atoi(minv) == 1)
+ minv = NULL;
+ if (!is_ascending && atoi(maxv) == -1)
+ maxv = NULL;
+
+ if (strcmp(seqtype, "smallint") == 0)
+ {
+ if (!is_ascending && atoi(minv) == PG_INT16_MIN)
+ minv = NULL;
+ if (is_ascending && atoi(maxv) == PG_INT16_MAX)
+ maxv = NULL;
+ }
+ else if (strcmp(seqtype, "integer") == 0)
+ {
+ if (!is_ascending && atoi(minv) == PG_INT32_MIN)
+ minv = NULL;
+ if (is_ascending && atoi(maxv) == PG_INT32_MAX)
+ maxv = NULL;
+ }
+ else if (strcmp(seqtype, "bigint") == 0)
+ {
+ char bufm[100],
+ bufx[100];
+
+ snprintf(bufm, sizeof(bufm), INT64_FORMAT, PG_INT64_MIN);
+ snprintf(bufx, sizeof(bufx), INT64_FORMAT, PG_INT64_MAX);
+
+ if (!is_ascending && strcmp(minv, bufm) == 0)
+ minv = NULL;
+ if (is_ascending && strcmp(maxv, bufx) == 0)
+ maxv = NULL;
+ }
/*
* DROP must be fully qualified in case same name appears in pg_catalog
@@ -16033,6 +16041,9 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
"CREATE SEQUENCE %s\n",
fmtId(tbinfo->dobj.name));
+ if (strcmp(seqtype, "bigint") != 0)
+ appendPQExpBuffer(query, " AS %s\n", seqtype);
+
if (fout->remoteVersion >= 80400)
appendPQExpBuffer(query, " START WITH %s\n", startv);