Skip site navigation (1) Skip section navigation (2)

Re: [HACKERS] odd pg_dump output?

From: Tatsuo Ishii <t-ishii(at)sra(dot)co(dot)jp>
To: Bruce Momjian <maillist(at)candle(dot)pha(dot)pa(dot)us>
Cc: t-ishii(at)sra(dot)co(dot)jp, hackers(at)postgreSQL(dot)org
Subject: Re: [HACKERS] odd pg_dump output?
Date: 1998-08-29 14:52:52
Message-ID: 199808291452.XAA29626@srapc451.sra.co.jp (view raw or flat)
Thread:
Lists: 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(at)sra(dot)co(dot)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)
  			{

Responses

pgsql-hackers by date

Next:From: Thomas G. LockhartDate: 1998-08-29 15:14:39
Subject: Re: [DOCS] Re: [HACKERS] vacuum problem
Previous:From: D'Arcy J.M. CainDate: 1998-08-29 10:36:19
Subject: Re: [HACKERS] IP data type

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group