Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default grammar({
[$.between_expression, $.binary_expression],
[$.time],
[$.timestamp],
[$.create_function],
],

precedences: $ => [
Expand Down
15 changes: 15 additions & 0 deletions grammar/statements/create-function.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export default {
$.function_cost,
$.function_rows,
$.function_support,
$.function_set,
),
),
// ensure that there's only one function body -- other specifiers are less
Expand All @@ -47,6 +48,7 @@ export default {
$.function_cost,
$.function_rows,
$.function_support,
$.function_set,
),
),
),
Expand Down Expand Up @@ -243,4 +245,17 @@ export default {
alias($._literal_string, $.literal),
),

function_set: $ => seq(
$.keyword_set,
field('parameter', $.identifier),
choice($.keyword_to, "="),
choice(
$.literal,
$.identifier,
$.keyword_on,
$.keyword_off,
$.keyword_default,
),
),

};
189 changes: 189 additions & 0 deletions test/corpus/functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1499,3 +1499,192 @@ RETURNS int
(field
(identifier))
(keyword_end)))))

================================================================================
Function with SET configuration parameter (equals form)
================================================================================

create function public.foo()
returns int
set search_path = 'public'
language sql
return 1;

--------------------------------------------------------------------------------

(program
(statement
(create_function
(keyword_create)
(keyword_function)
(object_reference
schema: (identifier)
name: (identifier))
(function_arguments)
(keyword_returns)
(int
(keyword_int))
(function_set
(keyword_set)
parameter: (identifier)
(literal))
(function_language
(keyword_language)
(identifier))
(function_body
(keyword_return)
(literal)))))

================================================================================
Function with SET configuration parameter (TO form)
================================================================================

create function public.foo()
returns int
set search_path to 'public'
language sql
return 1;

--------------------------------------------------------------------------------

(program
(statement
(create_function
(keyword_create)
(keyword_function)
(object_reference
schema: (identifier)
name: (identifier))
(function_arguments)
(keyword_returns)
(int
(keyword_int))
(function_set
(keyword_set)
parameter: (identifier)
(keyword_to)
(literal))
(function_language
(keyword_language)
(identifier))
(function_body
(keyword_return)
(literal)))))

================================================================================
Function with SET configuration parameter TO DEFAULT
================================================================================

create function public.foo()
returns int
set search_path to default
language sql
return 1;

--------------------------------------------------------------------------------

(program
(statement
(create_function
(keyword_create)
(keyword_function)
(object_reference
schema: (identifier)
name: (identifier))
(function_arguments)
(keyword_returns)
(int
(keyword_int))
(function_set
(keyword_set)
parameter: (identifier)
(keyword_to)
(keyword_default))
(function_language
(keyword_language)
(identifier))
(function_body
(keyword_return)
(literal)))))

================================================================================
Function with multiple SET configuration parameters
================================================================================

create function public.foo()
returns int
set search_path = 'public'
set enable_seqscan = 'off'
language sql
return 1;

--------------------------------------------------------------------------------

(program
(statement
(create_function
(keyword_create)
(keyword_function)
(object_reference
schema: (identifier)
name: (identifier))
(function_arguments)
(keyword_returns)
(int
(keyword_int))
(function_set
(keyword_set)
parameter: (identifier)
(literal))
(function_set
(keyword_set)
parameter: (identifier)
(literal))
(function_language
(keyword_language)
(identifier))
(function_body
(keyword_return)
(literal)))))

================================================================================
Function with SET configuration parameter after body
================================================================================

create function public.foo()
returns int
language sql
as $$select 1$$
set search_path = 'public';

--------------------------------------------------------------------------------

(program
(statement
(create_function
(keyword_create)
(keyword_function)
(object_reference
schema: (identifier)
name: (identifier))
(function_arguments)
(keyword_returns)
(int
(keyword_int))
(function_language
(keyword_language)
(identifier))
(function_body
(keyword_as)
(dollar_quote)
(statement
(select
(keyword_select)
(select_expression
(term
value: (literal)))))
(dollar_quote))
(function_set
(keyword_set)
parameter: (identifier)
(literal)))))
Loading