Make CREATE/ALTER FUNCTION support NOT LEAKPROOF.
Because it isn't good to be able to turn things on, and not off again.
This commit is contained in:
parent
d845fd684a
commit
73a4b994a6
@ -33,7 +33,7 @@ ALTER FUNCTION <replaceable>name</replaceable> ( [ [ <replaceable class="paramet
|
|||||||
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
|
<phrase>where <replaceable class="PARAMETER">action</replaceable> is one of:</phrase>
|
||||||
|
|
||||||
CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
|
CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
|
||||||
IMMUTABLE | STABLE | VOLATILE | LEAKPROOF
|
IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
|
||||||
[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
|
[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
|
||||||
COST <replaceable class="parameter">execution_cost</replaceable>
|
COST <replaceable class="parameter">execution_cost</replaceable>
|
||||||
ROWS <replaceable class="parameter">result_rows</replaceable>
|
ROWS <replaceable class="parameter">result_rows</replaceable>
|
||||||
|
@ -26,7 +26,7 @@ CREATE [ OR REPLACE ] FUNCTION
|
|||||||
| RETURNS TABLE ( <replaceable class="parameter">column_name</replaceable> <replaceable class="parameter">column_type</replaceable> [, ...] ) ]
|
| RETURNS TABLE ( <replaceable class="parameter">column_name</replaceable> <replaceable class="parameter">column_type</replaceable> [, ...] ) ]
|
||||||
{ LANGUAGE <replaceable class="parameter">lang_name</replaceable>
|
{ LANGUAGE <replaceable class="parameter">lang_name</replaceable>
|
||||||
| WINDOW
|
| WINDOW
|
||||||
| IMMUTABLE | STABLE | VOLATILE | LEAKPROOF
|
| IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
|
||||||
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
|
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
|
||||||
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
|
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
|
||||||
| COST <replaceable class="parameter">execution_cost</replaceable>
|
| COST <replaceable class="parameter">execution_cost</replaceable>
|
||||||
|
@ -370,7 +370,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
|
|||||||
|
|
||||||
%type <istmt> insert_rest
|
%type <istmt> insert_rest
|
||||||
|
|
||||||
%type <vsetstmt> set_rest SetResetClause
|
%type <vsetstmt> set_rest set_rest_more SetResetClause FunctionSetResetClause
|
||||||
|
|
||||||
%type <node> TableElement TypedTableElement ConstraintElem TableFuncElement
|
%type <node> TableElement TypedTableElement ConstraintElem TableFuncElement
|
||||||
ForeignTableElement
|
ForeignTableElement
|
||||||
@ -1227,7 +1227,27 @@ VariableSetStmt:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
set_rest: /* Generic SET syntaxes: */
|
set_rest:
|
||||||
|
TRANSACTION transaction_mode_list
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
|
n->kind = VAR_SET_MULTI;
|
||||||
|
n->name = "TRANSACTION";
|
||||||
|
n->args = $2;
|
||||||
|
$$ = n;
|
||||||
|
}
|
||||||
|
| SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
|
n->kind = VAR_SET_MULTI;
|
||||||
|
n->name = "SESSION CHARACTERISTICS";
|
||||||
|
n->args = $5;
|
||||||
|
$$ = n;
|
||||||
|
}
|
||||||
|
| set_rest_more
|
||||||
|
;
|
||||||
|
|
||||||
|
set_rest_more: /* Generic SET syntaxes: */
|
||||||
var_name TO var_list
|
var_name TO var_list
|
||||||
{
|
{
|
||||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
@ -1277,22 +1297,6 @@ set_rest: /* Generic SET syntaxes: */
|
|||||||
n->kind = VAR_SET_DEFAULT;
|
n->kind = VAR_SET_DEFAULT;
|
||||||
$$ = n;
|
$$ = n;
|
||||||
}
|
}
|
||||||
| TRANSACTION transaction_mode_list
|
|
||||||
{
|
|
||||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
|
||||||
n->kind = VAR_SET_MULTI;
|
|
||||||
n->name = "TRANSACTION";
|
|
||||||
n->args = $2;
|
|
||||||
$$ = n;
|
|
||||||
}
|
|
||||||
| SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
|
|
||||||
{
|
|
||||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
|
||||||
n->kind = VAR_SET_MULTI;
|
|
||||||
n->name = "SESSION CHARACTERISTICS";
|
|
||||||
n->args = $5;
|
|
||||||
$$ = n;
|
|
||||||
}
|
|
||||||
| CATALOG_P Sconst
|
| CATALOG_P Sconst
|
||||||
{
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -1512,6 +1516,12 @@ SetResetClause:
|
|||||||
| VariableResetStmt { $$ = (VariableSetStmt *) $1; }
|
| VariableResetStmt { $$ = (VariableSetStmt *) $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/* SetResetClause allows SET or RESET without LOCAL */
|
||||||
|
FunctionSetResetClause:
|
||||||
|
SET set_rest_more { $$ = $2; }
|
||||||
|
| VariableResetStmt { $$ = (VariableSetStmt *) $1; }
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
VariableShowStmt:
|
VariableShowStmt:
|
||||||
SHOW var_name
|
SHOW var_name
|
||||||
@ -6119,6 +6129,10 @@ common_func_opt_item:
|
|||||||
{
|
{
|
||||||
$$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE));
|
$$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE));
|
||||||
}
|
}
|
||||||
|
| NOT LEAKPROOF
|
||||||
|
{
|
||||||
|
$$ = makeDefElem("leakproof", (Node *)makeInteger(FALSE));
|
||||||
|
}
|
||||||
| COST NumericOnly
|
| COST NumericOnly
|
||||||
{
|
{
|
||||||
$$ = makeDefElem("cost", (Node *)$2);
|
$$ = makeDefElem("cost", (Node *)$2);
|
||||||
@ -6127,7 +6141,7 @@ common_func_opt_item:
|
|||||||
{
|
{
|
||||||
$$ = makeDefElem("rows", (Node *)$2);
|
$$ = makeDefElem("rows", (Node *)$2);
|
||||||
}
|
}
|
||||||
| SetResetClause
|
| FunctionSetResetClause
|
||||||
{
|
{
|
||||||
/* we abuse the normal content of a DefElem here */
|
/* we abuse the normal content of a DefElem here */
|
||||||
$$ = makeDefElem("set", (Node *)$1);
|
$$ = makeDefElem("set", (Node *)$1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user