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

Commitbbcd016

Browse files
committed
DROP ... IF EXISTS for the following cases: language, tablespace, trigger, rule, opclass, function, aggregate. operator, and cast.
1 parente79cc2d commitbbcd016

File tree

15 files changed

+271
-58
lines changed

15 files changed

+271
-58
lines changed

‎src/backend/commands/aggregatecmds.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.34 2006/04/15 17:45:33 tgl Exp $
12+
* $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.35 2006/06/16 20:23:44 adunstan Exp $
1313
*
1414
* DESCRIPTION
1515
* The "DefineFoo" routines take the parse tree and pick out the
@@ -211,7 +211,21 @@ RemoveAggregate(RemoveFuncStmt *stmt)
211211
ObjectAddressobject;
212212

213213
/* Look up function and make sure it's an aggregate */
214-
procOid=LookupAggNameTypeNames(aggName,aggArgs, false);
214+
procOid=LookupAggNameTypeNames(aggName,aggArgs,stmt->missing_ok);
215+
216+
if (!OidIsValid(procOid))
217+
{
218+
/* we only get here if stmt->missing_ok is true */
219+
220+
/* XXX might need better message here */
221+
222+
ereport(NOTICE,
223+
(errmsg("aggregate %s does not exist ... skipping",
224+
stmt->name)));
225+
226+
227+
return;
228+
}
215229

216230
/*
217231
* Find the function tuple, do permissions and validity checks

‎src/backend/commands/functioncmds.c

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.74 2006/04/15 17:45:34 tgl Exp $
13+
* $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.75 2006/06/16 20:23:44 adunstan Exp $
1414
*
1515
* DESCRIPTION
1616
* These routines take the parse tree and pick out the
@@ -687,7 +687,16 @@ RemoveFunction(RemoveFuncStmt *stmt)
687687
/*
688688
* Find the function, do permissions and validity checks
689689
*/
690-
funcOid=LookupFuncNameTypeNames(functionName,argTypes, false);
690+
funcOid=LookupFuncNameTypeNames(functionName,argTypes,stmt->missing_ok);
691+
if (stmt->missing_ok&&!OidIsValid(funcOid))
692+
{
693+
ereport(NOTICE,
694+
(errmsg("function %s(%s) does not exist ... skipping",
695+
NameListToString(functionName),
696+
NameListToString(argTypes))));
697+
return;
698+
}
699+
691700

692701
tup=SearchSysCache(PROCOID,
693702
ObjectIdGetDatum(funcOid),
@@ -1377,6 +1386,7 @@ DropCast(DropCastStmt *stmt)
13771386
HeapTupletuple;
13781387
ObjectAddressobject;
13791388

1389+
/* when dropping a cast, the types must exist even if you use IF EXISTS */
13801390
sourcetypeid=typenameTypeId(NULL,stmt->sourcetype);
13811391
targettypeid=typenameTypeId(NULL,stmt->targettype);
13821392

@@ -1385,11 +1395,23 @@ DropCast(DropCastStmt *stmt)
13851395
ObjectIdGetDatum(targettypeid),
13861396
0,0);
13871397
if (!HeapTupleIsValid(tuple))
1388-
ereport(ERROR,
1389-
(errcode(ERRCODE_UNDEFINED_OBJECT),
1390-
errmsg("cast from type %s to type %s does not exist",
1391-
TypeNameToString(stmt->sourcetype),
1392-
TypeNameToString(stmt->targettype))));
1398+
{
1399+
if (!stmt->missing_ok)
1400+
ereport(ERROR,
1401+
(errcode(ERRCODE_UNDEFINED_OBJECT),
1402+
errmsg("cast from type %s to type %s does not exist",
1403+
TypeNameToString(stmt->sourcetype),
1404+
TypeNameToString(stmt->targettype))));
1405+
else
1406+
ereport(NOTICE,
1407+
(errmsg("cast from type %s to type %s does not exist ... skipping",
1408+
TypeNameToString(stmt->sourcetype),
1409+
TypeNameToString(stmt->targettype))));
1410+
1411+
return;
1412+
}
1413+
1414+
13931415

