diff --git a/doc/src/sgml/ref/alter_function.sgml b/doc/src/sgml/ref/alter_function.sgml
index 3ceb6123f4f..013b6f8401c 100644
--- a/doc/src/sgml/ref/alter_function.sgml
+++ b/doc/src/sgml/ref/alter_function.sgml
@@ -33,7 +33,7 @@ ALTER FUNCTION name ( [ [ action is one of:
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
COST execution_cost
ROWS result_rows
diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml
index 7df66ab0e08..4336e4b2182 100644
--- a/doc/src/sgml/ref/create_function.sgml
+++ b/doc/src/sgml/ref/create_function.sgml
@@ -26,7 +26,7 @@ CREATE [ OR REPLACE ] FUNCTION
| RETURNS TABLE ( column_name column_type [, ...] ) ]
{ LANGUAGE lang_name
| WINDOW
- | IMMUTABLE | STABLE | VOLATILE | LEAKPROOF
+ | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| COST execution_cost
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index db63ff23711..d1ce2ab0422 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -370,7 +370,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
%type insert_rest
-%type set_rest SetResetClause
+%type set_rest set_rest_more SetResetClause FunctionSetResetClause
%type TableElement TypedTableElement ConstraintElem TableFuncElement
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
{
VariableSetStmt *n = makeNode(VariableSetStmt);
@@ -1277,22 +1297,6 @@ set_rest: /* Generic SET syntaxes: */
n->kind = VAR_SET_DEFAULT;
$$ = 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
{
ereport(ERROR,
@@ -1512,6 +1516,12 @@ SetResetClause:
| VariableResetStmt { $$ = (VariableSetStmt *) $1; }
;
+/* SetResetClause allows SET or RESET without LOCAL */
+FunctionSetResetClause:
+ SET set_rest_more { $$ = $2; }
+ | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
+ ;
+
VariableShowStmt:
SHOW var_name
@@ -6119,6 +6129,10 @@ common_func_opt_item:
{
$$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE));
}
+ | NOT LEAKPROOF
+ {
+ $$ = makeDefElem("leakproof", (Node *)makeInteger(FALSE));
+ }
| COST NumericOnly
{
$$ = makeDefElem("cost", (Node *)$2);
@@ -6127,7 +6141,7 @@ common_func_opt_item:
{
$$ = makeDefElem("rows", (Node *)$2);
}
- | SetResetClause
+ | FunctionSetResetClause
{
/* we abuse the normal content of a DefElem here */
$$ = makeDefElem("set", (Node *)$1);