Re: [HACKERS] fix pg_dump to dump sequences created by SERIAL datatype

From: Bruce Momjian <maillist(at)candle(dot)pha(dot)pa(dot)us>
To: brook(at)trillium(dot)NMSU(dot)Edu (Brook Milligan)
Cc: hackers(at)postgreSQL(dot)org, patches(at)postgreSQL(dot)org
Subject: Re: [HACKERS] fix pg_dump to dump sequences created by SERIAL datatype
Date: 1999-01-18 04:59:55
Message-ID: 199901180459.XAA09612@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message D'Arcy J.M. Cain 1999-01-18 05:18:16 Syntax errors in current tree
Previous Message Vadim Mikheev 1999-01-18 04:54:44 Re: [HACKERS] Postgres Speed or lack thereof