详细介绍:为IvorySQL增添PACKAGE语法帮助

news/2026/1/26 11:48:38/文章来源:https://www.cnblogs.com/tlnshuju/p/19532476

详细介绍:为IvorySQL增添PACKAGE语法帮助

2026-01-26 11:45  tlnshuju  阅读(0)  评论(0)    收藏  举报

认识语法帮助

当使用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为:


CREATE PACKAGECREATE PACKAGE7SQL - Language StatementsCREATE PACKAGEdefine a new package

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]

create_package_body.sgml为:


CREATE PACKAGE BODYCREATE PACKAGE BODY7SQL - Language StatementsCREATE PACKAGE BODYdefine a new package body

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_declarationfunction_definitionprocedure_declarationprocedure_definitioncursor_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:[<

当然还需对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:     %s\n"
"Description: %s\n"
"Syntax:\n%s\n\n"
"URL: %s\n\n"),
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/28ivorysql=#

小结

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

引用:

[1]
helpSQL:
https://github.com/IvorySQL/IvorySQL/blob/IvorySQL_4.6/src/bin/psql/help.c#L575

[2]
URL: https://www.ivorysql.org/en/docs/Compatibillity_Features/package

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1218812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年AI搜索引擎排名,北京实力强的AI搜索平台选哪家

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家在AI搜索领域具备标杆实力的服务企业,为企业布局AI获客赛道提供客观依据,助力精准匹配适配的AI搜索服务伙伴。 TOP1 推荐:北京匠潮网络科技有限公司 推荐指…

GPEN人像增强性能优化指南,让修复速度提升2倍

GPEN人像增强性能优化指南&#xff0c;让修复速度提升2倍 关键词 GPEN、人像修复、人脸增强、图像超分、推理加速、PyTorch 2.5、CUDA 12.4、facexlib、basicsr、模型部署优化 摘要 GPEN&#xff08;GAN Prior Embedding Network&#xff09;是专为人脸图像修复与增强设计的…

Xenos深度探索:突破Windows DLL注入技术边界的逆向工程实践

Xenos深度探索&#xff1a;突破Windows DLL注入技术边界的逆向工程实践 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos 技术痛点与解决方案&#xff1a;DLL注入领域的三大挑战 在Windows系统安全与逆向工程领域&…

Mac百度网盘性能优化指南:实现3倍下载速度提升的技术方案

Mac百度网盘性能优化指南&#xff1a;实现3倍下载速度提升的技术方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 您是否经常遇到百度网盘下载速度远…

HsMod炉石传说插件:55+实用功能助你告别繁琐操作,轻松享受游戏乐趣

HsMod炉石传说插件&#xff1a;55实用功能助你告别繁琐操作&#xff0c;轻松享受游戏乐趣 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 核心价值 为炉石传说玩家提供一站式游戏增强解决方案&am…

2026最新少儿机器人学习实力机构推荐排行榜

2026年科技教育的普及度持续提升,为孩子挑选优质的机器人学习机构,是培养其动手实践、逻辑思维与创新能力的关键,也能为孩子接触前沿科技、探索科技领域搭建核心桥梁。 在国内众多机器人教育机构中,斯坦星球凭借系…

自托管照片管理:3个维度构建私有照片库的完整解决方案

自托管照片管理&#xff1a;3个维度构建私有照片库的完整解决方案 【免费下载链接】immich 自主托管的照片和视频备份解决方案&#xff0c;直接从手机端进行操作。 项目地址: https://gitcode.com/GitHub_Trending/im/immich 在数字时代&#xff0c;个人照片和视频的管理…

Blender乐高插件完全指南:从3D建模到高效渲染的专业流程

Blender乐高插件完全指南&#xff1a;从3D建模到高效渲染的专业流程 【免费下载链接】ImportLDraw A Blender plug-in for importing LDraw file format Lego models and parts. 项目地址: https://gitcode.com/gh_mirrors/im/ImportLDraw 在3D建模领域&#xff0c;乐高…

3个技巧玩转TranslationPlugin语音合成:提升开发者文档阅读效率

3个技巧玩转TranslationPlugin语音合成&#xff1a;提升开发者文档阅读效率 【免费下载链接】TranslationPlugin YiiGuxing/TranslationPlugin: TranslationPlugin是一款专为JetBrains系列IDE&#xff08;例如IntelliJ IDEA&#xff09;打造的翻译插件&#xff0c;允许开发者直…

