IvorySQL及其架构设计
IvorySQL是由浪潮软件集团瀚高股份发起的开源项目,基于PostgreSQL,遵循Apache 2.0开源协议。该项目100%兼容PostgreSQL,并紧跟PG内核升级,每季度发布小版本,每年发布大版本。最新版本为IvorySQL V3.3(基于PostgreSQL 16.3)。
IvorySQL V3总体架构
IvorySQL V3基于PostgreSQL 16,通过双Parser和双端口接收外部请求,扩展PL/iSQL框架,并利用插件ivorysql_ora实现兼容性功能。这种设计提供与Oracle数据库相似的特性和行为,同时保持与PostgreSQL的兼容性。
兼容模式
IvorySQL采用双端口设计,保持5432端口兼容原有postgres,并使用1521端口作为独立登录端口,默认采用oracle兼容模式。若需从5432端口登录并进入兼容模式,需通过compatible_mode参数设置。
Ivorysql_ora插件
ivorysql_ora是IvorySQL数据库兼容Oracle功能的外部插件,实现兼容Oracle的数据类型、内置函数、XML函数、系统视图、merge命令等功能。该插件仅能在IvorySQL内核中运行,源码目录中包含多个子目录,每个子目录实现一个功能。作为内置插件,在Oracle模式下初始化时自动加载。
XML函数
IvorySQL在PostgreSQL基础上实现与Oracle XML函数的高度兼容,确保从Oracle迁移到IvorySQL后的数据格式和结构一致性。这包括11个常用XML SQL函数的兼容性,使用libxml2库提供接口。
使用实例
准备基础数据:
CREATE TABLE inaf (a INT, b XMLType);
INSERT INTO inaf VALUES (1, xmltype('<a><b>100</b></a>'));
INSERT INTO inaf VALUES (2, '');
CREATE TABLE xmltest (id INT, data XMLType);
INSERT INTO xmltest VALUES (1, '<value>one</value>');
INSERT INTO xmltest VALUES (2, '<value>two</value>');
CREATE TABLE xmlnstest (id INT, data XMLType);
INSERT INTO xmlnstest VALUES (1, xmltype('<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:typ=\"http://www.def.com\" xmlns:web=\"http://www.abc.com\"><soapenv:Body><web:BBB><typ:EEE>41</typ:EEE><typ:FFF>42</typ:FFF></web:BBB></soapenv:Body></soapenv:Envelope>'));
函数示例用法:
extract(XML): 返回XML节点路径下的内容。
extractvalue: 提供对XML内容的检索功能,返回一个节点的一个值。
existsnode: 检查XML内容是否符合指定的路径表达式。
deletexml: 删除指定路径的XML节点。
appendchildxml: 在XML对象中插入子节点。
updatexml: 更新特定XML节点路径的内容。
insertxmlbefore: 在XML中的指定路径前插入子节点。
insertchildxml: 向指定的XML路径中插入子节点。
insertchildxmlbefore: 向指定的XML路径之前插入子节点。
技术实现原理
IvorySQL实现Oracle 12c中11个常用XML SQL函数的兼容性时,与PostgreSQL保持一致,底层处理函数采用libxml2库提供的接口。添加了XMLType数据类型,将用户提供的字符串转换成内部统一的XMLType类型,简化迁移过程。
实现方式分为两种:
- 除
UPDATEXML外,其他10个函数通过SQL函数实现。
UPDATEXML采用表达式方式实现,需编写专门的语法分析代码和执行器代码。
xmlNode结构体定义了XML节点的树状和链表结构,实现核心在于找到需要操作的节点。
欢迎贡献
IvorySQL社区欢迎所有类型的贡献,提供丰富的奖励,包括荣誉证书、评选、资金及物料支持等。
联系方式
- 官方网址:https://www.ivorysql.org
- 社区仓库:https://github.com/IvorySQL/IvorySQL
- IvorySQLCloud:https://github.com/IvorySQL/ivory-cloud/tree/IVYC_REL_3.0_STABLE
- IvorySQLOperator:https://github.com/IvorySQL/ivory-operator
加入我们
关注公众号解锁更多技术干货,添加小助理微信加入IvorySQL技术交流群,关注视频号了解最新视频动态。