CREATE FUNCTION

功能描述

创建一个函数。

注意事项

相比于原始的openGauss,dolphin对于CREATE FUNCTION语法的修改为:

  1. 增加 LANGUAGE 默认值 plpgsql。

  2. 增加语法兼容项 [NOT] DETERMINISTIC。

  3. 增加语法兼容项 { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 。

  4. 增加语法兼容项 SQL SECURITY { DEFINER | INVOKER }。

  5. 增加MySQL风格语法格式。

语法格式

dolphin加载后,CREATE FUNCTION 语法的格式为

  • 兼容PostgreSQL风格的创建自定义函数语法。

    1. CREATE [ OR REPLACE ] FUNCTION function_name
    2. ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]
    3. } [, ...] ] )
    4. [ RETURNS rettype
    5. | RETURNS TABLE ( { column_name column_type } [, ...] )]
    6. [
    7. {IMMUTABLE | STABLE | VOLATILE}
    8. | {SHIPPABLE | NOT SHIPPABLE}
    9. | [ NOT ] LEAKPROOF
    10. | WINDOW
    11. | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT}
    12. | {[ EXTERNAL| SQL ] SECURITY INVOKER | [ EXTERNAL| SQL ] SECURITY DEFINER | AU
    13. THID DEFINER | AUTHID CURRENT_USER}
    14. | {FENCED | NOT FENCED}
    15. | {PACKAGE}
    16. | COST execution_cost
    17. | ROWS result_rows
    18. | SET configuration_parameter { {TO | =} value | FROM CURRENT }
    19. | COMMENT 'text'
    20. | {DETERMINISTIC | NOT DETERMINISTIC}
    21. | LANGUAGE lang_name
    22. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    23. ] [...]
    24. {
    25. AS 'definition'
    26. | AS 'obj_file', 'link_symbol'
    27. }
  • O风格的创建自定义函数的语法。

    1. CREATE [ OR REPLACE ] FUNCTION function_name
    2. ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] }
    3. [, ...] ] )
    4. RETURN rettype
    5. [
    6. {IMMUTABLE | STABLE | VOLATILE }
    7. | {SHIPPABLE | NOT SHIPPABLE}
    8. | {PACKAGE}
    9. | [ NOT ] LEAKPROOF
    10. | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
    11. | {[ EXTERNAL| SQL ] SECURITY INVOKER | [ EXTERNAL| SQL ] SECURITY DEFINER | |
    12. AUTHID DEFINER | AUTHID CURRENT_USER}
    13. | COST execution_cost
    14. | ROWS result_rows
    15. | SET configuration_parameter { {TO | =} value | FROM CURRENT }
    16. | COMMENT 'text'
    17. | {DETERMINISTIC | NOT DETERMINISTIC}
    18. | LANGUAGE lang_name
    19. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    20. ][...]
    21. {
    22. IS | AS
    23. } plsql_body
    24. /
  • MySQL风格语法格式。

    1. CREATE [ OR REPLACE ] FUNCTION function_name
    2. ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] }
    3. [, ...] ] )
    4. RETURNS rettype
    5. [
    6. SQL SECURITY { DEFINER | INVOKER }
    7. | COMMENT 'text'
    8. | {DETERMINISTIC | NOT DETERMINISTIC}
    9. | LANGUAGE lang_name
    10. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    11. ][...] 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

    语法兼容项。此选项允许重复。

示例

  1. --指定 CONTAINS SQL
  2. openGauss=# CREATE FUNCTION func_test (s CHAR(20)) RETURNS int
  3. CONTAINS SQL AS $$ select 1 $$ ;
  4. --指定 DETERMINISTIC
  5. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  6. CONTAINS SQL DETERMINISTIC AS $$ select s; $$ ;
  7. --指定 LANGUAGE SQL
  8. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  9. CONTAINS SQL LANGUAGE SQL AS $$ select s; $$ ;
  10. --指定 NO SQL
  11. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  12. NO SQL AS $$ select s; $$ ;
  13. --指定 READS SQL DATA
  14. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  15. CONTAINS SQL READS SQL DATA AS $$ select s; $$ ;
  16. --指定 MODIFIES SQL DATA
  17. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  18. CONTAINS SQL LANGUAGE SQL NO SQL MODIFIES SQL DATA AS $$ select s; $$ ;
  19. --指定 SECURITY DEFINER
  20. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  21. NO SQL SQL SECURITY DEFINER AS $$ select s; $$ ;
  22. --指定 SECURITY INVOKER
  23. openGauss=# CREATE FUNCTION func_test (s int) RETURNS int
  24. SQL SECURITY INVOKER READS SQL DATA LANGUAGE SQL AS $$ select s; $$ ;
  25. --MySQL风格语法格式
  26. openGauss=# create function func(n int) returns varchar(50) return (select n+1);
  27. CREATE FUNCTION
  28. openGauss=# select func(1);
  29. func
  30. ------
  31. 2
  32. (1 row)
  33. openGauss=# delimiter //
  34. SET
  35. openGauss=# create function func10(b int) returns int
  36. openGauss-# begin
  37. openGauss-# if b > 0 then return b + 10;
  38. openGauss-# else return -1;
  39. openGauss-# end if;
  40. openGauss-# end//
  41. CREATE FUNCTION
  42. openGauss=# delimiter ;
  43. SET
  44. openGauss=# select func10(9);
  45. func10
  46. --------
  47. 19
  48. (1 row)

相关链接

CREATE FUNCTION