13941416
/* Permission check */
13951417
if (!pg_type_ownercheck(sourcetypeid,GetUserId())

‎src/backend/commands/opclasscmds.c

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.45 2006/05/02 22:25:10 tgl Exp $
12+
* $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.46 2006/06/16 20:23:44 adunstan Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
@@ -700,21 +700,40 @@ RemoveOpClass(RemoveOpClassStmt *stmt)
700700
/* Unqualified opclass name, so search the search path */
701701
opcID=OpclassnameGetOpcid(amID,opcname);
702702
if (!OidIsValid(opcID))
703-
ereport(ERROR,
704-
(errcode(ERRCODE_UNDEFINED_OBJECT),
705-
errmsg("operator class \"%s\" does not exist for access method \"%s\"",
706-
opcname,stmt->amname)));
703+
{
704+
if (!stmt->missing_ok )
705+
ereport(ERROR,
706+
(errcode(ERRCODE_UNDEFINED_OBJECT),
707+
errmsg("operator class \"%s\" does not exist for access method \"%s\"",
708+
opcname,stmt->amname)));
709+
else
710+
ereport(NOTICE,
711+
(errmsg("operator class \"%s\" does not exist for access method \"%s\"",
712+
opcname,stmt->amname)));
713+
714+
return;
715+
}
716+
707717
tuple=SearchSysCache(CLAOID,
708718
ObjectIdGetDatum(opcID),
709719
0,0,0);
710720
}
711721

712722
if (!HeapTupleIsValid(tuple))
713-
ereport(ERROR,
714-
(errcode(ERRCODE_UNDEFINED_OBJECT),
715-
errmsg("operator class \"%s\" does not exist for access method \"%s\"",
716-
NameListToString(stmt->opclassname),stmt->amname)));
717-
723+
{
724+
725+
if (!stmt->missing_ok )
726+
ereport(ERROR,
727+
(errcode(ERRCODE_UNDEFINED_OBJECT),
728+
errmsg("operator class \"%s\" does not exist for access method \"%s\"",
729+
NameListToString(stmt->opclassname),stmt->amname)));
730+
else
731+
ereport(NOTICE,
732+
(errmsg("operator class \"%s\" does not exist for access method \"%s\"",
733+
NameListToString(stmt->opclassname),stmt->amname)));
734+
return;
735+
}
736+
718737
opcID=HeapTupleGetOid(tuple);
719738

720739
/* Permission check: must own opclass or its namespace */

‎src/backend/commands/operatorcmds.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.30 2006/04/15 17:45:34 tgl Exp $
12+
* $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.31 2006/06/16 20:23:44 adunstan Exp $
1313
*
1414
* DESCRIPTION
1515
* The "DefineFoo" routines take the parse tree and pick out the
@@ -213,7 +213,15 @@ RemoveOperator(RemoveFuncStmt *stmt)
213213
Assert(list_length(stmt->args)==2);
214214
operOid=LookupOperNameTypeNames(NULL,operatorName,
215215
typeName1,typeName2,
216-
false,-1);
216+
stmt->missing_ok,-1);
217+
218+
if (stmt->missing_ok&&!OidIsValid(operOid) )
219+
{
220+
ereport(NOTICE,
221+
(errmsg("operator %s does not exist ... skipping",
222+
NameListToString(operatorName))));
223+
return;
224+
}
217225

218226
tup=SearchSysCache(OPEROID,
219227
ObjectIdGetDatum(operOid),

‎src/backend/commands/proclang.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.64 2006/03/05 15:58:24 momjian Exp $
10+
* $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.65 2006/06/16 20:23:44 adunstan Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -396,9 +396,18 @@ DropProceduralLanguage(DropPLangStmt *stmt)
396396
CStringGetDatum(languageName),
397397
0,0,0);
398398
if (!HeapTupleIsValid(langTup))
399-
ereport(ERROR,
400-
(errcode(ERRCODE_UNDEFINED_OBJECT),
401-
errmsg("language \"%s\" does not exist",languageName)));
399+
{
400+
if (!stmt->missing_ok)
401+
ereport(ERROR,
402+
(errcode(ERRCODE_UNDEFINED_OBJECT),
403+
errmsg("language \"%s\" does not exist",languageName)));
404+
else
405+
ereport(NOTICE,
406+
(errmsg("language \"%s\" does not exist ... skipping",
407+
languageName)));
408+
409+
return;
410+
}
402411

403412
object.classId=LanguageRelationId;
404413
object.objectId=HeapTupleGetOid(langTup);

‎src/backend/commands/tablespace.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.34 2006/03/29 21:17:38 tgl Exp $
40+
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.35 2006/06/16 20:23:44 adunstan Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -403,10 +403,25 @@ DropTableSpace(DropTableSpaceStmt *stmt)
403403
tuple=heap_getnext(scandesc,ForwardScanDirection);
404404

405405
if (!HeapTupleIsValid(tuple))
406-
ereport(ERROR,
407-
(errcode(ERRCODE_UNDEFINED_OBJECT),
408-
errmsg("tablespace \"%s\" does not exist",
409-
tablespacename)));
406+
{
407+
if ( !stmt->missing_ok )
408+
{
409+
ereport(ERROR,
410+
(errcode(ERRCODE_UNDEFINED_OBJECT),
411+
errmsg("tablespace \"%s\" does not exist",
412+
tablespacename)));
413+
}
414+
else
415+
{
416+
ereport(NOTICE,
417+
(errmsg("tablespace \"%s\" does not exist ... skipping",
418+
tablespacename)));
419+
/* XXX I assume I need one or both of these next two calls */
420+
heap_endscan(scandesc);
421+
heap_close(rel,NoLock);
422+
}
423+
return;
424+
}
410425

