summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorAndrew Dunstan2006-06-16 20:23:45 +0000
committerAndrew Dunstan2006-06-16 20:23:45 +0000
commitbbcd01692bff099117f5afb0fe2d1ad182621766 (patch)
tree07aebd51aac35be3e0e4471cbff7595a35350d67 /src/backend/parser
parente79cc2db00501fb29e3e0225182147192e830fa1 (diff)
DROP ... IF EXISTS for the following cases:
language, tablespace, trigger, rule, opclass, function, aggregate. operator, and cast.
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y99
1 files changed, 93 insertions, 6 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index d84f4034aba..f95a6b74cdf 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.545 2006/05/27 17:38:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.546 2006/06/16 20:23:44 adunstan Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -191,7 +191,7 @@ static void doNegateFloat(Value *v);
%type <ival> opt_lock lock_type cast_context
%type <boolean> opt_force opt_or_replace
opt_grant_grant_option opt_grant_admin_option
- opt_nowait
+ opt_nowait opt_if_exists
%type <boolean> like_including_defaults
@@ -2401,6 +2401,15 @@ DropPLangStmt:
DropPLangStmt *n = makeNode(DropPLangStmt);
n->plname = $4;
n->behavior = $5;
+ n->missing_ok = false;
+ $$ = (Node *)n;
+ }
+ | DROP opt_procedural LANGUAGE IF_P EXISTS ColId_or_Sconst opt_drop_behavior
+ {
+ DropPLangStmt *n = makeNode(DropPLangStmt);
+ n->plname = $6;
+ n->behavior = $7;
+ n->missing_ok = true;
$$ = (Node *)n;
}
;
@@ -2445,6 +2454,14 @@ DropTableSpaceStmt: DROP TABLESPACE name
{
DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
n->tablespacename = $3;
+ n->missing_ok = false;
+ $$ = (Node *) n;
+ }
+ | DROP TABLESPACE IF_P EXISTS name
+ {
+ DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
+ n->tablespacename = $5;
+ n->missing_ok = true;
$$ = (Node *) n;
}
;
@@ -2630,6 +2647,17 @@ DropTrigStmt:
n->property = $3;
n->behavior = $6;
n->removeType = OBJECT_TRIGGER;
+ n->missing_ok = false;
+ $$ = (Node *) n;
+ }
+ | DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
+ {
+ DropPropertyStmt *n = makeNode(DropPropertyStmt);
+ n->relation = $7;
+ n->property = $5;
+ n->behavior = $8;
+ n->removeType = OBJECT_TRIGGER;
+ n->missing_ok = true;
$$ = (Node *) n;
}
;
@@ -2903,6 +2931,16 @@ DropOpClassStmt:
n->opclassname = $4;
n->amname = $6;
n->behavior = $7;
+ n->missing_ok = false;
+ $$ = (Node *) n;
+ }
+ | DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
+ {
+ RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
+ n->opclassname = $6;
+ n->amname = $8;
+ n->behavior = $9;
+ n->missing_ok = true;
$$ = (Node *) n;
}
;
@@ -3912,6 +3950,17 @@ RemoveFuncStmt:
n->name = $3;
n->args = extractArgTypes($4);
n->behavior = $5;
+ n->missing_ok = false;
+ $$ = (Node *)n;
+ }
+ | DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
+ {
+ RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
+ n->kind = OBJECT_FUNCTION;
+ n->name = $5;
+ n->args = extractArgTypes($6);
+ n->behavior = $7;
+ n->missing_ok = true;
$$ = (Node *)n;
}
;
@@ -3924,6 +3973,17 @@ RemoveAggrStmt:
n->name = $3;
n->args = $4;
n->behavior = $5;
+ n->missing_ok = false;
+ $$ = (Node *)n;
+ }
+ | DROP AGGREGATE IF_P EXISTS func_name aggr_args opt_drop_behavior
+ {
+ RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
+ n->kind = OBJECT_AGGREGATE;
+ n->name = $5;
+ n->args = $6;
+ n->behavior = $7;
+ n->missing_ok = true;
$$ = (Node *)n;
}
;
@@ -3936,6 +3996,17 @@ RemoveOperStmt:
n->name = $3;
n->args = $5;
n->behavior = $7;
+ n->missing_ok = false;
+ $$ = (Node *)n;
+ }
+ | DROP OPERATOR IF_P EXISTS any_operator '(' oper_argtypes ')' opt_drop_behavior
+ {
+ RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
+ n->kind = OBJECT_OPERATOR;
+ n->name = $5;
+ n->args = $7;
+ n->behavior = $9;
+ n->missing_ok = true;
$$ = (Node *)n;
}
;
@@ -3998,16 +4069,21 @@ cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
;
-DropCastStmt: DROP CAST '(' Typename AS Typename ')' opt_drop_behavior
+DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
{
DropCastStmt *n = makeNode(DropCastStmt);
- n->sourcetype = $4;
- n->targettype = $6;
- n->behavior = $8;
+ n->sourcetype = $5;
+ n->targettype = $7;
+ n->behavior = $9;
+ n->missing_ok =
$$ = (Node *)n;
}
;
+opt_if_exists: IF_P EXISTS { $$ = true; }
+ | /* empty */ { $$ = false; }
+ ;
+
/*****************************************************************************
@@ -4432,6 +4508,17 @@ DropRuleStmt:
n->property = $3;
n->behavior = $6;
n->removeType = OBJECT_RULE;
+ n->missing_ok = false;
+ $$ = (Node *) n;
+ }
+ | DROP RULE IF_P EXISTS name ON qualified_name opt_drop_behavior
+ {
+ DropPropertyStmt *n = makeNode(DropPropertyStmt);
+ n->relation = $7;
+ n->property = $5;
+ n->behavior = $8;
+ n->removeType = OBJECT_RULE;
+ n->missing_ok = true;
$$ = (Node *) n;
}
;