Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0e29d76

Browse files
committed
Don't bomb out on indexes on system attributes other than 'oid'.
(Not sure such an index is actually useful, but just because it'suseless doesn't mean pg_dump should coredump.)
1 parent8407bb3 commit0e29d76

File tree

1 file changed

+55
-31
lines changed

1 file changed

+55
-31
lines changed

‎src/bin/pg_dump/pg_dump.c

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*-------------------------------------------------------------------------
22
*
33
* pg_dump.c
4-
* pg_dump isan utility for dumping out a postgres database
4+
* pg_dump isa utility for dumping out a postgres database
55
* into a script file.
66
*
77
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
@@ -22,7 +22,7 @@
2222
*
2323
*
2424
* IDENTIFICATION
25-
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.202 2001/04/14 13:11:03 pjw Exp $
25+
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.203 2001/04/22 21:34:13 tgl Exp $
2626
*
2727
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
2828
*
@@ -194,6 +194,7 @@ static char *GetPrivileges(const char *s);
194194
staticintdumpBlobs(Archive*AH,char*,void*);
195195
staticintdumpDatabase(Archive*AH);
196196
staticPQExpBuffergetPKconstraint(TableInfo*tblInfo,IndInfo*indInfo);
197+
staticconstchar*getAttrName(intattrnum,TableInfo*tblInfo);
197198

