]> granicus.if.org Git - postgresql/commitdiff
Allow dropping multiple functions at once
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 28 Dec 2016 17:00:00 +0000 (12:00 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Mon, 6 Mar 2017 18:31:47 +0000 (13:31 -0500)
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>
doc/src/sgml/ref/drop_aggregate.sgml
doc/src/sgml/ref/drop_function.sgml
doc/src/sgml/ref/drop_operator.sgml
src/backend/parser/gram.y
src/test/regress/expected/create_function_3.out
src/test/regress/sql/create_function_3.sql

index c27c5eadf9278f047608b5284f801776f8a5bcb9..631b578df7efbb9ee68b06c9feb3d84ed9b4b9c4 100644 (file)
@@ -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>
index 5883d138115c855256400144bac54e6d4fd9a52a..5969b084b44c485abe8fb7f76d908f43baa52576 100644 (file)
@@ -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>
 
index 13dd974f384f2ea4c118d02aaf7ee3b4615dff53..fc82c3e0e3f3db35b2d9af0d14997d7c8e6ea708 100644 (file)
@@ -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>
 
index 1b06d358b502062f6c51d236f16dc6d79ec5f549..542b09b4b0f771a523b7e3517a95e935240f830f 100644 (file)
@@ -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
                                {
index 7bb957b51b45e5cdf545ac935990d1ed2bc15ff2..cc4e98a1d4b77144df09247ff53e24a8786db6f7 100644 (file)
@@ -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;
index 43454ef2f7b94cfb9d9a712d5fa52c838f4bcff1..66a463b08951db9a6cad4567fe813e4f17c0b390 100644 (file)
@@ -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;