3步搞定微信消息恢复:终极数据拯救方案

3步搞定微信消息恢复&#xff1a;终极数据拯救方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitHub_Trend…

视频离线存储技术全解析:从本地缓存到跨设备媒体同步的实现路径

视频离线存储技术全解析&#xff1a;从本地缓存到跨设备媒体同步的实现路径 【免费下载链接】shaka-player JavaScript player library / DASH & HLS client / MSE-EME player 项目地址: https://gitcode.com/GitHub_Trending/sh/shaka-player 概念解析&#xff1a;…

邮件调试终极解决方案:构建本地SMTP测试环境的完整指南

邮件调试终极解决方案&#xff1a;构建本地SMTP测试环境的完整指南 【免费下载链接】mailcatcher Catches mail and serves it through a dream. 项目地址: https://gitcode.com/gh_mirrors/ma/mailcatcher 作为开发者&#xff0c;你是否正面临这些邮件调试困境&#xf…

全栈统一告警:高效排障,运维无忧

智和信通统一告警方案通过构建全栈式、智能化、闭环化的告警管理体系,从根源上解决传统告警模式 “分散、泛滥、定位难、响应慢” 的核心痛点,推动企业运维模式从 “被动救火” 向 “主动预警”、从 “分散管理” 向…

沸石转筒设备生产厂家质量对比与推荐

随着国家“双碳”战略深入推进以及《大气污染防治法》等环保法规日趋严格,挥发性有机物(VOCs)治理已成为工业企业的刚性需求。在众多VOCs治理技术中,沸石转筒(又称沸石转轮)吸附浓缩+催化燃烧/蓄热燃烧(CO/RTO)…

想转岗网安却零基础?10 个简单教程,避开复杂理论,轻松上手核心技能!

前言 随着新一轮科技和产业变革加速演进&#xff0c;人工智能、物联网、大数据、5G等创新技术在成为经济社会发展的助推器的同时&#xff0c;也让网络空间变得更加复杂&#xff0c;对网络安全提出了更为严峻的挑战&#xff0c;全球范围内网络安全事件日益增加&#xff0c;网络…

告别重复劳作,迎接智能游戏生活:M9A游戏效率工具全方位解析

告别重复劳作&#xff0c;迎接智能游戏生活&#xff1a;M9A游戏效率工具全方位解析 【免费下载链接】M9A 重返未来&#xff1a;1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9a/M9A 玩家日常痛点图谱 当代玩家在《重返未来&#xff1a;1999》等回合制游戏中…

PyTorch-2.x-Universal-Dev-v1.0实战:从安装到模型训练全流程

PyTorch-2.x-Universal-Dev-v1.0实战&#xff1a;从安装到模型训练全流程 1. 镜像初体验&#xff1a;开箱即用的深度学习开发环境 你是否经历过这样的场景&#xff1a;花两小时配置CUDA、PyTorch、Jupyter&#xff0c;结果发现版本不兼容&#xff1b;好不容易跑通一个demo&am…

Flink 2.x 部署与扩展能力Standalone / Docker / Kubernetes(Standalone Native)+ HiveModule + OpenAI 推理函

1. 先把“部署积木”想清楚&#xff1a;Client、JobManager、TaskManager Flink 的核心组件永远是这三个&#xff1a; Client&#xff1a;把你的作业&#xff08;Jar/SQL&#xff09;编译成 JobGraph 并提交JobManager&#xff1a;统筹调度、容错、Web UI、RESTTaskManager&a…

2026 零基础小白的网安逆袭指南,纯干货不废话!

2026 零基础小白的网安逆袭指南&#xff0c;纯干货不废话&#xff01; 一、网络安全难学吗&#xff1f; 在当今数字化时代&#xff0c;网络安全已成为我们生活中不可或缺的一部分。那么&#xff0c;究竟什么是网络安全呢&#xff1f;简单来说&#xff0c;网络安全是指保护网络…

零基础能学网络安全吗?学网安不一定要有专业背景

零基础能不能学网络安全&#xff0c;这个问题相信很多小伙伴都想了解一下。 从学历要求开始说起&#xff0c;一般对于想要学习网络安全并且入行的人而言&#xff0c;最好是本科及以上&#xff0c;最低大专学历。 题主的情况是本身已经在单位上班&#xff0c;单位派你学习&…