Allow dropping multiple functions at once
The generic drop support already supported dropping multiple objects of the same kind at once. But the previous representation of function signatures across two grammar symbols and structure members made this cumbersome to do for functions, so it was not supported. Now that function signatures are represented by a single structure, it's trivial to add this support. Same for aggregates and operators. Reviewed-by: Jim Nasby <Jim.Nasby@BlueTreble.com> Reviewed-by: Michael Paquier <michael.paquier@gmail.com>
This commit is contained in:
parent
2ca64c6f71
commit
583f6c4148
|
@ -21,7 +21,7 @@ PostgreSQL documentation
|
|||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
DROP AGGREGATE [ IF EXISTS ] <replaceable>name</replaceable> ( <replaceable>aggregate_signature</replaceable> ) [ CASCADE | RESTRICT ]
|
||||
DROP AGGREGATE [ IF EXISTS ] <replaceable>name</replaceable> ( <replaceable>aggregate_signature</replaceable> ) [, ...] [ CASCADE | RESTRICT ]
|
||||
|
||||
<phrase>where <replaceable>aggregate_signature</replaceable> is:</phrase>
|
||||
|
||||
|
@ -155,7 +155,14 @@ DROP AGGREGATE myavg(integer);
|
|||
DROP AGGREGATE myrank(VARIADIC "any" ORDER BY VARIADIC "any");
|
||||
</programlisting>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<para>
|
||||
To remove multiple aggregate functions in one command:
|
||||
<programlisting>
|
||||
DROP AGGREGATE myavg(integer), myavg(bigint);
|
||||
</programlisting>
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Compatibility</title>
|
||||
|
|
|
@ -21,7 +21,7 @@ PostgreSQL documentation
|
|||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
DROP FUNCTION [ IF EXISTS ] <replaceable class="parameter">name</replaceable> ( [ [ <replaceable class="parameter">argmode</replaceable> ] [ <replaceable class="parameter">argname</replaceable> ] <replaceable class="parameter">argtype</replaceable> [, ...] ] )
|
||||
DROP FUNCTION [ IF EXISTS ] <replaceable class="parameter">name</replaceable> ( [ [ <replaceable class="parameter">argmode</replaceable> ] [ <replaceable class="parameter">argname</replaceable> ] <replaceable class="parameter">argtype</replaceable> [, ...] ] ) [, ...]
|
||||
[ CASCADE | RESTRICT ]
|
||||
</synopsis>
|
||||
</refsynopsisdiv>
|
||||
|
@ -134,6 +134,12 @@ DROP FUNCTION [ IF EXISTS ] <replaceable class="parameter">name</replaceable> (
|
|||
|
||||
<programlisting>
|
||||
DROP FUNCTION sqrt(integer);
|
||||
</programlisting></para>
|
||||
|
||||
<para>
|
||||
Drop multiple functions in one command:
|
||||
<programlisting>
|
||||
DROP FUNCTION sqrt(integer), sqrt(bigint);
|
||||
</programlisting></para>
|
||||
</refsect1>
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ PostgreSQL documentation
|
|||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
DROP OPERATOR [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> ( { <replaceable class="PARAMETER">left_type</replaceable> | NONE } , { <replaceable class="PARAMETER">right_type</replaceable> | NONE } ) [ CASCADE | RESTRICT ]
|
||||
DROP OPERATOR [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable> ( { <replaceable class="PARAMETER">left_type</replaceable> | NONE } , { <replaceable class="PARAMETER">right_type</replaceable> | NONE } ) [, ...] [ CASCADE | RESTRICT ]
|
||||
</synopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
|
@ -125,6 +125,12 @@ DROP OPERATOR ~ (none, bit);
|
|||
for type <type>bigint</type>:
|
||||
<programlisting>
|
||||
DROP OPERATOR ! (bigint, none);
|
||||
</programlisting></para>
|
||||
|
||||
<para>
|
||||
Remove multiple operators in one command:
|
||||
<programlisting>
|
||||
DROP OPERATOR ~ (none, bit), ! (bigint, none);
|
||||
</programlisting></para>
|
||||
</refsect1>
|
||||
|
||||
|
|
|
@ -358,7 +358,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
|||
%type <list> privileges privilege_list
|
||||
%type <privtarget> privilege_target
|
||||
%type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
|
||||
%type <list> function_with_argtypes_list
|
||||
%type <list> function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
|
||||
%type <ival> defacl_privilege_target
|
||||
%type <defelt> DefACLOption
|
||||
%type <list> DefACLOptionList
|
||||
|
@ -7495,6 +7495,12 @@ aggregate_with_argtypes:
|
|||
}
|
||||
;
|
||||
|
||||
aggregate_with_argtypes_list:
|
||||
aggregate_with_argtypes { $$ = list_make1($1); }
|
||||
| aggregate_with_argtypes_list ',' aggregate_with_argtypes
|
||||
{ $$ = lappend($1, $3); }
|
||||
;
|
||||
|
||||
createfunc_opt_list:
|
||||
/* Must be at least one to prevent conflict */
|
||||
createfunc_opt_item { $$ = list_make1($1); }
|
||||
|
@ -7676,21 +7682,21 @@ opt_restrict:
|
|||
*****************************************************************************/
|
||||
|
||||
RemoveFuncStmt:
|
||||
DROP FUNCTION function_with_argtypes opt_drop_behavior
|
||||
DROP FUNCTION function_with_argtypes_list opt_drop_behavior
|
||||
{
|
||||
DropStmt *n = makeNode(DropStmt);
|
||||
n->removeType = OBJECT_FUNCTION;
|
||||
n->objects = list_make1($3);
|
||||
n->objects = $3;
|
||||
n->behavior = $4;
|
||||
n->missing_ok = false;
|
||||
n->concurrent = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| DROP FUNCTION IF_P EXISTS function_with_argtypes opt_drop_behavior
|
||||
| DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
|
||||
{
|
||||
DropStmt *n = makeNode(DropStmt);
|
||||
n->removeType = OBJECT_FUNCTION;
|
||||
n->objects = list_make1($5);
|
||||
n->objects = $5;
|
||||
n->behavior = $6;
|
||||
n->missing_ok = true;
|
||||
n->concurrent = false;
|
||||
|
@ -7699,21 +7705,21 @@ RemoveFuncStmt:
|
|||
;
|
||||
|
||||
RemoveAggrStmt:
|
||||
DROP AGGREGATE aggregate_with_argtypes opt_drop_behavior
|
||||
DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
|
||||
{
|
||||
DropStmt *n = makeNode(DropStmt);
|
||||
n->removeType = OBJECT_AGGREGATE;
|
||||
n->objects = list_make1($3);
|
||||
n->objects = $3;
|
||||
n->behavior = $4;
|
||||
n->missing_ok = false;
|
||||
n->concurrent = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes opt_drop_behavior
|
||||
| DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
|
||||
{
|
||||
DropStmt *n = makeNode(DropStmt);
|
||||
n->removeType = OBJECT_AGGREGATE;
|
||||
n->objects = list_make1($5);
|
||||
n->objects = $5;
|
||||
n->behavior = $6;
|
||||
n->missing_ok = true;
|
||||
n->concurrent = false;
|
||||
|
@ -7722,21 +7728,21 @@ RemoveAggrStmt:
|
|||
;
|
||||
|
||||
RemoveOperStmt:
|
||||
DROP OPERATOR operator_with_argtypes opt_drop_behavior
|
||||
DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
|
||||
{
|
||||
DropStmt *n = makeNode(DropStmt);
|
||||
n->removeType = OBJECT_OPERATOR;
|
||||
n->objects = list_make1($3);
|
||||
n->objects = $3;
|
||||
n->behavior = $4;
|
||||
n->missing_ok = false;
|
||||
n->concurrent = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| DROP OPERATOR IF_P EXISTS operator_with_argtypes opt_drop_behavior
|
||||
| DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
|
||||
{
|
||||
DropStmt *n = makeNode(DropStmt);
|
||||
n->removeType = OBJECT_OPERATOR;
|
||||
n->objects = list_make1($5);
|
||||
n->objects = $5;
|
||||
n->behavior = $6;
|
||||
n->missing_ok = true;
|
||||
n->concurrent = false;
|
||||
|
@ -7768,6 +7774,12 @@ any_operator:
|
|||
{ $$ = lcons(makeString($1), $3); }
|
||||
;
|
||||
|
||||
operator_with_argtypes_list:
|
||||
operator_with_argtypes { $$ = list_make1($1); }
|
||||
| operator_with_argtypes_list ',' operator_with_argtypes
|
||||
{ $$ = lappend($1, $3); }
|
||||
;
|
||||
|
||||
operator_with_argtypes:
|
||||
any_operator oper_argtypes
|
||||
{
|
||||
|
|
|
@ -217,9 +217,10 @@ SELECT routine_name, ordinal_position, parameter_name, parameter_default
|
|||
functest_is_3 | 2 | b |
|
||||
(7 rows)
|
||||
|
||||
DROP FUNCTION functest_IS_1(int, int, text), functest_IS_2(int), functest_IS_3(int);
|
||||
-- Cleanups
|
||||
DROP SCHEMA temp_func_test CASCADE;
|
||||
NOTICE: drop cascades to 19 other objects
|
||||
NOTICE: drop cascades to 16 other objects
|
||||
DETAIL: drop cascades to function functest_a_1(text,date)
|
||||
drop cascades to function functest_a_2(text[])
|
||||
drop cascades to function functest_a_3()
|
||||
|
@ -236,8 +237,5 @@ drop cascades to function functext_f_1(integer)
|
|||
drop cascades to function functext_f_2(integer)
|
||||
drop cascades to function functext_f_3(integer)
|
||||
drop cascades to function functext_f_4(integer)
|
||||
drop cascades to function functest_is_1(integer,integer,text)
|
||||
drop cascades to function functest_is_2(integer)
|
||||
drop cascades to function functest_is_3(integer)
|
||||
DROP USER regress_unpriv_user;
|
||||
RESET search_path;
|
||||
|
|
|
@ -156,6 +156,8 @@ SELECT routine_name, ordinal_position, parameter_name, parameter_default
|
|||
WHERE routine_schema = 'temp_func_test' AND routine_name ~ '^functest_is_'
|
||||
ORDER BY 1, 2;
|
||||
|
||||
DROP FUNCTION functest_IS_1(int, int, text), functest_IS_2(int), functest_IS_3(int);
|
||||
|
||||
|
||||
-- Cleanups
|
||||
DROP SCHEMA temp_func_test CASCADE;
|
||||
|
|
Loading…
Reference in New Issue