Re: [HACKERS] fix pg_dump to dump sequences created by SERIAL datatype - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: [HACKERS] fix pg_dump to dump sequences created by SERIAL datatype
Date
Msg-id 199901180459.XAA09612@candle.pha.pa.us
Whole thread Raw
In response to fix pg_dump to dump sequences created by SERIAL datatype  (Brook Milligan <brook@trillium.NMSU.Edu>)
List pgsql-hackers
Applied.

> 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 bool
>  isViewRule(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 @@
>  int
>  main(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 void
>  setMaxOid(FILE *fout)
>  {
> -    PGresult   *res;
> +    PGresult        *res;
>      Oid            max_oid;
>  
>      res = PQexec(g_conn, "CREATE TABLE pgdump_oid (dummy int4)");
> @@ -2993,7 +3003,7 @@
>  static int
>  findLastBuiltinOid(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 void
>  dumpSequence(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, "
> 
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


pgsql-hackers by date:

Previous
From: Vadim Mikheev
Date:
Subject: Re: [HACKERS] Postgres Speed or lack thereof
Next
From: "D'Arcy" "J.M." Cain
Date:
Subject: Syntax errors in current tree