exec-ddl
CREATE FUNCTION a(i INT, s STRING) RETURNS INT LANGUAGE SQL AS 'SELECT i'
----

exec-ddl
SHOW CREATE FUNCTION a
----
FUNCTION a(i: int, s: string) -> int [volatile]
 └── SELECT i

exec-ddl
CREATE FUNCTION b(i INT, s STRING) RETURNS INT LANGUAGE SQL AS $$
  SELECT *
  FROM t WHERE col1 > i AND
    col2 = s;
  SELECT s;
$$
----

exec-ddl
SHOW CREATE FUNCTION b
----
FUNCTION b(i: int, s: string) -> int [volatile]
 └──   SELECT *
       FROM t WHERE col1 > i AND
         col2 = s;
       SELECT s;

exec-ddl
CREATE FUNCTION c() RETURNS VOID IMMUTABLE LANGUAGE SQL AS 'SELECT 1'
----

exec-ddl
SHOW CREATE FUNCTION c
----
FUNCTION c() -> void [immutable]
 └── SELECT 1

exec-ddl
CREATE FUNCTION d() RETURNS VOID LEAKPROOF IMMUTABLE LANGUAGE SQL AS 'SELECT 1'
----

exec-ddl
SHOW CREATE FUNCTION d
----
FUNCTION d() -> void [leakproof]
 └── SELECT 1

exec-ddl
CREATE FUNCTION e(i INT) RETURNS INT IMMUTABLE STRICT LANGUAGE SQL AS 'SELECT i'
----

exec-ddl
SHOW CREATE FUNCTION e
----
FUNCTION e(i: int) -> int [immutable, called-on-null-input=false]
 └── SELECT i

exec-ddl
CREATE FUNCTION f() RETURNS INT RETURNS NULL ON NULL INPUT LANGUAGE SQL AS 'SELECT 1'
----

exec-ddl
SHOW CREATE FUNCTION f
----
FUNCTION f() -> int [volatile, called-on-null-input=false]
 └── SELECT 1

exec-ddl
CREATE FUNCTION f_3_in_2_out(IN param1 INT, IN param2 INT, IN param3 INT, OUT param1 INT, OUT param2 INT) LANGUAGE SQL AS 'SELECT (1, 1)'
----

exec-ddl
SHOW CREATE FUNCTION f_3_in_2_out
----
FUNCTION f_3_in_2_out(param1: int, param2: int, param3: int) -> tuple{int AS param1, int AS param2} [volatile]
 └── SELECT (1, 1)

exec-ddl
CREATE FUNCTION f_out_int(OUT param INT) RETURNS INT LANGUAGE SQL AS 'SELECT 1'
----

exec-ddl
SHOW CREATE FUNCTION f_out_int
----
FUNCTION f_out_int() -> int [volatile]
 └── SELECT 1

exec-ddl
CREATE FUNCTION f_default_names(OUT INT, OUT param2 INT, IN INT, OUT INT) RETURNS RECORD LANGUAGE SQL AS 'SELECT (1, 2, 3)'
----

exec-ddl
SHOW CREATE FUNCTION f_default_names
----
FUNCTION f_default_names(: int) -> tuple{int AS column1, int AS param2, int AS column3} [volatile]
 └── SELECT (1, 2, 3)

exec-ddl
CREATE FUNCTION f_default_params(INOUT INT, IN param2 FLOAT DEFAULT 3.5, OUT INT, IN param4 INT = 4, OUT INT) RETURNS RECORD LANGUAGE SQL AS 'SELECT (1, 2, 3)'
----

exec-ddl
SHOW CREATE FUNCTION f_default_params
----
FUNCTION f_default_params(: int, param2: float DEFAULT 3.5, param4: int DEFAULT 4) -> tuple{int AS column1, int AS column2, int AS column3} [volatile]
 └── SELECT (1, 2, 3)
