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

From Tatsuo Ishii
Subject Re: [HACKERS] odd pg_dump output?
Date
Msg-id 199808291452.XAA29626@srapc451.sra.co.jp
Whole thread Raw
In response to Re: [HACKERS] odd pg_dump output?  (Bruce Momjian <maillist@candle.pha.pa.us>)
Responses Re: [HACKERS] odd pg_dump output?
List pgsql-hackers
>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)
              {

pgsql-hackers by date:

Previous
From: darcy@druid.net (D'Arcy J.M. Cain)
Date:
Subject: Re: [HACKERS] IP data type
Next
From: "Thomas G. Lockhart"
Date:
Subject: Re: [DOCS] Re: [HACKERS] vacuum problem