Re: [HACKERS] odd pg_dump output? - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: [HACKERS] odd pg_dump output?
Date
Msg-id 199808291806.OAA10850@candle.pha.pa.us
Whole thread Raw
In response to Re: [HACKERS] odd pg_dump output?  (Tatsuo Ishii <t-ishii@sra.co.jp>)
List pgsql-hackers
Patch applied.


> >This appears to be fixed.  Beta is September 1.
>
> Ok. BTW Mr. Kataoka who is maintaing Japanese version of PostgreSQL
> ODBC driver have found a bug in 6.3.2 pg_dump and have made patches. I
> confirmed that the same bug still exists in the current source
> tree. So I made up patches based on Kataoka's. Here are some
> explanations.
>
> o fmtId() returns pointer to a static memory in it. In the meantime
> there is a line where is fmtId() called twice without saving the first
> value returned by fmtId(). So second call to fmtId() will break the
> first one.
>
> o findTableByName() looks up a table by its name. if a table name
> contanins upper letters or non ascii chars, fmtId() will returns a
> name quoted in double quotes, which will not what findTableByName()
> wants. The result is SEG fault.
> --
> Tatsuo Ishii
> t-ishii@sra.co.jp
>
> *** pg_dump.c.orig    Wed Aug 26 00:02:04 1998
> --- pg_dump.c    Sat Aug 29 22:34:24 1998
> ***************
> *** 2435,2441 ****
>       int            i,
>                   j,
>                   k;
> !     char        q[MAXQUERYLEN];
>       char      **parentRels;        /* list of names of parent relations */
>       int            numParents;
>       int            actual_atts;    /* number of attrs in this CREATE statment */
> --- 2435,2443 ----
>       int            i,
>                   j,
>                   k;
> !     char        q[MAXQUERYLEN],
> !                 id1[MAXQUERYLEN],
> !                 id2[MAXQUERYLEN];
>       char      **parentRels;        /* list of names of parent relations */
>       int            numParents;
>       int            actual_atts;    /* number of attrs in this CREATE statment */
> ***************
> *** 2506,2516 ****
>                       }
>                       else
>                       {
>                           sprintf(q, "%s%s%s %s",
>                                   q,
>                                   (actual_atts > 0) ? ", " : "",
> !                                 fmtId(tblinfo[i].attnames[j]),
> !                                 fmtId(tblinfo[i].typnames[j]));
>                           actual_atts++;
>                       }
>                       if (tblinfo[i].adef_expr[j] != NULL)
> --- 2508,2520 ----
>                       }
>                       else
>                       {
> +                          strcpy(id1, fmtId(tblinfo[i].attnames[j]));
> +                          strcpy(id2, fmtId(tblinfo[i].typnames[j]));
>                           sprintf(q, "%s%s%s %s",
>                                   q,
>                                   (actual_atts > 0) ? ", " : "",
> !                             id1,
> !                             id2);
>                           actual_atts++;
>                       }
>                       if (tblinfo[i].adef_expr[j] != NULL)
> ***************
> *** 2572,2584 ****
>                   indclass;
>       int            nclass;
>
> !     char        q[MAXQUERYLEN];
>       PGresult   *res;
>
>       for (i = 0; i < numIndices; i++)
>       {
>           tableInd = findTableByName(tblinfo, numTables,
> !                                    fmtId(indinfo[i].indrelname));
>
>           if (strcmp(indinfo[i].indproc, "0") == 0)
>               funcname = NULL;
> --- 2576,2590 ----
>                   indclass;
>       int            nclass;
>
> !     char        q[MAXQUERYLEN],
> !                 id1[MAXQUERYLEN],
> !                 id2[MAXQUERYLEN];
>       PGresult   *res;
>
>       for (i = 0; i < numIndices; i++)
>       {
>           tableInd = findTableByName(tblinfo, numTables,
> !                        (indinfo[i].indrelname));
>
>           if (strcmp(indinfo[i].indproc, "0") == 0)
>               funcname = NULL;
> ***************
> *** 2659,2666 ****
>                               attname, indinfo[i].indexrelname);
>                       exit_nicely(g_conn);
>                   }
>                   sprintf(attlist + strlen(attlist), "%s%s %s",
> !                         (k == 0) ? "" : ", ", fmtId(attname), fmtId(classname[k]));
>                   free(classname[k]);
>               }
>           }
> --- 2665,2674 ----
>                               attname, indinfo[i].indexrelname);
>                       exit_nicely(g_conn);
>                   }
> +                 strcpy(id1, fmtId(attname));
> +                 strcpy(id2, fmtId(classname[k]));
>                   sprintf(attlist + strlen(attlist), "%s%s %s",
> !                         (k == 0) ? "" : ", ", id1, id2);
>                   free(classname[k]);
>               }
>           }
> ***************
> *** 2668,2677 ****
>           if (!tablename || (!strcmp(indinfo[i].indrelname, tablename)))
>           {
>
>               sprintf(q, "CREATE %s INDEX %s on %s using %s (",
>                 (strcmp(indinfo[i].indisunique, "t") == 0) ? "UNIQUE" : "",
> !                     fmtId(indinfo[i].indexrelname),
> !                     fmtId(indinfo[i].indrelname),
>                       indinfo[i].indamname);
>               if (funcname)
>               {
> --- 2676,2687 ----
>           if (!tablename || (!strcmp(indinfo[i].indrelname, tablename)))
>           {
>
> +             strcpy(id1, fmtId(indinfo[i].indexrelname));
> +             strcpy(id2, fmtId(indinfo[i].indrelname));
>               sprintf(q, "CREATE %s INDEX %s on %s using %s (",
>                 (strcmp(indinfo[i].indisunique, "t") == 0) ? "UNIQUE" : "",
> !                     id1,
> !                     id2,
>                       indinfo[i].indamname);
>               if (funcname)
>               {
>


--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
  +  If your life is a hard drive,     |  (610) 353-9879(w)
  +  Christ can be your backup.        |  (610) 853-3000(h)

pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] IP data type
Next
From: Bruce Momjian
Date:
Subject: Re: [DOCS] Re: [HACKERS] vacuum problem