CREATE FUNCTION
功能描述
创建一个函数。
注意事项
相比于原始的openGauss,dolphin对于CREATE FUNCTION语法的修改为:
增加 LANGUAGE 默认值 plpgsql。
增加语法兼容项 [NOT] DETERMINISTIC。
增加语法兼容项 { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 。
增加语法兼容项 SQL SECURITY { DEFINER | INVOKER }。
增加MySQL风格语法格式。
语法格式
dolphin加载后,CREATE FUNCTION 语法的格式为
兼容PostgreSQL风格的创建自定义函数语法。
CREATE [ OR REPLACE ] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]
} [, ...] ] )
[ RETURNS rettype
| RETURNS TABLE ( { column_name column_type } [, ...] )]
[
{IMMUTABLE | STABLE | VOLATILE}
| {SHIPPABLE | NOT SHIPPABLE}
| [ NOT ] LEAKPROOF
| WINDOW
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT}
| {[ EXTERNAL| SQL ] SECURITY INVOKER | [ EXTERNAL| SQL ] SECURITY DEFINER | AU
THID DEFINER | AUTHID CURRENT_USER}
| {FENCED | NOT FENCED}
| {PACKAGE}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT }
| COMMENT 'text'
| {DETERMINISTIC | NOT DETERMINISTIC}
| LANGUAGE lang_name
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
] [...]
{
AS 'definition'
| AS 'obj_file', 'link_symbol'
}
O风格的创建自定义函数的语法。
CREATE [ OR REPLACE ] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] }
[, ...] ] )
RETURN rettype
[
{IMMUTABLE | STABLE | VOLATILE }
| {SHIPPABLE | NOT SHIPPABLE}
| {PACKAGE}
| [ NOT ] LEAKPROOF
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL| SQL ] SECURITY INVOKER | [ EXTERNAL| SQL ] SECURITY DEFINER | |
AUTHID DEFINER | AUTHID CURRENT_USER}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT }
| COMMENT 'text'
| {DETERMINISTIC | NOT DETERMINISTIC}
| LANGUAGE lang_name
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
][...]
{
IS | AS
} plsql_body
/
MySQL风格语法格式。
CREATE [ OR REPLACE ] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] }
[, ...] ] )
RETURNS rettype
[
SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'text'
| {DETERMINISTIC | NOT DETERMINISTIC}
| LANGUAGE lang_name
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
][...] plsql_body
参数说明
LANGUAGE lang_name
用以实现函数的语言的名称。PostgreSQL风格函数默认值 sql, O风格默认值 plpgsql。 MySQL风格语法格式下,LANGUAGE选项仅做语法兼容,可填入其他值,但最终将使用plpgsql作为实现函数的语言。在MySQL风格语法格式下,此选项允许重复。
SQL SECURITY INVOKER
表明该函数将带着调用它的用户的权限执行。该参数可以省略。
SQL SECURITY INVOKER和SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
在MySQL风格语法格式下,此选项允许重复,且与SQL SECURITY DEFINER同类别。该类别的函数选项以最后一个输入为准。
SQL SECURITY DEFINER
声明该函数将以创建它的用户的权限执行。
SQL SECURITY DEFINER和AUTHID DEFINER和SECURITY DEFINER的功能相同。
在MySQL风格语法格式下,此选项允许重复,且与SQL SECURITY INVOKER同类别。该类别的函数选项以最后一个输入为准。
CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA
语法兼容项。此选项允许重复。
示例
--指定 CONTAINS SQL
openGauss=# CREATE FUNCTION func_test (s CHAR(20)) RETURNS int
CONTAINS SQL AS $$ select 1 $$ ;
--指定 DETERMINISTIC
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
CONTAINS SQL DETERMINISTIC AS $$ select s; $$ ;
--指定 LANGUAGE SQL
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
CONTAINS SQL LANGUAGE SQL AS $$ select s; $$ ;
--指定 NO SQL
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
NO SQL AS $$ select s; $$ ;
--指定 READS SQL DATA
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
CONTAINS SQL READS SQL DATA AS $$ select s; $$ ;
--指定 MODIFIES SQL DATA
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
CONTAINS SQL LANGUAGE SQL NO SQL MODIFIES SQL DATA AS $$ select s; $$ ;
--指定 SECURITY DEFINER
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
NO SQL SQL SECURITY DEFINER AS $$ select s; $$ ;
--指定 SECURITY INVOKER
openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
SQL SECURITY INVOKER READS SQL DATA LANGUAGE SQL AS $$ select s; $$ ;
--MySQL风格语法格式
openGauss=# create function func(n int) returns varchar(50) return (select n+1);
CREATE FUNCTION
openGauss=# select func(1);
func
------
2
(1 row)
openGauss=# delimiter //
SET
openGauss=# create function func10(b int) returns int
openGauss-# begin
openGauss-# if b > 0 then return b + 10;
openGauss-# else return -1;
openGauss-# end if;
openGauss-# end//
CREATE FUNCTION
openGauss=# delimiter ;
SET
openGauss=# select func10(9);
func10
--------
19
(1 row)