198199
externchar*optarg;
199200
externintoptind,
@@ -3932,26 +3933,19 @@ getPKconstraint(TableInfo *tblInfo, IndInfo *indInfo)
39323933
{
39333934
PQExpBufferpkBuf=createPQExpBuffer();
39343935
intk;
3935-
intindkey;
3936-
3937-
resetPQExpBuffer(pkBuf);
39383936

39393937
appendPQExpBuffer(pkBuf,"Constraint %s Primary Key (",
39403938
tblInfo->primary_key_name);
39413939

3942-
39433940
for (k=0;k<INDEX_MAX_KEYS;k++)
39443941
{
3945-
char*attname;
3942+
intindkey;
3943+
constchar*attname;
39463944

39473945
indkey=atoi(indInfo->indkey[k]);
39483946
if (indkey==InvalidAttrNumber)
39493947
break;
3950-
indkey--;
3951-
if (indkey==ObjectIdAttributeNumber-1)
3952-
attname="oid";
3953-
else
3954-
attname=tblInfo->attnames[indkey];
3948+
attname=getAttrName(indkey,tblInfo);
39553949

39563950
appendPQExpBuffer(pkBuf,"%s%s",
39573951
(k==0) ?"" :", ",
@@ -3963,6 +3957,41 @@ getPKconstraint(TableInfo *tblInfo, IndInfo *indInfo)
39633957
returnpkBuf;
39643958
}
39653959

3960+
/*
3961+
* getAttrName: extract the correct name for an attribute
3962+
*
3963+
* The array tblInfo->attnames[] only provides names of user attributes;
3964+
* if a system attribute number is supplied, we have to fake it.
3965+
* We also do a little bit of bounds checking for safety's sake.
3966+
*/
3967+
staticconstchar*
3968+
getAttrName(intattrnum,TableInfo*tblInfo)
3969+
{
3970+
if (attrnum>0&&attrnum <=tblInfo->numatts)
3971+
returntblInfo->attnames[attrnum-1];
3972+
switch (attrnum)
3973+
{
3974+
caseSelfItemPointerAttributeNumber:
3975+
return"ctid";
3976+
caseObjectIdAttributeNumber:
3977+
return"oid";
3978+
caseMinTransactionIdAttributeNumber:
3979+
return"xmin";
3980+
caseMinCommandIdAttributeNumber:
3981+
return"cmin";
3982+
caseMaxTransactionIdAttributeNumber:
3983+
return"xmax";
3984+
caseMaxCommandIdAttributeNumber:
3985+
return"cmax";
3986+
caseTableOidAttributeNumber:
3987+
return"tableoid";
3988+
}
3989+
fprintf(stderr,"getAttrName(): Invalid attribute number %d for table %s\n",
3990+
attrnum,tblInfo->relname);
3991+
exit_nicely(g_conn);
3992+
returnNULL;/* keep compiler quiet */
3993+
}
3994+
39663995
/*
39673996
* dumpIndices:
39683997
* write out to fout all the user-define indices
@@ -3978,8 +4007,7 @@ dumpIndices(Archive *fout, IndInfo *indinfo, int numIndices,
39784007
char*classname[INDEX_MAX_KEYS];
39794008
char*funcname;/* the name of the function to comput the
39804009
* index key from */
3981-
intindkey,
3982-
indclass;
4010+
intindclass;
39834011
intnclass;
39844012

39854013
PQExpBufferq=createPQExpBuffer(),
@@ -4111,19 +4139,17 @@ dumpIndices(Archive *fout, IndInfo *indinfo, int numIndices,
41114139
resetPQExpBuffer(attlist);
41124140
for (k=0;k<INDEX_MAX_KEYS;k++)
41134141
{
4114-
char*attname;
4142+
intindkey;
4143+
constchar*attname;
41154144

41164145
indkey=atoi(indinfo[i].indkey[k]);
41174146
if (indkey==InvalidAttrNumber)
41184147
break;
4119-
indkey--;
4120-
if (indkey==ObjectIdAttributeNumber-1)
4121-
attname="oid";
4122-
else
4123-
attname=tblinfo[tableInd].attnames[indkey];
4148+
attname=getAttrName(indkey,&tblinfo[tableInd]);
41244149
if (funcname)
41254150
appendPQExpBuffer(attlist,"%s%s",
4126-
(k==0) ?"" :", ",fmtId(attname,force_quotes));
4151+
(k==0) ?"" :", ",
4152+
fmtId(attname,force_quotes));
41274153
else
41284154
{
41294155
if (k >=nclass)
@@ -4138,20 +4164,14 @@ dumpIndices(Archive *fout, IndInfo *indinfo, int numIndices,
41384164
appendPQExpBuffer(id1,fmtId(attname,force_quotes));
41394165
appendPQExpBuffer(id2,fmtId(classname[k],force_quotes));
41404166
appendPQExpBuffer(attlist,"%s%s %s",
4141-
(k==0) ?"" :", ",id1->data,id2->data);
4167+
(k==0) ?"" :", ",
4168+
id1->data,id2->data);
41424169
free(classname[k]);
41434170
}
41444171
}
41454172

41464173
if (!tablename|| (strcmp(indinfo[i].indrelname,tablename)==0)|| (strlen(tablename)==0))
41474174
{
4148-
4149-
/*
4150-
* We make the index belong to the owner of its table, which
4151-
* is not necessarily right but should answer 99% of the time.
4152-
* Would have to add owner name to IndInfo to do it right.
4153-
*/
4154-
41554175
resetPQExpBuffer(id1);
41564176
resetPQExpBuffer(id2);
41574177
appendPQExpBuffer(id1,fmtId(indinfo[i].indexrelname,force_quotes));
@@ -4178,11 +4198,15 @@ dumpIndices(Archive *fout, IndInfo *indinfo, int numIndices,
41784198
else
41794199
appendPQExpBuffer(q," %s );\n",attlist->data);
41804200

4181-
/* Dump Index Comments */
4182-
4201+
/*
4202+
* We make the index belong to the owner of its table, which
4203+
* is not necessarily right but should answer 99% of the time.
4204+
* Would have to add owner name to IndInfo to do it right.
4205+
*/
41834206
ArchiveEntry(fout,tblinfo[tableInd].oid,id1->data,"INDEX",NULL,q->data,delq->data,
41844207
"",tblinfo[tableInd].usename,NULL,NULL);
41854208

4209+
/* Dump Index Comments */
41864210
resetPQExpBuffer(q);
41874211
appendPQExpBuffer(q,"INDEX %s",id1->data);
41884212
dumpComment(fout,q->data,indinfo[i].indoid);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp