为IvorySQL增添PACKAGE语法帮助

2025-12-12 0 963

认识语法帮助

当使用psql工具登录数据库时,h command可以查看语法帮助。比如查看create database语法:

psql (17.6)
Type \"help\" for help.

ivorysql=# h create database
Command:     CREATE DATABASE
Description: create a new database
Syntax:
CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ STRATEGY [=] strategy ]
           [ LOCALE [=] locale ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ BUILTIN_LOCALE [=] builtin_locale ]
           [ ICU_LOCALE [=] icu_locale ]
           [ ICU_RULES [=] icu_rules ]
           [ LOCALE_PROVIDER [=] locale_provider ]
           [ COLLATION_VERSION = collation_version ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ]
           [ OID [=] oid ]

URL: https://www.postgresql.org/docs/17/sql-createdatabase.html

ivorysql=#

这也算是个小技巧,不需要死记太多的sql语法,使用时直接查看就行。不仅打印出了对应sql的语法,还打印出了该语法对应的官方文档URL。

语法帮助原理分析

主要是@SOURCE_ROOT/src/bin/psql/help.c中helpSQL函数实现查看语法的功能。

从Makefile看还得依赖sql_help.c, sql_help.h一起编译完成。而从meson.build看是make的时候才生成这两个文件的,并且是使用create_help.pl读取文档目录@SOURCE_ROOT@/doc/src/sgml/ref中的所有语法文档生成的。

sql_help = custom_target(\'psql_help\',
  output: [\'sql_help.c\', \'sql_help.h\'],
  depfile: \'sql_help.dep\',
  command: [
    perl, files(\'create_help.pl\'),
    \'--docdir\', \'@SOURCE_ROOT@/doc/src/sgml/ref\',
    \'--depfile\', \'@DEPFILE@\',
    \'--outdir\', \'@OUTDIR@\',
    \'--basename\', \'sql_help\',
  ],
)
generated_sources += sql_help.to_list()
psql_sources += sql_help

可以看到doc/src/sgml/ref目录下确实包含了其他所有对象的create的sgml文件,并没有create_package的文件。

ls doc/src/sgml/ref/create*
doc/src/sgml/ref/create_access_method.sgml  doc/src/sgml/ref/create_extension.sgml             doc/src/sgml/ref/create_operator.sgml     doc/src/sgml/ref/create_server.sgml        doc/src/sgml/ref/create_tsdictionary.sgml
doc/src/sgml/ref/create_aggregate.sgml      doc/src/sgml/ref/create_foreign_data_wrapper.sgml  doc/src/sgml/ref/create_opfamily.sgml     doc/src/sgml/ref/create_statistics.sgml    doc/src/sgml/ref/create_tsparser.sgml
doc/src/sgml/ref/create_cast.sgml           doc/src/sgml/ref/create_foreign_table.sgml         doc/src/sgml/ref/create_policy.sgml       doc/src/sgml/ref/create_subscription.sgml  doc/src/sgml/ref/create_tstemplate.sgml
doc/src/sgml/ref/create_collation.sgml      doc/src/sgml/ref/create_function.sgml              doc/src/sgml/ref/create_procedure.sgml    doc/src/sgml/ref/create_table_as.sgml      doc/src/sgml/ref/create_type.sgml
doc/src/sgml/ref/create_conversion.sgml     doc/src/sgml/ref/create_group.sgml                 doc/src/sgml/ref/create_publication.sgml  doc/src/sgml/ref/create_table.sgml         doc/src/sgml/ref/create_user_mapping.sgml
doc/src/sgml/ref/create_database.sgml       doc/src/sgml/ref/create_index.sgml                 doc/src/sgml/ref/create_role.sgml         doc/src/sgml/ref/create_tablespace.sgml    doc/src/sgml/ref/create_user.sgml
doc/src/sgml/ref/createdb.sgml              doc/src/sgml/ref/create_language.sgml              doc/src/sgml/ref/create_rule.sgml         doc/src/sgml/ref/create_transform.sgml     doc/src/sgml/ref/createuser.sgml
doc/src/sgml/ref/create_domain.sgml         doc/src/sgml/ref/create_materialized_view.sgml     doc/src/sgml/ref/create_schema.sgml       doc/src/sgml/ref/create_trigger.sgml       doc/src/sgml/ref/create_view.sgml
doc/src/sgml/ref/create_event_trigger.sgml  doc/src/sgml/ref/create_opclass.sgml               doc/src/sgml/ref/create_sequence.sgml     doc/src/sgml/ref/create_tsconfig.sgml

增添create package语法帮助

仿照create_table.sgml或其他文件,生成create_package.sgml和create_package_body.sgml文件。

从create_help.pl可知:
cmd取自sgml文件中refname标签,help取自synopsis标签,docbook_id取自refentry id标签。

因此create_package.sgml为:



<refentry id=\"sql-createpackage\">
 <indexterm zone=\"sql-createpackage\">
  <primary>CREATE PACKAGE</primary>
 </indexterm>

 <refmeta>
  <refentrytitle>CREATE PACKAGE</refentrytitle>
  <manvolnum>7</manvolnum>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>

 <refnamediv>
  <refname>CREATE PACKAGE</refname>
  <refpurpose>define a new package</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
<synopsis>
CREATE [ OR REPLACE ] PACKAGE [schema.] <replaceable class=\"parameter\">package_name</replaceable>  [invoker_rights_clause] [IS | AS] 
   item_list[, item_list ...]  
END [<replaceable class=\"parameter\">package_name</replaceable>]

invoker_rights_clause:
    AUTHID [CURRENT_USER | DEFINER]

item_list: 
[
   function_declaration    | 
   procedure_declaration   | 
   type_definition         | 
   cursor_declaration      | 
   item_declaration
]

function_declaration:
     FUNCTION <replaceable class=\"parameter\">function_name</replaceable> [ (parameter_declaration[, ...]) ] RETURN datatype;

procedure_declaration:
     PROCEDURE <replaceable class=\"parameter\">procedure_name</replaceable> [ (parameter_declaration[, ...]) ]

type_definition:
     record_type_definition      |
     ref_cursor_type_definition

cursor_declaration:
   CURSOR <replaceable class=\"parameter\">name</replaceable>  [(cur_param_decl[, ...])] RETURN rowtype;

item_declaration:
     cursor_declaration             |
     cursor_variable_declaration    |
     record_variable_declaration    |
     variable_declaration           |

record_type_definition:
   TYPE record_type IS RECORD  ( variable_declaration [, variable_declaration]... ) ;

ref_cursor_type_definition:
   TYPE type IS REF CURSOR [ RETURN type%ROWTYPE ];

cursor_variable_declaration:
   curvar curtype;

record_variable_declaration:
   recvar { record_type | rowtype_attribute | record_type%TYPE };

variable_declaration:
   varname datatype [ [ NOT NULL ] := expr ]

parameter_declaration:
   parameter_name [IN] datatype [[:= | DEFAULT] expr]

</synopsis>
 </refsynopsisdiv>

create_package_body.sgml为:



<refentry id=\"sql-createpackagebody\">
 <indexterm zone=\"sql-createpackagebody\">
  <primary>CREATE PACKAGE BODY</primary>
 </indexterm>

 <refmeta>
  <refentrytitle>CREATE PACKAGE BODY</refentrytitle>
  <manvolnum>7</manvolnum>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>

 <refnamediv>
  <refname>CREATE PACKAGE BODY</refname>
  <refpurpose>define a new package body</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
<synopsis>

CREATE [ OR REPLACE ] PACKAGE BODY [schema.] <replaceable class=\"parameter\">package_name</replaceable> [IS | AS]
   [item_list[, item_list ...]] | 
   item_list_2 [, item_list_2 ...]
   [initialize_section]
END [ <replaceable class=\"parameter\">package_name</replaceable> ];


initialize_section:
   BEGIN statement[, ...]

item_list: 
[
   function_declaration    | 
   procedure_declaration   | 
   type_definition         | 
   cursor_declaration      | 
   item_declaration
]

item_list_2:
[
   function_declaration
   function_definition
   procedure_declaration
   procedure_definition
   cursor_definition
]

function_definition:
   FUNCTION <replaceable class=\"parameter\">function_name</replaceable> [ (parameter_declaration[, ...]) ] RETURN datatype  [IS | AS]
   [declare_section] body;

procedure_definition:
   PROCEDURE <replaceable class=\"parameter\">procedure_name</replaceable> [ (parameter_declaration[, ...]) ] [IS | AS] 
   [declare_section] body;

cursor_definition:
   CURSOR <replaceable class=\"parameter\">name</replaceable> [ (cur_param_decl[, ...]) ] RETURN rowtype IS select_statement;

body:
   BEGIN statement[, ...] END [name];

statement:
   [<<LABEL>>] pl_statments[, ...];


</synopsis>
 </refsynopsisdiv>

当然还需对helpSQL函数做些修改,当查询的语法帮助为create package(body)时,展示IvorySQL对应的官方文档URL。

for (i = 0; QL_HELP[i].cmd; i++)
{
	if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
		strcmp(topic, \"*\") == 0)
	{
		PQExpBufferData buffer;
		char       *url;

		initPQExpBuffer(&buffer);
		QL_HELP[i].syntaxfunc(&buffer);
		if (pg_strncasecmp(QL_HELP[i].docbook_id, \"sql-createpackage\",17) == 0)
			url = \"https://www.ivorysql.org/en/docs/compatibillity_features/package n\"
                \"DETAIL: https://docs.ivorysql.org/en/ivorysql-doc/v4.6/v4.6/28\";
		else
			url = psprintf(\"https://www.postgresql.org/docs/%s/%s.html\",
					strstr(PG_VERSION, \"devel\") ? \"devel\" : PG_MAJORVERSION,
					QL_HELP[i].docbook_id);
		/* # of newlines in format must match constant above! */
		fprintf(output, _(\"Command:     %sn\"
				  \"Description: %sn\"
				  \"Syntax:n%snn\"
				  \"URL: %snn\"),
			QL_HELP[i].cmd,
			_(QL_HELP[i].help),
			buffer.data,
			url);
		if (pg_strncasecmp(QL_HELP[i].docbook_id, \"sql-createpackage\",17))
			free(url);
		termPQExpBuffer(&buffer);

		/* If we have an exact match, exit.  Fixes h SELECT */
		if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
			break;
	}
}

重新编译安装psql工具后,已经可以查看create package的语法帮助了。

h create package

psql (17.6)
Type \"help\" for help.

ivorysql=# h create package
Command:     CREATE PACKAGE
Description: define a new package
Syntax:
CREATE [ OR REPLACE ] PACKAGE [schema.] package_name  [invoker_rights_clause] [IS | AS] 
   item_list[, item_list ...]  
END [package_name]

invoker_rights_clause:
    AUTHID [CURRENT_USER | DEFINER]

item_list: 
[
   function_declaration    | 
   procedure_declaration   | 
   type_definition         | 
   cursor_declaration      | 
   item_declaration
]

function_declaration:
     FUNCTION function_name [ (parameter_declaration[, ...]) ] RETURN datatype;

procedure_declaration:
     PROCEDURE procedure_name [ (parameter_declaration[, ...]) ]

type_definition:
     record_type_definition      |
     ref_cursor_type_definition

cursor_declaration:
   CURSOR name  [(cur_param_decl[, ...])] RETURN rowtype;

item_declaration:
     cursor_declaration             |
     cursor_variable_declaration    |
     record_variable_declaration    |
     variable_declaration           |

record_type_definition:
   TYPE record_type IS RECORD  ( variable_declaration [, variable_declaration]... ) ;

ref_cursor_type_definition:
   TYPE type IS REF CURSOR [ RETURN type%ROWTYPE ];

cursor_variable_declaration:
   curvar curtype;

record_variable_declaration:
   recvar { record_type | rowtype_attribute | record_type%TYPE };

variable_declaration:
   varname datatype [ [ NOT NULL ] := expr ]

parameter_declaration:
   parameter_name [IN] datatype [[:= | DEFAULT] expr]

URL: https://www.ivorysql.org/en/docs/compatibillity_features/package 
DETAIL: https://docs.ivorysql.org/en/ivorysql-doc/v4.6/v4.6/28

ivorysql=#

h create package body

psql (17.6)
Type \"help\" for help.

ivorysql=# h create package body
Command:     CREATE PACKAGE BODY
Description: define a new package body
Syntax:
CREATE [ OR REPLACE ] PACKAGE BODY [schema.] package_name [IS | AS]
   [item_list[, item_list ...]] | 
   item_list_2 [, item_list_2 ...]
   [initialize_section]
END [ package_name ];


initialize_section:
   BEGIN statement[, ...]

item_list: 
[
   function_declaration    | 
   procedure_declaration   | 
   type_definition         | 
   cursor_declaration      | 
   item_declaration
]

item_list_2:
[
   function_declaration
   function_definition
   procedure_declaration
   procedure_definition
   cursor_definition
]

function_definition:
   FUNCTION function_name [ (parameter_declaration[, ...]) ] RETURN datatype  [IS | AS]
   [declare_section] body;

procedure_definition:
   PROCEDURE procedure_name [ (parameter_declaration[, ...]) ] [IS | AS] 
   [declare_section] body;

cursor_definition:
   CURSOR name [ (cur_param_decl[, ...]) ] RETURN rowtype IS select_statement;

body:
   BEGIN statement[, ...] END [name];

statement:
   [<<LABEL>>] pl_statments[, ...];

URL: https://www.ivorysql.org/en/docs/compatibillity_features/package 
DETAIL: https://docs.ivorysql.org/en/ivorysql-doc/v4.6/v4.6/28

ivorysql=#

小结

psql的语法帮助文档挺好用的,本次给IvorySQL-4.6适配create package(body)语法帮助文档算是比较系统的了解了下语法帮助文档的原理。

引用:

[1]
helpSQL:
github.com/IvorySQL/Iv…

[2]
URL: www.ivorysql.org/en/docs/Com…

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 为IvorySQL增添PACKAGE语法帮助 https://www.zuozi.net/35749.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务