411426
tablespaceoid=HeapTupleGetOid(tuple);
412427

‎src/backend/commands/trigger.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.202 2006/05/30 14:01:57 momjian Exp $
10+
* $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.203 2006/06/16 20:23:44 adunstan Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -452,7 +452,8 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
452452
* DropTrigger - drop an individual trigger by name
453453
*/
454454
void
455-
DropTrigger(Oidrelid,constchar*trigname,DropBehaviorbehavior)
455+
DropTrigger(Oidrelid,constchar*trigname,DropBehaviorbehavior,
456+
boolmissing_ok)
456457
{
457458
Relationtgrel;
458459
ScanKeyDataskey[2];
@@ -481,10 +482,21 @@ DropTrigger(Oid relid, const char *trigname, DropBehavior behavior)
481482
tup=systable_getnext(tgscan);
482483

483484
if (!HeapTupleIsValid(tup))
484-
ereport(ERROR,
485-
(errcode(ERRCODE_UNDEFINED_OBJECT),
486-
errmsg("trigger \"%s\" for table \"%s\" does not exist",
487-
trigname,get_rel_name(relid))));
485+
{
486+
if (!missing_ok)
487+
ereport(ERROR,
488+
(errcode(ERRCODE_UNDEFINED_OBJECT),
489+
errmsg("trigger \"%s\" for table \"%s\" does not exist",
490+
trigname,get_rel_name(relid))));
491+
else
492+
ereport(NOTICE,
493+
(errmsg("trigger \"%s\" for table \"%s\" does not exist ...skipping",
494+
trigname,get_rel_name(relid))));
495+
/* cleanup */
496+
systable_endscan(tgscan);
497+
heap_close(tgrel,AccessShareLock);
498+
return;
499+
}
488500

489501
if (!pg_class_ownercheck(relid,GetUserId()))
490502
aclcheck_error(ACLCHECK_NOT_OWNER,ACL_KIND_CLASS,

‎src/backend/nodes/copyfuncs.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Portions Copyright (c) 1994, Regents of the University of California
1616
*
1717
* IDENTIFICATION
18-
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.335 2006/04/30 18:30:38 tgl Exp $
18+
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.336 2006/06/16 20:23:44 adunstan Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -2075,6 +2075,7 @@ _copyRemoveFuncStmt(RemoveFuncStmt *from)
20752075
COPY_NODE_FIELD(name);
20762076
COPY_NODE_FIELD(args);
20772077
COPY_SCALAR_FIELD(behavior);
2078+
COPY_SCALAR_FIELD(missing_ok);
20782079

20792080
returnnewnode;
20802081
}
@@ -2087,6 +2088,7 @@ _copyRemoveOpClassStmt(RemoveOpClassStmt *from)
20872088
COPY_NODE_FIELD(opclassname);
20882089
COPY_STRING_FIELD(amname);
20892090
COPY_SCALAR_FIELD(behavior);
2091+
COPY_SCALAR_FIELD(missing_ok);
20902092

20912093
returnnewnode;
20922094
}
@@ -2414,6 +2416,7 @@ _copyDropTableSpaceStmt(DropTableSpaceStmt *from)
24142416
DropTableSpaceStmt*newnode=makeNode(DropTableSpaceStmt);
24152417

24162418
COPY_STRING_FIELD(tablespacename);
2419+
COPY_SCALAR_FIELD(missing_ok);
24172420

24182421
returnnewnode;
24192422
}
@@ -2447,6 +2450,7 @@ _copyDropPropertyStmt(DropPropertyStmt *from)
24472450
COPY_STRING_FIELD(property);
24482451
COPY_SCALAR_FIELD(removeType);
24492452
COPY_SCALAR_FIELD(behavior);
2453+
COPY_SCALAR_FIELD(missing_ok);
24502454

24512455
returnnewnode;
24522456
}
@@ -2471,6 +2475,7 @@ _copyDropPLangStmt(DropPLangStmt *from)
24712475

24722476
COPY_STRING_FIELD(plname);
24732477
COPY_SCALAR_FIELD(behavior);
2478+
COPY_SCALAR_FIELD(missing_ok);
24742479

24752480
returnnewnode;
24762481
}
@@ -2606,6 +2611,7 @@ _copyDropCastStmt(DropCastStmt *from)
26062611
COPY_NODE_FIELD(sourcetype);
26072612
COPY_NODE_FIELD(targettype);
26082613
COPY_SCALAR_FIELD(behavior);
2614+
COPY_SCALAR_FIELD(missing_ok);
26092615

26102616
returnnewnode;
26112617
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp