fix pg_dump to dump sequences created by SERIAL datatype - Mailing list pgsql-hackers

From Brook Milligan
Subject fix pg_dump to dump sequences created by SERIAL datatype
Date
Msg-id 199901131724.KAA27779@trillium.nmsu.edu
Whole thread Raw
Responses Re: [HACKERS] fix pg_dump to dump sequences created by SERIAL datatype  (Bruce Momjian <maillist@candle.pha.pa.us>)
List pgsql-hackers
As it stands in 6.4.2 pg_dump does not dump sequences created by the
SERIAL datatype when the -t tablename option is used.  The following
patch fixes that (with a couple of cosmetic cleanups) so that whenever
the -t option is used, the appropriate *_id_seq sequence is also
dumped if it exists.

The second patch just fixes a bunch of cosmetic details concerning
alignment and changes nothing substantive in the code.

Cheers,
Brook

===========================================================================

--- bin/pg_dump/pg_dump.c.orig    Wed Jan 13 09:37:40 1999
+++ bin/pg_dump/pg_dump.c    Wed Jan 13 10:08:35 1999
@@ -2593,17 +2592,26 @@    int            i,                j,                k;
-    char        q[MAXQUERYLEN];
-    char      **parentRels;        /* list of names of parent relations */
+    char            q[MAXQUERYLEN];
+    char            *serialSeq = NULL;        /* implicit sequence name created by SERIAL datatype */
+    const char        *serialSeqSuffix = "_id_seq";    /* suffix for implicit SERIAL sequences */
+    char            **parentRels;            /* list of names of parent relations */    int            numParents;
-    int            actual_atts;    /* number of attrs in this CREATE statment */
+    int            actual_atts;            /* number of attrs in this CREATE statment */    /* First - dump SEQUENCEs
*/
+    if (tablename)
+      {
+        serialSeq = malloc (strlen (tablename) + strlen (serialSeqSuffix) + 1);
+        strcpy (serialSeq, tablename);
+        strcat (serialSeq, serialSeqSuffix);
+      }    for (i = 0; i < numTables; i++)    {        if (!(tblinfo[i].sequence))            continue;
-        if (!tablename || (!strcmp(tblinfo[i].relname, tablename)))
+        if (!tablename || (!strcmp(tblinfo[i].relname, tablename))
+            || (serialSeq && !strcmp(tblinfo[i].relname,serialSeq)))        {            becomeUser(fout,
tblinfo[i].usename);           dumpSequence(fout, tblinfo[i]);
 
@@ -2611,6 +2619,8 @@                dumpACL(fout, tblinfo[i]);        }    }
+    if (tablename)
+      free (serialSeq);    for (i = 0; i < numTables; i++)    {

===========================================================================

--- bin/pg_dump/pg_dump.c.orig    Wed Jan 13 09:37:40 1999
+++ bin/pg_dump/pg_dump.c    Wed Jan 13 10:08:35 1999
@@ -56,7 +56,7 @@#include <stdio.h>#include <string.h>#include <ctype.h>
-#include <sys/param.h>            /* for MAXHOSTNAMELEN on most */
+#include <sys/param.h>                /* for MAXHOSTNAMELEN on most */#ifdef solaris_sparc#include <netdb.h>
    /* for MAXHOSTNAMELEN on some */#endif
 
@@ -96,25 +96,25 @@static char *GetPrivileges(const char *s);static void becomeUser(FILE *fout, const char *username);
-extern char *optarg;
+extern char    *optarg;extern int    optind,
-            opterr;
+        opterr;/* global decls */bool        g_verbose;            /* User wants verbose narration of our
-                                 * activities. */
-int            g_last_builtin_oid; /* value of the last builtin oid */
-FILE       *g_fout;                /* the script file */
-PGconn       *g_conn;                /* the database connection */
-
-bool        force_quotes;        /* User wants to suppress double-quotes */
-int            dumpData;            /* dump data using proper insert strings */
-int            attrNames;            /* put attr names into insert strings */
-int            schemaOnly;
-int            dataOnly;
-int            aclsOption;
+                         * activities. */
+int        g_last_builtin_oid;        /* value of the last builtin oid */
+FILE        *g_fout;            /* the script file */
+PGconn        *g_conn;            /* the database connection */
+
+bool        force_quotes;            /* User wants to suppress double-quotes */
+int        dumpData;            /* dump data using proper insert strings */
+int        attrNames;            /* put attr names into insert strings */
+int        schemaOnly;
+int        dataOnly;
+int        aclsOption;
-char        g_opaque_type[10];    /* name for the opaque type */
+char        g_opaque_type[10];        /* name for the opaque type *//* placeholders for the delimiters for comments
*/char       g_comment_start[10];
 
@@ -179,8 +179,8 @@static boolisViewRule(char *relname){
-    PGresult   *res;
-    int            ntups;
+    PGresult    *res;
+    int        ntups;    char        query[MAXQUERYLEN];    res = PQexec(g_conn, "begin");
@@ -315,13 +315,13 @@                     const TableInfo tblinfo, bool oids){
-    PGresult   *res;
+    PGresult    *res;    char        query[255];
-    int            actual_atts;    /* number of attrs in this a table */
+    int        actual_atts;    /* number of attrs in this a table */    char        expandbuf[COPYBUFSIZ];    char
  q[MAXQUERYLEN];
 
-    int            tuple;
-    int            field;
+    int        tuple;
+    int        field;    sprintf(query, "SELECT * FROM %s", fmtId(classname, force_quotes));    res = PQexec(g_conn,
query);
@@ -421,7 +421,7 @@{    int            i;
-    char       *all_only;
+    char            *all_only;    if (onlytable == NULL)        all_only = "all";
@@ -482,12 +482,11 @@prompt_for_password(char *username, char *password){    char        buf[512];
-    int            length;
+    int        length;#ifdef HAVE_TERMIOS_H
-    struct termios t_orig,
-                t;
-
+    struct termios    t_orig,
+            t;#endif    printf("Username: ");
@@ -535,21 +534,21 @@intmain(int argc, char **argv){
-    int            c;
-    const char *progname;
-    const char *filename = NULL;
-    const char *dbname = NULL;
-    const char *pghost = NULL;
-    const char *pgport = NULL;
-    char       *tablename = NULL;
-    int            oids = 0;
-    TableInfo  *tblinfo;
-    int            numTables;
+    int        c;
+    const char    *progname;
+    const char    *filename = NULL;
+    const char    *dbname = NULL;
+    const char    *pghost = NULL;
+    const char    *pgport = NULL;
+    char        *tablename = NULL;
+    int        oids = 0;
+    TableInfo    *tblinfo;
+    int        numTables;    char        connect_string[512] = "";    char        tmp_string[128];    char
username[100];   char        password[100];
 
-    int            use_password = 0;
+    int        use_password = 0;    g_verbose = false;    force_quotes = true;
@@ -727,11 +726,11 @@TypeInfo   *getTypes(int *numTypes){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            i;
-    char        query[MAXQUERYLEN];
-    TypeInfo   *tinfo;
+    char            query[MAXQUERYLEN];
+    TypeInfo        *tinfo;    int            i_oid;    int            i_typowner;
@@ -856,12 +855,12 @@OprInfo    *getOperators(int *numOprs){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            i;
-    char        query[MAXQUERYLEN];
+    char            query[MAXQUERYLEN];
-    OprInfo    *oprinfo;
+    OprInfo            *oprinfo;    int            i_oid;    int            i_oprname;
@@ -1199,11 +1198,11 @@AggInfo    *getAggregates(int *numAggs){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            i;
-    char        query[MAXQUERYLEN];
-    AggInfo    *agginfo;
+    char            query[MAXQUERYLEN];
+    AggInfo            *agginfo;    int            i_oid;    int            i_aggname;
@@ -1293,11 +1292,11 @@FuncInfo   *getFuncs(int *numFuncs){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            i;
-    char        query[MAXQUERYLEN];
-    FuncInfo   *finfo;
+    char            query[MAXQUERYLEN];
+    FuncInfo        *finfo;    int            i_oid;    int            i_proname;
@@ -1393,11 +1392,11 @@TableInfo  *getTables(int *numTables, FuncInfo *finfo, int numFuncs){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            i;
-    char        query[MAXQUERYLEN];
-    TableInfo  *tblinfo;
+    char            query[MAXQUERYLEN];
+    TableInfo        *tblinfo;    int            i_oid;    int            i_relname;
@@ -1726,11 +1725,11 @@InhInfo    *getInherits(int *numInherits){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            i;
-    char        query[MAXQUERYLEN];
-    InhInfo    *inhinfo;
+    char            query[MAXQUERYLEN];
+    InhInfo            *inhinfo;    int            i_inhrel;    int            i_inhparent;
@@ -1791,13 +1790,13 @@{    int            i,                j;
-    char        q[MAXQUERYLEN];
+    char            q[MAXQUERYLEN];    int            i_attname;    int            i_typname;    int
i_atttypmod;   int            i_attnotnull;    int            i_atthasdef;
 
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    for (i = 0; i < numTables; i++)
@@ -1902,10 +1901,10 @@getIndices(int *numIndices){    int            i;
-    char        query[MAXQUERYLEN];
-    PGresult   *res;
+    char            query[MAXQUERYLEN];
+    PGresult        *res;    int            ntups;
-    IndInfo    *indinfo;
+    IndInfo            *indinfo;    int            i_indexrelname;    int            i_indrelname;
@@ -1994,7 +1993,7 @@          TypeInfo *tinfo, int numTypes){    int            i;
-    char        q[MAXQUERYLEN];
+    char            q[MAXQUERYLEN];    int            funcInd;    for (i = 0; i < numTypes; i++)
@@ -2167,7 +2166,7 @@            TypeInfo *tinfo, int numTypes){    char        q[MAXQUERYLEN];
-    int            j;
+    int        j;    char        *func_def;    char        func_lang[NAMEDATALEN + 1];
@@ -2268,7 +2267,7 @@dumpOprs(FILE *fout, OprInfo *oprinfo, int numOperators,         TypeInfo *tinfo, int numTypes){
-    int            i;
+    int        i;    char        q[MAXQUERYLEN];    char        leftarg[MAXQUERYLEN];    char
rightarg[MAXQUERYLEN];
@@ -2375,14 +2374,14 @@dumpAggs(FILE *fout, AggInfo *agginfo, int numAggs,         TypeInfo *tinfo, int numTypes){
-    int            i;
+    int        i;    char        q[MAXQUERYLEN];    char        sfunc1[MAXQUERYLEN];    char
sfunc2[MAXQUERYLEN];   char        basetype[MAXQUERYLEN];    char        finalfunc[MAXQUERYLEN];    char
comma1[2],
-                comma2[2];
+            comma2[2];    for (i = 0; i < numAggs; i++)    {
@@ -2514,9 +2513,9 @@{    const char *acls = tbinfo.relacl;    char       *aclbuf,
-               *tok,
-               *eqpos,
-               *priv;
+           *tok,
+           *eqpos,
+           *priv;    if (strlen(acls) == 0)        return;                    /* table has default permissions */
@@ -2726,15 +2736,15 @@    int            i,                k;    int            tableInd;
-    char        attlist[1000];
-    char       *classname[INDEX_MAX_KEYS];
-    char       *funcname;        /* the name of the function to comput the
-                                 * index key from */
+    char            attlist[1000];
+    char            *classname[INDEX_MAX_KEYS];
+    char            *funcname;        /* the name of the function to comput the
+                             * index key from */    int            indkey,                indclass;    int
nclass;
-    char        q[MAXQUERYLEN],
+    char            q[MAXQUERYLEN],                id1[MAXQUERYLEN],                id2[MAXQUERYLEN];    PGresult
*res;
@@ -2887,7 +2897,7 @@                k;    int            m,                n;
-    char      **outVals = NULL; /* values to copy out */
+    char            **outVals = NULL; /* values to copy out */    n = PQntuples(res);    m = PQnfields(res);
@@ -2940,7 +2950,7 @@static voidsetMaxOid(FILE *fout){
-    PGresult   *res;
+    PGresult        *res;    Oid            max_oid;    res = PQexec(g_conn, "CREATE TABLE pgdump_oid (dummy int4)");
@@ -2993,7 +3003,7 @@static intfindLastBuiltinOid(void){
-    PGresult   *res;
+    PGresult        *res;    int            ntups;    int            last_oid;
@@ -3025,9 +3035,9 @@static char *checkForQuote(const char *s){
-    char       *r;
+    char        *r;    char        c;
-    char       *result;
+    char        *result;    int            j = 0;
@@ -3056,16 +3066,16 @@static voiddumpSequence(FILE *fout, TableInfo tbinfo){
-    PGresult   *res;
-    int4        last,
+    PGresult        *res;
+    int4            last,                incby,                maxv,                minv,                cache;
-    char        cycled,
+    char            cycled,                called,
-               *t;
-    char        query[MAXQUERYLEN];
+                *t;
+    char            query[MAXQUERYLEN];    sprintf(query,            "SELECT sequence_name, last_value, increment_by,
max_value,"
 


pgsql-hackers by date:

Previous
From: "Thomas G. Lockhart"
Date:
Subject: Re: [HACKERS] CVS Branch Retrieval?
Next
From: Tom Lane
Date:
Subject: Re: [HACKERS] SUM() and GROUP BY