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: