800 Commits

Author SHA1 Message Date
6f9a7bb9fc !6737 修复HTAP备节点偶现获取列信息问题
Merge pull request !6737 from sovyyvos/master
2024-11-29 06:09:28 +00:00
466faceb39 !6740 修复备机在线failover中stmtwoker线程无法退出的问题
Merge pull request !6740 from 钟承志/master
2024-11-28 12:57:35 +00:00
05f6a4a9de modified: src/gausskernel/ddes/adapter/ss_transaction.cpp
modified:   src/gausskernel/storage/access/heap/heapam.cpp

	modified:   heapam.cpp

	modified:   gausskernel/storage/access/heap/heapam.cpp
2024-11-28 19:58:28 +08:00
f6c82949af !6717 行列融合设置列属性大小限制
Merge pull request !6717 from Eureka/htap_sys_func
2024-11-28 11:22:57 +00:00
d3433d8493 !6739 rebuild drc时,清空所有seq为0
Merge pull request !6739 from wzd/queue_fix_2
2024-11-28 09:12:13 +00:00
54a66623d6 修复HTAP备节点偶现获取列信息问题 2024-11-28 14:42:21 +08:00
1575f26d57 行列融合增加列最大长度限制 2024-11-28 09:17:14 +08:00
wzd
cc9068e8cb rebuild drc时,清空所有seq为0 2024-11-27 21:06:05 +08:00
0d56a5a5a8 !6720 openGauss docker更新7.0.0-rc1
Merge pull request !6720 from 胡淳滔/docker_final
2024-11-27 03:37:22 +00:00
5afd770e47 !6731 [bugfix]修复因添加断言导致的异常core的问题
Merge pull request !6731 from songlinxuan/11_27
2024-11-27 02:38:29 +00:00
390e3b69b2 [bufix]修复因添加断言导致的异常core的问题 2024-11-27 10:00:12 +08:00
c9d1922544 !6728 修复LZ_UNCOMPRESS_EXTRACT可连续使用的问题
Merge pull request !6728 from 王平云/master
2024-11-27 01:51:06 +00:00
30d8cc0f1e !6725 【bugfix】修复资源池化流控日志打印错误的问题
Merge pull request !6725 from 周聪/bugfix_log_ctrl_output_pr
2024-11-26 12:02:30 +00:00
13ac38a28e !6724 优化neon l2_squared
Merge pull request !6724 from wangjingyuan8/neon
2024-11-26 11:17:56 +00:00
fbd2e1aac2 !6729 修复_outPlannedStmt函数逻辑错误
Merge pull request !6729 from james/gms_debug
2024-11-26 10:01:29 +00:00
31d2bf4219 openGauss docker更新7.0.0-rc1 2024-11-26 17:45:44 +08:00
5516d498a5 优化neon l2_squared 2024-11-26 17:14:33 +08:00
fb2f6fc894 add fix 2024-11-26 16:52:38 +08:00
0ca45d51f0 修复LZ_UNCOMPRESS_EXTRACT可连续使用 2024-11-26 14:44:59 +08:00
5dd3744208 !6632 A模式下to_char函数溢出情况下输出不符合预期
Merge pull request !6632 from JulianZhang/to_char_overflow
2024-11-26 06:23:41 +00:00
1e567d4338 !6708 浮点数特殊值控制添加A库隔离
Merge pull request !6708 from 王平云/fix1
2024-11-26 03:58:04 +00:00
5085ff1b95 !6671 修复执行检查点时batch double write文件的恢复起始位置计算错误的问题
Merge pull request !6671 from april01xxx/master_double_write
2024-11-26 03:56:41 +00:00
bc23e7d971 !6706 修复环境变量不带BUILD_TUPLE时dolphin cmake失败以及带ENABLE_HTAP编译选项 dolphin无法使用的问题
Merge pull request !6706 from chenxiaobin/fixdolphincmake
2024-11-26 03:20:10 +00:00
57589b382e to_char(numeric) overflow return ######## 2024-11-26 10:01:41 +08:00
aabdd94b1f 调整资源池化流控日志 2024-11-26 09:35:44 +08:00
d9c302e7f6 !6721 dss推点
Merge pull request !6721 from Carl/master
2024-11-25 12:30:51 +00:00
58a6b34961 !6712 修复xmlgen插件问题
Merge pull request !6712 from 梅程/fixXmlNumer
2024-11-25 09:54:24 +00:00
7809447e79 !6707 解决内置函数query_node_reform_info部分回放时间/构建时间字段获取异常问题
Merge pull request !6707 from zhangyukai/bugfix_query
2024-11-25 09:31:25 +00:00
064bb171ef DSS推点 2024-11-25 17:07:23 +08:00
c542453715 !6718 修改bin_to_num元信息部分字段,保证直装和升级信息一致
Merge pull request !6718 from JulianZhang/fix_bin_to_num
2024-11-25 08:25:55 +00:00
2267325740 修复内置函数query_node_reform_info部分时间字段获取异常问题 2024-11-25 16:22:15 +08:00
cabac68195 修复xmlgen插件问题 2024-11-25 15:28:08 +08:00
535c7c9d2b !6711 修复创建package同时存在不同参数mode的同名重载proc和func,创建成功,但pg_proc中仅一条记录的问题
Merge pull request !6711 from wangfeihuo/master
2024-11-25 06:18:54 +00:00
3e62019509 !6686 cume_dist/rank/percent_rank/dense_rank函数返回结果不符合预期
Merge pull request !6686 from TinyBag/window
2024-11-25 03:22:05 +00:00
5d6de5a235 !6674 B兼容模式下执行show events报语法错误
Merge pull request !6674 from TinyBag/event
2024-11-25 03:19:35 +00:00
8c23e763b1 !6713 处理issue:replace package spec/body后包函数oid改变,导致依赖视图不可用
Merge pull request !6713 from lukeman/master
2024-11-25 03:16:19 +00:00
fff356750d fix bin_to_num meta data 2024-11-25 10:28:31 +08:00
5fd2674dcf 【标题】:修复创建package同时存在不同参数mode的同名重载proc和func,创建成功,但pg_proc中仅一条记录的问题
【实现内容】: 修复创建package同时存在不同参数mode的同名重载proc和func,创建成功,但pg_proc中仅一条记录的问题.
【根因分析】: 此场景下之前没报错,当前直接报错处理.
【实现方案】: 此场景下直接报错处理
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IAROUT
2024-11-25 10:27:24 +08:00
2881f67a42 !2439 修复 ThreadPoolCommitterCtl 构造时 m_geiKilled未被初始化
Merge pull request !2439 from chardo/init_m_getkilled
2024-11-25 02:00:51 +00:00
92346f618f 浮点数特殊值GUC添加A库隔离 2024-11-25 09:51:56 +08:00
4f9206b011 !3890 【神舟通用】 测试用例user_host_test执行后会修改pg_hba,导致后续所有测试用例出错,执行完后应该还原pg_hba
Merge pull request !3890 from 雷紫薇/123933
2024-11-25 01:33:03 +00:00
de447bedce !3630 修复AddCStringVar函数中memcpy_s越界
Merge pull request !3630 from 木匠钉子/memcpy_overflow
2024-11-25 01:32:32 +00:00
95e22bd161 !4317 修复 “debug版本修改enable_incremental_checkpoint = on -> off 产生 coredump” 的问题
Merge pull request !4317 from cuikaifeng/ccheckpoint
2024-11-25 01:25:20 +00:00
94e12a649d quote interval 2024-11-25 09:24:29 +08:00
f8d8a9de40 !6696 【feature】realtime_build_log_ctrl_status()视图函数添加
Merge pull request !6696 from zhenjinyang/master
2024-11-25 01:21:30 +00:00
d796f9db56 !4455 修复 assemble xlogrecord 中 maindata header 注册问题
Merge pull request !4455 from yunlongwang/master
2024-11-23 08:11:00 +00:00
b1c9aff987 !6716 回合6.0.0到master,https://gitee.com/opengauss/openGauss-server/pulls/6649
Merge pull request !6716 from douxin/cherry-pick-1732333383
2024-11-23 07:19:28 +00:00
d48d28409a 修复hypo agg结果与A兼容不一致的问题 2024-11-23 15:02:47 +08:00
d5436a5196 !4193 修复CBM Writer线程执行异常时未关闭打开的hash table的问题
Merge pull request !4193 from april01xxx/master_cbm
2024-11-23 07:02:24 +00:00
ff1d257dee !6303 修复heap_prune_chain()中不匹配的gstrace_entry和gstrace_exit
Merge pull request !6303 from scmysxb/sxb_bugfix_912
2024-11-23 06:12:29 +00:00
083b317fb9 !5733 【A兼容性】多表视图更新/删除
Merge pull request !5733 from yelingzhi/req_I9H7H6_multi_table_view_update_latest
2024-11-23 06:07:47 +00:00
c9d1972658 !6141 消除elog中reset和clean时不必要的内存上下文切换
Merge pull request !6141 from xiyanziran/master-cleanerr
2024-11-23 04:16:04 +00:00
09d8dd20f3 fix bug #IB3O0M fix code 修复几处6.0.0 中代码问题
(cherry picked commit from <gitee.com//opengauss/openGauss-server/commit/a44a78b5ad00bfb81459c92ea33b83c09101ca65>
2024-11-23 03:43:09 +00:00
138282679a !6547 【CleanCode】删除ExecuteSqlQueryForSingleRow函数中多余的ngettext
Merge pull request !6547 from 杨浩/master
2024-11-23 03:41:40 +00:00
2c95042226 !6599 修复在创建分区表时,表达式内部有类型转换导致报错的bug
Merge pull request !6599 from wangxf/partition_fix
2024-11-23 03:39:26 +00:00
d2f0d44fbc !6644 修复审计线程每次启动初始化内存
Merge pull request !6644 from Jenny/auditor-fix
2024-11-23 03:32:41 +00:00
dd1bf9c9e2 处理issue:replace package spec/body后包函数oid改变,导致依赖视图不可用 2024-11-23 11:09:44 +08:00
c529100581 !6698 解决failover时备节点worker&TrackStmtClean线程无法退出的问题,以及新主节点core问题;
Merge pull request !6698 from 钟承志/master
2024-11-22 09:34:08 +00:00
750d8284c2 流控视图添加 2024-11-22 17:25:34 +08:00
2ca7da4773 modified: src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
modified:   src/gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   src/gausskernel/process/threadpool/knl_instance.cpp
	modified:   src/gausskernel/storage/buffer/bufmgr.cpp
	modified:   src/gausskernel/storage/smgr/segment/segbuffer.cpp
	modified:   src/include/ddes/dms/ss_dms_recovery.h
	modified:   src/include/knl/knl_thread.h

	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   segbuffer.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   ddes/adapter/ss_dms_bufmgr.cpp
	modified:   storage/smgr/segment/segbuffer.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   src/gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   gausskernel/storage/buffer/bufmgr.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   gausskernel/process/threadpool/knl_instance.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   include/ddes/dms/ss_dms_recovery.h

	modified:   src/gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   src/gausskernel/process/threadpool/knl_instance.cpp
	modified:   src/gausskernel/storage/buffer/bufmgr.cpp
	modified:   src/include/ddes/dms/ss_dms_recovery.h

	modified:   src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   src/gausskernel/storage/buffer/bufmgr.cpp
	modified:   src/gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp
	modified:   src/gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   src/gausskernel/process/threadpool/knl_instance.cpp
	modified:   src/gausskernel/storage/buffer/bufmgr.cpp
	modified:   src/gausskernel/storage/smgr/segment/segbuffer.cpp
	modified:   src/include/ddes/dms/ss_dms_recovery.h
2024-11-22 15:30:01 +08:00
107b582554 !6690 NTH_VALUE支持FROM FIRST/LAST子句
Merge pull request !6690 from zhoujingbnu/noupdate
2024-11-22 02:24:11 +00:00
cf3bb97c5e !6638 支持高级包gms_debug
Merge pull request !6638 from james/gms_debug
2024-11-22 01:57:00 +00:00
6d7d75fac8 !6675 dms cbb推点以及适配opgs
Merge pull request !6675 from 陈超/master
2024-11-21 12:32:41 +00:00
8d3bfe4891 修复审计线程每次启动初始化内存 2024-11-21 17:51:18 +08:00
bd98c0c0ba 修复环境变量不带BUILD_TUPLE时dolphin cmake失败以及带ENABLE_HTAP编译选项 dolphin无法使用的问题 2024-11-21 16:53:31 +08:00
d82128dab3 add gms_debug 2024-11-21 14:43:03 +08:00
09f5614990 !6703 添加 .gitignore 用于忽略构建与 fastcheck 生成的文件
Merge pull request !6703 from Celestial/chore_gitignore
2024-11-21 06:41:37 +00:00
d314c922da !6702 更改浮点数特殊值显示控制GUC名称
Merge pull request !6702 from 王平云/master
2024-11-21 06:36:41 +00:00
91ff86f775 更改浮点数特殊值显示控制GUC名称 2024-11-21 10:36:45 +08:00
dd457346eb !6705 【轻量级 PR】:修复cmake编译失败问题
Merge pull request !6705 from pengjiong/N/A
2024-11-21 01:24:46 +00:00
a0cb100bc9 修复cmake编译失败问题
Signed-off-by: pengjiong <totaj@qq.com>
2024-11-20 13:10:20 +00:00
037b5d20cb chore(IB5T69): 添加 .gitignore 用于屏蔽构建与 fastcheck 生成的文件 2024-11-20 17:41:29 +08:00
a3470ec0d9 !6668 修复\h alter index提示信息缺少的问题
Merge pull request !6668 from levy5307/alter-index-help
2024-11-20 09:07:34 +00:00
d9873fe573 !6661 修复Qual子句下查询计划记录问题
Merge pull request !6661 from 申正/reslove_guc_reload
2024-11-20 06:23:30 +00:00
922dcdfa25 !6692 【mysql兼容性】解决group_concat下标计算为负数的问题
Merge pull request !6692 from 魏文韬/charset_fix
2024-11-20 02:48:12 +00:00
12f82d0a2b !6541 【bugfix】优化TransactionIdInProgress遍历子事务列表的性能
Merge pull request !6541 from 周聪/dev_subxid_TransactionIdIsInProgress
2024-11-20 02:47:05 +00:00
70e90e6f14 !6694 建库后的首轮reform非official节点不做限制,也可以参与抢锁
Merge pull request !6694 from 姜岩/master
2024-11-20 01:52:59 +00:00
a9d64cfe5e !6697 【Ehance】修复部分打印错误,增加DEBUG 断言
Merge pull request !6697 from songlinxuan/11_19
2024-11-19 14:03:39 +00:00
c5879c30fb fix query plan record when qual cause 2024-11-19 21:43:36 +08:00
5b7592a612 !6665 解决tsdb插入数据崩溃的问题
Merge pull request !6665 from 叶某人/new_core
2024-11-19 12:40:51 +00:00
aae2368e9b [Ehance]修改CMA打印的部分代码,增加ASSERT断言 2024-11-19 20:10:33 +08:00
6df9bf6d6b dms推点以及适配opgs 2024-11-19 17:35:03 +08:00
0c8ee4a16f !6677 【feature】资源池化实时构建适配流控
Merge pull request !6677 from 周聪/dev_realtime_build_log_ctrl_pr
2024-11-19 09:34:49 +00:00
67abff5f12 !6682 LWLock支持超时等锁、X锁降级机制
Merge pull request !6682 from hejiahuan11/LWLock
2024-11-19 09:34:07 +00:00
027ddc3bfc 资源池化实时构建适配流控 2024-11-19 16:30:21 +08:00
afaf73f051 LWLock Timeout and Downgrade 2024-11-19 16:06:45 +08:00
de0b4bc1c5 [mysql兼容性] 解决group_concat长度计算为复数的问题 2024-11-19 15:02:27 +08:00
f6f33cd19e !6684 修复非轻量版cmake不带dblink,以及dolphin插件无法使用问题
Merge pull request !6684 from chenxiaobin/fixdolphincmake
2024-11-19 01:36:51 +00:00
a9c38fe963 !6676 [MYSQL兼容性]处理issue:存储过程中携带execute prepare语句,创建存储过程成功但执行失败
Merge pull request !6676 from lukeman/master
2024-11-19 01:33:42 +00:00
89785df263 [MYSQL兼容性]处理issue:存储过程中携带execute prepare语句,创建存储过程成功但执行失败 2024-11-18 21:16:35 +08:00
0cf960036e !6683 统一dss api接口返回值
Merge pull request !6683 from 胡正超/dssretry
2024-11-18 12:56:46 +00:00
4dda826dd0 !6687 修复!6429引入的to_char处理interval入参结果有差异
Merge pull request !6687 from Wang Xinyu 7/tochar-fix
2024-11-18 11:31:45 +00:00
95744be465 !6678 添加GUC参数控制B库下创建分区表默认表现为LOCAL
Merge pull request !6678 from zhubin79/local_index
2024-11-18 11:26:06 +00:00
4234b0220a !6660 B库下MOT表char类型判断长度修改为字符长度
Merge pull request !6660 from zhubin79/mot_charlen
2024-11-18 11:17:13 +00:00
6fe721ff5b nth_value enhancement feature without changing buildin function 2024-11-18 18:54:40 +08:00
e409549586 修复!6429引入的to_char处理interval入参结果有差异 2024-11-18 17:13:30 +08:00
4f595e2154 B库下MOT表char类型判断长度修改为字符长度 2024-11-18 16:02:23 +08:00
003953b12e 修复非轻量版cmake不带dblink,以及dolphin插件无法使用问题 2024-11-18 11:58:14 +08:00
5d0a70d01f dss api use the standard define return value 2024-11-18 11:37:00 +08:00
4cc77b3d02 !6679 同步pg_terminate_active_session_socket
Merge pull request !6679 from chenxiaobin/fixCume
2024-11-18 02:29:48 +00:00
7525a01637 放开首轮reform限制 2024-11-18 09:53:05 +08:00
fa5b44ad23 同步pg_terminate_active_session_socket 2024-11-16 14:24:50 +08:00
ed608ae721 添加GUC参数控制B库下创建分区表默认表现为LOCAL 2024-11-16 10:43:46 +08:00
32a99d1c40 修复执行检查点时batch double write文件的恢复起始位置计算错误的问题。 2024-11-15 19:01:40 +08:00
afe1ca5621 !6673 行列融合系统函数增加函数描述和稳定性参数
Merge pull request !6673 from Eureka/htap_sys_func
2024-11-15 08:10:15 +00:00
8ee3926508 行列融合系统函数增加函数描述和稳定性参数 2024-11-15 14:36:11 +08:00
edf3dc59e7 \h alter index 2024-11-14 22:13:15 -05:00
0b7220f465 !6657 【SS】修复stmt线程备机failover时的core问题
Merge pull request !6657 from 胡正超/master
2024-11-14 12:47:17 +00:00
f4e3fa0705 解决tsdb插入数据崩溃的问题 2024-11-14 18:54:31 +08:00
a99f41d753 !6658 修复 corr_* 中 two_sided_p_value > 1 的缺陷
Merge pull request !6658 from yigecheng/corr_dev
2024-11-14 07:55:24 +00:00
2360996938 修复corr_*中two_sided_p_value>1的问题 2024-11-14 15:20:43 +08:00
0ea58f71d7 !6659 修正 CREATE USER 语法解析报错信息
Merge pull request !6659 from Celestial/fix_gram_create_user
2024-11-13 12:14:27 +00:00
755072a952 fix: 修正 CREATE USER 语法解析报错信息 2024-11-13 18:05:19 +08:00
31aa1b440d ss standby_statement_history 2024-11-13 16:51:24 +08:00
c8242676b8 !6654 修复nls_initcap函数直接安装和升级后argmodes参数不一致
Merge pull request !6654 from Rock/nls_initcap
2024-11-13 07:11:11 +00:00
75769abe24 !6656 修复new_time升级后元数据不一致
Merge pull request !6656 from Jenny/fix_new_time_func
2024-11-13 07:10:08 +00:00
cfb0b46f35 修复new_time升级后元数据不一致 2024-11-13 14:22:23 +08:00
08280ec0a5 !6429 【A兼容性】TO_CHAR函数支持时间类型、时间间隔类型的NLS_PARAM参数,支持BLOB入参
Merge pull request !6429 from Wang Xinyu 7/to_char
2024-11-13 01:51:22 +00:00
d02c9ed15c fix nls_initcap function install and upgrade different 2024-11-13 09:48:11 +08:00
14b94031c8 !6653 增加dsstbox到 opengauss包中
Merge pull request !6653 from Carl/master
2024-11-13 01:10:30 +00:00
f03109c2c4 !6637 解决资源池化failover重启的问题
Merge pull request !6637 from 钟承志/master
2024-11-12 14:12:02 +00:00
ea98eb0cf5 !6652 CBB推点
Merge pull request !6652 from 汪顺/tuidian
2024-11-12 14:09:35 +00:00
a4e9606a76 modified: gausskernel/ddes/adapter/ss_dms_callback.cpp
modified:   gausskernel/process/postmaster/postmaster.cpp
	modified:   gausskernel/storage/access/heap/heapam.cpp
	modified:   gausskernel/storage/access/transam/xlogutils.cpp
	modified:   include/ddes/dms/ss_dms_recovery.h
	modified:   include/storage/smgr/smgr.h

	modified:   ss_dms_callback.cpp
	modified:   ../../storage/buffer/bufmgr.cpp

	modified:   ss_dms_callback.cpp
	modified:   ../../storage/buffer/bufmgr.cpp
	modified:   ../../../include/ddes/dms/ss_dms_recovery.h

	modified:   src/gausskernel/process/postmaster/postmaster.cpp
	modified:   src/gausskernel/storage/access/heap/heapam.cpp
	modified:   src/include/ddes/dms/ss_common_attr.h

	modified:   src/gausskernel/process/postmaster/postmaster.cpp

	modified:   storage/buffer/bufmgr.cpp

	modified:   gausskernel/storage/buffer/bufmgr.cpp

	modified:   ddes/adapter/ss_dms_callback.cpp
	modified:   process/postmaster/postmaster.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   include/ddes/dms/ss_common_attr.h
	modified:   include/ddes/dms/ss_dms_callback.h
	modified:   include/storage/smgr/smgr.h

	modified:   gausskernel/storage/access/transam/xlogutils.cpp

	modified:   access/transam/xlogutils.cpp

	modified:   xlogutils.cpp

	modified:   include/storage/smgr/smgr.h

	modified:   gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   include/ddes/dms/ss_dms_callback.h

	modified:   bufmgr.cpp

	modified:   gausskernel/storage/access/heap/heapam.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp

	modified:   heapam.cpp

	modified:   src/gausskernel/storage/access/heap/heapam.cpp
	modified:   src/gausskernel/storage/buffer/bufmgr.cpp

	modified:   gausskernel/storage/access/heap/heapam.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp

	modified:   bufmgr.cpp

	modified:   segbuffer.cpp

	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   include/ddes/dms/ss_common_attr.h
	modified:   include/ddes/dms/ss_dms_recovery.h

	modified:   ss_common_attr.h

	modified:   src/gausskernel/ddes/adapter/ss_transaction.cpp
	modified:   src/include/ddes/dms/ss_common_attr.h

	modified:   include/ddes/dms/ss_dms_recovery.h

	modified:   gausskernel/ddes/adapter/ss_transaction.cpp
	modified:   include/ddes/dms/ss_common_attr.h

	modified:   segbuffer.cpp

	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp
	modified:   include/ddes/dms/ss_dms_recovery.h

	modified:   gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp
	modified:   gausskernel/storage/smgr/segment/segbuffer.cpp

	modified:   gausskernel/ddes/adapter/ss_dms_callback.cpp
	modified:   gausskernel/storage/buffer/bufmgr.cpp

	modified:   storage/buffer/bufmgr.cpp

	modified:   bufmgr.cpp
2024-11-12 21:13:56 +08:00
53e4b90900 CBB推点 2024-11-12 21:03:42 +08:00
969b9c965c !6489 DSS推点
Merge pull request !6489 from 徐鑫鑫/xxx
2024-11-12 12:23:58 +00:00
edbbf52704 增加dsstbox到 opengauss包中 2024-11-12 20:16:53 +08:00
3a13704fb4 !6575 gms_utility高级包功能实现(PART)
Merge pull request !6575 from zhubin79/gms-utility
2024-11-12 11:51:38 +00:00
4902b642e4 !6640 修复jdbc无法识别浮点数特殊值
Merge pull request !6640 from 王平云/fix1
2024-11-12 11:31:04 +00:00
3bc7ce2b85 DSS推点 2024-11-12 19:27:42 +08:00
7b66f586e6 !6651 更新 DSS 推点
Merge pull request !6651 from Xilai/update_dss
2024-11-12 11:06:01 +00:00
20e168dcc6 !6643 支持openEuler24.03LTS编译、运行
Merge pull request !6643 from zzh/fix_1
2024-11-12 09:30:38 +00:00
9cf10369bc update dss 2024-11-12 17:07:56 +08:00
26dee19bb0 !6650 【中移信息】解决打开smp后卡死问题
Merge pull request !6650 from Rock/master
2024-11-12 08:29:54 +00:00
ddeeea67f3 修复jdbc不识别浮点数特殊值 2024-11-12 14:09:40 +08:00
dfb8d5a335 !6625 行列融合bugfix
Merge pull request !6625 from Eureka/htap_bugfix
2024-11-12 06:08:47 +00:00
fb73ff6f0e fix smp hang 2024-11-12 13:58:32 +08:00
1b9b95ea3c !6620 解决pg_buffercache插件编译、安装问题
Merge pull request !6620 from jeremytim/master
2024-11-12 03:29:27 +00:00
d9ee74a218 !6646 更新 DSS 推点
Merge pull request !6646 from Xilai/dss_sync
2024-11-11 11:50:11 +00:00
0d6d745ce4 !6645 修复enable_seqscan=off时列缓存cost计算差异
Merge pull request !6645 from jemappellehc/imcs_bugfix
2024-11-11 11:19:06 +00:00
fa4fb80d71 !6633 修复数据库2.0.1升级到7.0.0RC1失败问题
Merge pull request !6633 from zzh/fix_2
2024-11-11 11:03:34 +00:00
1e06f2971e !6639 libpq写入避免大型拷贝
Merge pull request !6639 from 王平云/master
2024-11-11 08:46:04 +00:00
529d25b1aa sync dss:dsstbox ssrepair 2024-11-11 16:38:03 +08:00
7056d6c975 行列融合bugfix 2024-11-11 16:17:15 +08:00
7f7d92b94b fix imcstore scan cost evaluation 2024-11-11 16:07:39 +08:00
58cada5b81 libpq写入避免大型拷贝 2024-11-11 15:23:39 +08:00
555b054ac9 !6641 修复双集群build
Merge pull request !6641 from Carl/master
2024-11-11 06:51:47 +00:00
59a8cda049 gms_utility高级包实现(PART1) 2024-11-11 14:48:03 +08:00
1fd50d100f !6623 解决A模式下使用union all创建视图 varchar类型字段在视图中未显示字符串长度的问题
Merge pull request !6623 from yanguotao/view_a_compatibility
2024-11-11 06:19:17 +00:00
c5ebc9da42 fix pg_buffercache install error 2024-11-11 11:20:55 +08:00
16cd0fe0d5 修复双集群build 2024-11-11 09:27:35 +08:00
cc1b1b632c !6642 新增hnsw & ivfflat reloptions
Merge pull request !6642 from 吉文克/datavec_new_init
2024-11-09 09:45:44 +00:00
a65bf9ca0a !6627 低并发算子SMP增强
Merge pull request !6627 from 袁楚翔/test_iud
2024-11-09 07:23:53 +00:00
a68906a2b3 smp增强 2024-11-09 14:27:50 +08:00
fb1a44e009 解决A模式下使用union all创建视图 varchar类型字段在视图中未显示字符串长度的问题 2024-11-09 14:13:50 +08:00
641b7fa69e 新增hnsw & ivfflat reloptions 2024-11-09 14:02:30 +08:00
1d11815629 !6635 修复行列融合特性TPCC过程中ctrl-c和rollback导致的错误
Merge pull request !6635 from SetnameWang/master
2024-11-09 03:38:35 +00:00
8c59f2d59d !6583 gms_inaddr extension
Merge pull request !6583 from xu cheng/master
2024-11-09 01:29:41 +00:00
12c4dd23c9 !6622 fixbug: 修复 drop synonym 指定 schema 报错 & fetch 视图与测试预期不一致的问题
Merge pull request !6622 from ZimingZhang/fix-synonym
2024-11-09 01:20:42 +00:00
59bb81f169 add gms_inaddr package 2024-11-08 16:27:50 +00:00
8e72f73e99 !6600 B模式兼容sql_mode为NO_AUTO_VALUE_ON_ZERO,以实现往自增字段中写入0值
Merge pull request !6600 from JulianZhang/sql_mode
2024-11-08 09:48:50 +00:00
9cd276646b !6602 优化alter index invisible部分代码,并补充一些测试
Merge pull request !6602 from levy5307/zlw/alter-index-invisible
2024-11-08 09:41:07 +00:00
b9748c790f fix synonym & fetch 2024-11-08 17:05:07 +08:00
b649bc8191 bugfix: fix rowgroup not unlocked after ctrl-c command bugfix: fix scan error while some tpcc query rollbacked but not sync to delta 2024-11-08 14:56:45 +08:00
2d130223a5 !6634 修正sonic hash agg中count函数的判断方式
Merge pull request !6634 from 许树堃/xsk-sonic-hashagg
2024-11-08 06:33:02 +00:00
ba78f51835 !6596 修复B模式下空表create snapshot报错的问题
Merge pull request !6596 from 许树堃/xsk-create-snapshot
2024-11-08 06:30:45 +00:00
cf24682a67 [CMIT] 修复sonic hash agg对于count(*)的隐患 2024-11-08 05:34:40 +00:00
c5d7431fdf 【CMT】修改B模式下snapshot问题 2024-11-08 02:32:43 +00:00
4242097cc1 !6569 GMS_COMPRESS高级包特性兼容
Merge pull request !6569 from 王平云/master
2024-11-08 01:59:48 +00:00
zzh
a12d72d01c 解决amdelete为null升级失败问题 2024-11-08 09:28:45 +08:00
f352e1861d 【A兼容性】TO_CHAR函数支持时间类型、时间间隔类型的NLS_PARAM参数,支持BLOB入参 2024-11-07 22:13:31 +08:00
fede624348 !6449 增加聚集函数CUME_DISTRANK,PERCENT_RANK,DENSE_RANK多参数多类型的特性
Merge pull request !6449 from Long/aggregate
2024-11-07 13:16:28 +00:00
689c29b0ac !6517 【A兼容性】 gms_i18n高级包特性
Merge pull request !6517 from yanguotao/gms_i18n
2024-11-07 12:56:58 +00:00
1e793fcae3 !6628 增加全密态场景下的部分异常时的打印信息
Merge pull request !6628 from wangfeihuo/master
2024-11-07 12:46:33 +00:00
a89f9f2211 !6629 bugfix: 修复IMCStore查询过程中对deltaScan置位不正确的bug
Merge pull request !6629 from SetnameWang/master
2024-11-07 12:42:55 +00:00
b2b4232297 增加聚集函数CUME_DISTRANK,PERCENT_RANK,DENSE_RANK多参数多类型的特性 2024-11-07 19:42:05 +08:00
72eedf2c4b gms_i18n高级包功能 2024-11-07 19:18:01 +08:00
4be8953465 !6630 bugfix: 修复HTAP空表转换后插入数据core问题
Merge pull request !6630 from sovyyvos/master
2024-11-07 08:58:09 +00:00
ac7f96a9fa !6566 GMS_XMLGEN高级包兼容
Merge pull request !6566 from 梅程/GMS_XMLGEN
2024-11-07 08:48:21 +00:00
4f512d83bb 增加全密态时的部分异常打印信息 2024-11-07 16:32:05 +08:00
a364deb3f0 UTL_COMPRESS高级包特性兼容 2024-11-07 16:27:17 +08:00
62ce457088 bugfix: rowgroup init 2024-11-07 15:55:04 +08:00
db08a2850f bugfix: fix imcstore scan delta scan error. 2024-11-07 15:21:42 +08:00
e3f4fcd52b B compatibility support sql_mode NO_AUTO_VALUE_ON_ZERO 2024-11-07 14:43:49 +08:00
058fa062e7 !6612 高级包gms_output、gms_profiler、gms_stats、gms_lob、gms_sql支持lite版本
Merge pull request !6612 from yanguotao/lite_ext
2024-11-07 06:27:23 +00:00
12be4f3c81 GMS_XMLGEN高级包兼容 2024-11-06 20:40:07 +08:00
2d4106186f !6619 修复池化下备机写转发在备机自己内部报错后无法转ROLLBACK给主机的问题
Merge pull request !6619 from cchen676/240710master
2024-11-06 08:54:12 +00:00
8beb6283ee !6099 新增nls_initcap函数
Merge pull request !6099 from Rock/nls_initcap
2024-11-06 08:42:41 +00:00
b7a74abb08 add nls_initcap 2024-11-06 16:04:39 +08:00
9718a4da97 !6500 【A兼容性】支持CORR_S/CORR_K函数
Merge pull request !6500 from yigecheng/corr_sk
2024-11-06 07:54:31 +00:00
zzh
ad58e98678 适配openEuler24.03系统 2024-11-06 14:41:00 +08:00
d461f0cf40 pg_buffercache插件编译适配 2024-11-06 10:34:03 +08:00
4814e0a03c Add support for corr_s/corr_k 2024-11-06 10:16:23 +08:00
f59ce09eba !6616 【Feature】DataVec向量数据库
Merge pull request !6616 from 吉文克/core
2024-11-05 16:18:39 +00:00
68c57d774d 支持DataVec向量数据库 2024-11-05 23:03:13 +08:00
5230061e2e 修复备机写转发在备机自己报错后无法转ROLLBACK给主机的问题 2024-11-05 20:02:14 +08:00
6e5cf114d8 !6618 CBB推点
Merge pull request !6618 from 汪顺/tuidian
2024-11-05 11:34:07 +00:00
7d734e2b69 cbb推点 2024-11-05 18:37:10 +08:00
f2779929ee !6490 gms_tcp高级包
Merge pull request !6490 from 张世乐/utl_tcp_dev
2024-11-05 09:52:55 +00:00
8223912bf5 !6534 【A兼容性】支持JSON_EXISTS表达式、支持JSON_TEXTCONTAINS表达式
Merge pull request !6534 from yelingzhi/req_IAVDNY_json
2024-11-05 08:02:20 +00:00
c9ad1e5e6e !6610 调整dss_contrl脚本,避免杀掉cm_server启动的perctrl
Merge pull request !6610 from Carl/rto
2024-11-05 02:21:25 +00:00
bcb7d62ff8 !6613 修复门禁sw_prior用例不稳定问题
Merge pull request !6613 from lukeman/master
2024-11-05 01:08:38 +00:00
43c8d77167 修复门禁sw_prior用例不稳定问题 2024-11-04 21:17:31 +08:00
af35c8f9db 调整dss_contrl脚本,避免杀掉cm_server启动的perctrl 2024-11-04 15:42:23 +08:00
f1997f94a5 高级包gms_output、gms_profiler、gms_stats、gms_lob、gms_sql支持lite版本 2024-11-04 14:11:16 +08:00
b19c5e344d !6609 修复hash索引部分问题
Merge pull request !6609 from 陈栋/bugfix
2024-11-04 02:54:18 +00:00
64af972345 支持utl_tcp高级包 2024-11-03 18:23:03 -08:00
27589d2f1b 修复hash索引部分问题 2024-11-02 17:30:53 +08:00
7f2c0b0426 !6608 修复resourceowner size判断coredump
Merge pull request !6608 from jemappellehc/resowner_bugfix
2024-11-02 06:19:43 +00:00
1a97f95668 fix resowner size assert error 2024-11-02 12:35:13 +08:00
1416c1c52a 支持json_exists和json_textcontains表达式 2024-11-01 09:27:29 +00:00
25c50cfed1 !6592 解决按需回放部分问题
Merge pull request !6592 from 陈栋/bugfix
2024-11-01 07:45:47 +00:00
8fbbde0da7 !6606 fixbug: FETCH PERCENT语法结果总数舍入问题
Merge pull request !6606 from ZimingZhang/feat-fetch
2024-11-01 03:58:09 +00:00
66203fe37a !6553 资源池化诊断能力增强
Merge pull request !6553 from 胡正超/trackmes
2024-11-01 02:26:12 +00:00
62ba998fcc dms dfx and gs_lwlock_status 2024-11-01 09:31:23 +08:00
0531ade8c5 fix percent rounding behavior 2024-11-01 00:03:24 +08:00
1537dbf0c0 !6603 7.0.0修复【写转发】参数命名单词错误,enable_remote_excute修改为enable_remote_execute
Merge pull request !6603 from zhangyukai/bugfix_paraname
2024-10-31 11:31:39 +00:00
8eb12cd2a7 修改enable_remote_excute参数名称为enable_remote_execute 2024-10-31 17:36:20 +08:00
28ae540d47 refactor alter index invisible 2024-10-31 04:53:17 -04:00
53525aa353 修复按需回放的部分问题:
(1)结束按需回放redo阶段时候,主备消息延迟较大时导致的startup退出较慢问题;
(2)按需回放redo阶段,放开reform过程中mes线程对页面的访问,避免mes线程长时间持有实例锁
2024-10-31 16:20:43 +08:00
bdac066b2e !6502 兼容A模式语法alter index enable/disable
Merge pull request !6502 from levy5307/zlw/alter-index-disable
2024-10-31 02:09:57 +00:00
ed85fbe832 Fix SPI leak. 2024-10-30 22:27:05 +08:00
3caeaa4cf1 Support type cast in partition expr 2024-10-30 09:14:15 -04:00
15b1f8b073 !6589 修复SPQ场景下subplan新增连接类型实现不全的错误
Merge pull request !6589 from SetnameWang/master
2024-10-30 09:14:44 +00:00
68896f7dd3 !6581 修复大数据量下replace分配过多内存的问题
Merge pull request !6581 from chenxiaobin/fixReplace
2024-10-30 08:26:29 +00:00
bb819cb3e8 !6587 修复创建抽象类型不支持逻辑解码导致发布订阅check失败的问题
Merge pull request !6587 from chenxiaobin/fixSubObjectType
2024-10-30 08:09:04 +00:00
9ddbc67e62 bugfix: fix NOT_EXISTS_SUBLINK logic while scan subplan for spq 2024-10-30 15:42:51 +08:00
c3e39b746d !6559 在更新表的复制标识时,数组长度存在问题
Merge pull request !6559 from levy5307/fix-pg-index
2024-10-30 07:39:19 +00:00
e6959cda85 !6590 解决【资源池化】gs_probackup show查看备份状态及内容失败产生coredump的问题
Merge pull request !6590 from 钟承志/master
2024-10-30 07:21:21 +00:00
d2a3098213 !6565 【Feature】HTAP行列融合特性
Merge pull request !6565 from Eureka/reactor_test_bot
2024-10-29 15:23:58 +00:00
9fa0baba83 删除ExecuteSqlQueryForSingleRow函数中多余的ngettext 2024-10-29 22:31:28 +08:00
086e291b39 modified: catalog.cpp
Changes to be committed:
	modified:   catalog.cpp

 Changes to be committed:

	modified:   catalog.cpp
2024-10-29 21:44:26 +08:00
78e748a744 修复大数据量下replace分配过多内存的问题 2024-10-29 20:31:18 +08:00
67e63491ba !6584 dss cbb推点
Merge pull request !6584 from Carl/che
2024-10-29 12:21:59 +00:00
e0b07534c1 dss cbb推点 2024-10-29 19:11:41 +08:00
11d64e1adb 修复创建抽象类型不支持逻辑解码导致发布订阅check失败的问题 2024-10-29 17:56:12 +08:00
4924028cb9 !6562 解决timescaledb插件不支持删除的问题
Merge pull request !6562 from 叶某人/I9VOEN
2024-10-29 07:23:25 +00:00
1761657031 行列转换特性 2024-10-29 15:14:57 +08:00
dc3be873ed !6148 Keep函数特性
Merge pull request !6148 from humengyao/dev_hmy_keep
2024-10-29 06:58:02 +00:00
eda01dc270 支持keep函数 2024-10-28 03:05:35 -07:00
44ca55b5f7 !6539 feat: CREATE/DROP PUBLIC SYNONYM语法支持
Merge pull request !6539 from ZimingZhang/feat-public-synonym
2024-10-28 09:37:04 +00:00
85b5928b87 !6576 修复gms_sql插件不能正常安装问题
Merge pull request !6576 from yanguotao/gms_sql_bugfix
2024-10-28 09:15:54 +00:00
245b23c198 修复gms_sql不能正常安装问题, 增加gms_lob, gms_sql删除命令 2024-10-28 16:31:01 +08:00
f8f30f53d3 !6577 修复gms_output, gms_stats 插件不支持 drop extension命令的问题
Merge pull request !6577 from yanguotao/bugfix_drop_extension
2024-10-28 08:15:59 +00:00
7bf8bca83c 修复gms_output, gms_stats 插件不支持 drop extension命令的问题 2024-10-28 15:28:52 +08:00
8a4b75ff3b !6560 解决timescaledb通过临时结果集未查找到数据
Merge pull request !6560 from 叶某人/IAY4DQ
2024-10-28 06:14:56 +00:00
02765e5694 feat: create/drop public synonym 2024-10-28 11:29:55 +08:00
ff7d85b395 !6484 FETCH语法增强:支持FETCH FIRST xxx PERCENT ROWS / ORDER BY ... FETCH ... WITH TIES
Merge pull request !6484 from ZimingZhang/feat-fetch
2024-10-28 03:06:51 +00:00
3f731b7074 fetch enhance 2024-10-26 17:09:08 +08:00
12455a518f !6574 修复mysql协议下多命令结果错误问题
Merge pull request !6574 from chenxiaobin/fixMultiQuery
2024-10-26 08:43:26 +00:00
3db06fc04f !6573 资源池化适配 standby_statement_history
Merge pull request !6573 from 胡正超/ss-standby-hist
2024-10-26 08:42:17 +00:00
7068366f79 !5861 支持gms_sql高级包
Merge pull request !5861 from humengyao/dev_humy_#gms_sql
2024-10-26 08:42:16 +00:00
bdc8e0e405 !6568 处理issue:”开启M*协议兼容后,使用jdbc连接参数useOldAliasMetadataBehavior=false,查询语句查询结果别名与M*不一致
Merge pull request !6568 from lukeman/master
2024-10-26 08:25:55 +00:00
e6fa13aeb0 修复mysql协议下多命令结果错误问题 2024-10-26 15:02:37 +08:00
2474f78eb6 !6513 support cross apply
Merge pull request !6513 from wangfeihuo/cross_apply
2024-10-26 06:51:07 +00:00
d2e10a6b55 support cross apply 2024-10-26 14:11:42 +08:00
97e5555949 ss standby_statement_history 2024-10-26 10:32:10 +08:00
c2d3d6453e 支持gms_sql高级包 2024-10-25 04:00:51 -07:00
383eac9ac3 !6567 修复gms_lob编译报错问题
Merge pull request !6567 from TinyBag/gmscompile
2024-10-25 08:30:05 +00:00
3be4c3eb9b 支持多表视图更新和删除 2024-10-25 06:13:45 +00:00
26026e958d 处理issue:开启M*协议兼容后,使用jdbc连接参数useOldAliasMetadataBehavior=false,查询语句查询结果别名与M*不一致 2024-10-25 12:00:07 +08:00
2c1c2b9cb2 fix gms_lob Makefile 2024-10-25 11:17:17 +08:00
3587a5ab96 解决timescaledb通过临时结果集未查找到数据 2024-10-24 19:03:07 +08:00
a3eb7bd11c 解决timescaledb插件不支持删除 2024-10-24 16:22:02 +08:00
7e8f72d08c fix bug for pg_index update 2024-10-24 03:32:52 -04:00
0c6d6e2cb8 !6557 【轻量级 PR】:修复make distclean报错问题
Merge pull request !6557 from pengjiong/N/A
2024-10-23 11:11:44 +00:00
ad4751f79f !6216 【A兼容性】extract函数支持TIMEZONE_HOUR/TIMEZONE_MINUTE/TIMEZONE_REGION/TIMEZONE_ABBR格式
Merge pull request !6216 from wangxf/extract_timezone
2024-10-23 09:43:18 +00:00
bc5255c3b9 修复make distclean报错问题
Signed-off-by: pengjiong <totaj@qq.com>
2024-10-23 09:19:41 +00:00
9e7b476cbb Add support for EXTRACT TIMEZONE_XXX 2024-10-23 17:04:20 +08:00
e4152a7ed2 !5763 gms_lob包
Merge pull request !5763 from 暖阳/gms_lob1
2024-10-23 06:32:59 +00:00
64bf9d69bf !6522 A兼容性,添加函数bin_to_num
Merge pull request !6522 from JulianZhang/c_bintonum
2024-10-23 02:46:04 +00:00
873bcc023c !6546 解决 timescaledb时序表查看SQL执行计划数据库挂掉
Merge pull request !6546 from 叶某人/IAWMYE
2024-10-22 13:25:40 +00:00
1a564ff521 !6542 重构小部分gs_ctl部分代码
Merge pull request !6542 from Carl/testctl
2024-10-22 12:23:47 +00:00
fa5a4f3fd4 gms_lob包支持 2024-10-22 18:57:56 +08:00
d5cd7adb9a add proc: bin_to_num 2024-10-22 17:05:40 +08:00
d984912529 alter index disable/enable 2024-10-22 14:35:23 +08:00
909b1d4b53 优化TransactionInProgress效率 2024-10-22 14:21:30 +08:00
a4c143a2e4 !6551 更新readme
Merge pull request !6551 from 李锦波/master
2024-10-22 06:10:36 +00:00
0d8af7bb01 更新readme 2024-10-22 10:29:22 +08:00
a41652d55b !5775 smp支持串行计划
Merge pull request !5775 from Rock/master
2024-10-21 13:14:47 +00:00
233e874fd0 !6505 修复\" 不能被转义成“的问题
Merge pull request !6505 from wangfeihuo/master
2024-10-21 10:05:40 +00:00
8df25dce8e 解决 timescaledb时序表查看SQL执行计划数据库挂掉 2024-10-20 15:56:42 +08:00
18589ec280 重构部分gsctl 2024-10-19 17:11:48 +08:00
9aa8d70de5 !5703 完善PL中的type、record:赋值时检测自定义类型名称是否正确
Merge pull request !5703 from 雷紫薇/req129584_1_nest
2024-10-18 07:39:45 +00:00
7f04b1acdb !6495 新增TO_TIMESTAMP函数对支持子句和 DEFAULT NULL ON CONVERSION ERROR, fmt子句支持。
Merge pull request !6495 from fengyang/feng/addfuncs-to-timestamp-cherry1
2024-10-18 06:23:09 +00:00
ca11870a14 TO_TIMESTAMP 功能实现(除nls模块)和方案评审后的意见修复 2024-10-18 12:43:34 +08:00
9cef41d4e9 !5701 完善PL中的type、recor:包外使用包类型并继承默认值
Merge pull request !5701 from 雷紫薇/req129584_2_const
2024-10-18 03:05:06 +00:00
c36f9e2da8 添加guc参数,打开guc参数时可以检查数组、record类型、外部复合类型,包外使用包中定义的类型时的名称检测 2024-10-18 11:04:05 +08:00
4359e3afda !6015 【A兼容性】支持new_time函数
Merge pull request !6015 from Jenny/for_new_time_func
2024-10-18 01:43:26 +00:00
5339981d53 完成默认值node获取和PLpgSQL_expr进行互相转换的函数 2024-10-17 05:13:24 +00:00
1389181053 [A兼容性]支持new_time函数 2024-10-17 10:05:24 +08:00
8ffda701dc !6211 Assert中判断条件语句修复
Merge pull request !6211 from 王明轩/AssertManage
2024-10-15 08:08:47 +00:00
28f1202335 !6277 新增TO_NUMBER函数对支持子句和 DEFAULT NULL ON CONVERSION ERROR, fmt子句支持。
Merge pull request !6277 from fengyang/merge/addfuncs-to-number-240910
2024-10-15 06:26:42 +00:00
df91f86661 !6527 gs_ctl startwalrcv switch case分支补充break
Merge pull request !6527 from maxiang/yanshihuifang
2024-10-15 02:47:25 +00:00
2551a82b2a 新增TO_NUMBER函数对支持子句和 DEFAULT NULL ON CONVERSION ERROR, fmt子句支持 2024-10-15 00:10:00 +08:00
0e4e48cca9 update src/bin/pg_ctl/pg_ctl.cpp.
case分支补充break

Signed-off-by: maxiang <maxiang9527@126.com>
2024-10-14 12:53:11 +00:00
8d538a2e12 !5080 A兼容性:兼容object type抽象类型
Merge pull request !5080 from kenxx/master_object
2024-10-14 11:24:04 +00:00
6994f166f0 !6519 修复并发重复ss_fi_set_and_init_context的问题
Merge pull request !6519 from 陈超/master
2024-10-14 09:28:12 +00:00
e8eaa85709 !6514 List分区表通过分区键查询,分区键的值超过字段类型长度时,不报错。
Merge pull request !6514 from 许树堃/xsk-partition-prune
2024-10-14 09:06:26 +00:00
5160109b25 修复dms_init时连续创建线程后,两个线程同时ss_fi_set_and_init_context造成的g_instance.shared_fi_ctx两次初始化 2024-10-14 16:41:44 +08:00
aa1ecf5ffa !6512 修复gs_dump 带-c -t时导出导入表后触发器丢失的问题
Merge pull request !6512 from wangfeihuo/gs_dump
2024-10-14 08:23:22 +00:00
1933bfec99 object_type 2024-10-13 22:46:23 -04:00
94a4b0c4ab !6507 【回合】6.0.0 bugfix回合master
Merge pull request !6507 from 周聪/930_bugfix_huihe2
2024-10-14 01:55:27 +00:00
665cb8b104 !6516 修复hacheck 运行inc_build_failover失败
Merge pull request !6516 from 张悦萌/inc_hacheck
2024-10-12 09:23:47 +00:00
9ca30443c3 On branch inc_hacheck
Your branch is up to date with 'origin/inc_hacheck'.
 Changes to be committed:
	modified:   src/bin/pg_rewind/fetch.cpp
	modified:   src/test/ha/ha_schedule_multi_single
2024-10-11 17:14:04 +08:00
2e63fb0c40 support smp with series plan
Conflicts:
	src/test/regress/expected/smp.out
	src/test/regress/sql/smp.sql
2024-10-11 14:28:02 +08:00
850f3e21a2 【CMIT】fix partition table select error 2024-10-11 06:23:42 +00:00
a7c4897295 修复gs_dump带-c -t时触发器丢失的问题 2024-10-11 11:51:03 +08:00
9551d5d6ed !6034 修改事件触发器/h信息
Merge pull request !6034 from kenxx/master_fix_event_trigger
2024-10-11 02:06:12 +00:00
afe5fe75f1 修复"不能被转义的问题 2024-10-10 19:22:17 +08:00
3c9a163fcb !5001 xmltype类型函数
Merge pull request !5001 from 暖阳/merge_xmltype
2024-10-10 10:03:21 +00:00
3bd2db76d5 !6258 opengauss支持chparser插件
Merge pull request !6258 from 胡淳滔/chparser
2024-10-10 07:47:41 +00:00
7ab22b602c 【bugfix】 修复实时构建请求主机做checkpoint时长时间没有完成,导致mes资源被消耗的问题 2024-10-10 14:26:57 +08:00
353e9361a5 【bugfix】实时构建build期间跳过ExtendCSNLOG 2024-10-10 14:26:21 +08:00
9eb63989f1 【bugfix】修复实时构建有概率出现往已经被释放的hash插入redoEntry的问题 2024-10-10 14:25:29 +08:00
4de24ab14d !6499 修复subscription check若干问题
Merge pull request !6499 from chenxiaobin/fixSubscriptionCheck
2024-10-10 02:48:09 +00:00
58794f0435 xmltype functions
宏范围导致轻量版编译失败
2024-10-10 09:50:40 +08:00
3f130017b9 !6501 修复merge into中有full join执行计划报错的问题
Merge pull request !6501 from 许树堃/xsk-merge-join
2024-10-10 01:16:26 +00:00
8e13206395 !6504 支持SUBTYPE--修改globals版本号以支持批量合入
Merge pull request !6504 from accept_all/subtype_version
2024-10-09 11:11:47 +00:00
51d35bf016 openGauss支持chparser插件 2024-10-09 18:21:30 +08:00
62071b16d2 修改版本号 2024-10-09 17:58:19 +08:00
7b10495cc0 !5804 支持SUBTYPE
Merge pull request !5804 from accept_all/new_sub
2024-10-09 09:24:18 +00:00
ceea320bbd !5828 物化视图功能增强,补齐功能,包括支持删除操作
Merge pull request !5828 from TinyBag/matview
2024-10-09 08:58:23 +00:00
d2060a7318 修复subscription check若干问题 2024-10-09 12:00:58 +08:00
223dc6cc7d 【CMIT】FIX merge into with full join subquery 2024-10-09 03:35:35 +00:00
4c6a0a627a !6393 优化部分资源池化问题
Merge pull request !6393 from Carl/master
2024-10-09 01:27:19 +00:00
c06b59dd20 !6436 probackup相关部分memcheck问题修复
Merge pull request !6436 from 胡正超/memcheck
2024-10-08 07:56:41 +00:00
78d0c18edc 优化部分资源池化问题 2024-10-08 15:20:21 +08:00
9fecb90e34 !6483 添加选项:发布订阅主备切换时是否同步连接信息
Merge pull request !6483 from zhubin79/sub-syncconn
2024-09-27 09:56:24 +00:00
a2a515e5b5 添加选项发布订阅主备切换时是否同步连接信息 2024-09-27 16:06:01 +08:00
f83e0afd5a !6342 增加stop完成判断
Merge pull request !6342 from 刘展峰/do_stop
2024-09-27 06:56:21 +00:00
c18f9cdf82 !6482 回合6479
Merge pull request !6482 from 陈栋/cherry-pick-1727404959
2024-09-27 03:10:52 +00:00
4cfcf03287 修复未在按需回放下查询get_ondemand_recovery_status视图导致的core问题
(cherry picked commit from <gitee.com//opengauss/openGauss-server/commit/667bd6e18a1e23a1ad0fb57f3978ec4977c2ed83>
2024-09-27 02:42:40 +00:00
3c83075609 !6476 修复pullup导致的core问题
Merge pull request !6476 from wangfeihuo/pullup
2024-09-27 01:33:31 +00:00
36eea5cb96 !6472 6.0.0 6263代码回合至master
Merge pull request !6472 from hejiahuan11/master
2024-09-26 11:20:00 +00:00
dfb53df307 修复pullup导致的core问题 2024-09-26 19:13:24 +08:00
9b37150de8 !6465 修复指定非法locale的内存泄漏问题
Merge pull request !6465 from chenxiaobin/fixLocale
2024-09-26 09:23:42 +00:00
a28ed76fa9 !6467 [6.0.0回合master]disable_conn函数不再主动去启动walrecv
Merge pull request !6467 from 姜岩/master
2024-09-26 08:15:33 +00:00
cab16078f7 !6470 【bugfix】6.0.0部分bugfix回合master
Merge pull request !6470 from 周聪/930_bugfix_huihe
2024-09-26 07:57:58 +00:00
935c48daa0 修复极致RTO备机读报错问题 2024-09-26 15:51:33 +08:00
388887a352 !5835 修复慢SQL信息收集不全的缺陷
Merge pull request !5835 from TinyBag/statement
2024-09-26 07:40:41 +00:00
adbadf33f5 !6468 回合6.0.0部分PR
Merge pull request !6468 from songlinxuan/master
2024-09-26 07:28:15 +00:00
efbdad1dee !6142 [6.0回合master] 6.0 MR回合master
Merge pull request !6142 from cchen676/240722master_up
2024-09-26 06:54:58 +00:00
495d804420 !6441 解决timescaledb插件用户权限问题
Merge pull request !6441 from 叶某人/IAQ26B
2024-09-26 06:23:04 +00:00
88a82a8d4c 【bugfix】 修改逻辑,避免reboot无法控制进程退出顺序所导致意外core掉 2024-09-26 14:14:09 +08:00
5dbaf33cbd [bugFix]修改fd = 0的dss异常场景情况 2024-09-26 14:13:19 +08:00
768d0c4f44 !6464 【6.0.0分支问题单回合】行存压缩表,备份恢复后,重建集群备机失败
Merge pull request !6464 from 钟承志/master
2024-09-26 06:09:56 +00:00
05e60d18f4 [master回合6.0.0]disable_conn函数不再主动去启动walrecv 2024-09-26 11:20:15 +08:00
756ad91368 !6466 6.0.0代码回合
Merge pull request !6466 from 张悦萌/code-master
2024-09-26 03:03:17 +00:00
0b3c596e1e 【bugfix】修复按需回放build阶段有概率卡在StartupSendMarkToBatchRedo的问题 2024-09-26 10:42:09 +08:00
c36364b1ba 【bugfix】修复按需回放redo阶段备机读业务同时触发reform,导主节点死锁,最后报错退出的问题 2024-09-26 10:41:26 +08:00
92970291a6 【bugfix】修复极致RTO场景有概率遇到空指针的问题 2024-09-26 10:40:42 +08:00
cbbf708358 【bugfix】修复在回放正常结束时,收到shutdownrequst,导致报错StopRecoveryWorkers wait too long!!! 2024-09-26 10:39:42 +08:00
581a095d50 修复password_min_length设置为999失败 2024-09-26 09:57:09 +08:00
ade2570c4e 修复指定非法locale的内存泄漏问题 2024-09-26 09:56:48 +08:00
5a8afb13ca 修正run_ha_single.sh
On branch hacheck_single_double
 Your branch is ahead of 'origin/hacheck_single_double' by 1 commit.
 Changes to be committed:
	modified:   src/test/ha/ha_schedule_single
2024-09-26 09:56:35 +08:00
46a761a40c On branch pass_min_max
Your branch is up to date with 'origin/pass_min_max'.
 Changes to be committed:
	modified:   src/bin/gs_guc/cluster_guc.conf
	modified:   src/common/backend/utils/misc/guc/guc_security.cpp
2024-09-26 09:56:11 +08:00
85a22b451c On branch io_limits
Your branch is up to date with 'origin/io_limits'.
 Changes to be committed:
	modified:   src/bin/gs_guc/cluster_guc.conf
2024-09-26 09:55:40 +08:00
e3f8139c18 Changes to be committed:
modified:   PageCompression.cpp
2024-09-26 09:46:27 +08:00
57510d8dd3 1.修复段页式的fsm页面不回放导致故障恢复后fsm中的页面号可能大于实际的物理页面号的问题
2.修复传统集群的慢sql查询查出来dms等待事件的问题
3.修复按需回放redo阶段可能发生的bufdesc的段页式位置未赋值的问题
4.修复开启备机写转发,单条sql场景下insert into分区表在主机侧等锁超时的问题
5.拦截按需回放redo阶段可能出现的lsn校验失败
6.优化合并池化下dss_post_aio_write请求
2024-09-26 09:24:01 +08:00
a7b4c50703 !6461 【Pick】回合6.0.0 PR 6425 到master
Merge pull request !6461 from laishenghao/cherry-pick-1727256242
2024-09-25 13:07:17 +00:00
108be5670c !6458 修复一个内存泄漏问题
Merge pull request !6458 from wangfeihuo/memfree
2024-09-25 12:03:20 +00:00
c437e73442 !6430 修复memcheck内存泄漏问题
Merge pull request !6430 from lukeman/master
2024-09-25 09:54:00 +00:00
d97d0b1a5d 解决初始化阶段分配内存失败导致空指针core的问题
(cherry picked commit from <gitee.com//opengauss/openGauss-server/commit/ad090a92ad9abe3fd50dbd05633ed0a8c60b6d54>
2024-09-25 09:24:03 +00:00
caefe8e180 修复一个内存泄漏问题 2024-09-25 16:11:39 +08:00
b78d3cea15 !6453 解决sql执行异常场景下og_record_time.cpp内存泄漏的问题
Merge pull request !6453 from 蒋宏博/master
2024-09-25 08:09:53 +00:00
781853fd3e !6451 回合6.0.0实时构建bugfix
Merge pull request !6451 from 陈栋/bugfix
2024-09-25 06:49:25 +00:00
c949931238 解决sql执行异常场景下og_record_time.cpp内存泄漏的问题 2024-09-25 14:19:57 +08:00
dad382dc0e 修复memcheck内存泄漏问题 2024-09-25 12:18:19 +08:00
4e9893f926 解决实时构建长稳下的内存泄漏问题;增加实时构建占用的xlog-record内存统计 2024-09-25 11:10:36 +08:00
edd95fc5bd 解决事务日志队列满导致实时构建卡住的问题;调整实时构建下xlog-record内存申请步长 2024-09-25 10:57:17 +08:00
184c1cb677 修复hashmap不足情况下,实时构建可能卡住的问题 2024-09-25 10:57:04 +08:00
f62961f260 解决实时构建处理ddl日志时,发生failover卡住的问题;解决实时构建暂停场景下,如果发生failover,出现的日志漏回放问题 2024-09-25 10:56:53 +08:00
6d30346834 解决按需回放实时构建内存不足时,failover阶段卡住的问题 2024-09-25 10:56:40 +08:00
47dcde3ed7 解决按需回放实时构建下,主机redo点位发送错误的问题 2024-09-25 10:56:28 +08:00
0395785831 1、资源池化下关闭双写功能;2、调整一些按需回放下的日志打印 2024-09-25 10:56:14 +08:00
791c6c87df !6447 修复升级interval函数元数据不一致
Merge pull request !6447 from 梅程/cherry-pick-1727185450
2024-09-25 02:21:56 +00:00
ffcca0df78 !6445 修复master升级失败问题
Merge pull request !6445 from chenxiaobin/fixUpgrade7.0.0
2024-09-25 02:01:07 +00:00
2009605d69 !6434 修复发布订阅发送发布端主备信息的逻辑bug
Merge pull request !6434 from pengjiong/fix_col
2024-09-25 01:32:55 +00:00
de3d0a178a 修复升级interval函数元数据不一致
(cherry picked commit from <gitee.com//opengauss/openGauss-server/commit/99f5fbe830ad42cefbf55b13b597b4101b9c5c76>
2024-09-24 13:44:10 +00:00
a43e48068c !6426 修复若干内存泄漏问题
Merge pull request !6426 from chenxiaobin/fixMemchk
2024-09-24 13:38:06 +00:00
2cbf83a625 修复master升级失败问题 2024-09-24 20:42:42 +08:00
80e55f614a !6439 回合pg_dump/pg_restore备份恢复加解密支持指定带hmac算法类型
Merge pull request !6439 from lyoursly/master_dump_support_hmac_algo_new
2024-09-24 12:10:07 +00:00
7a61ee5d4b !6229 [资源池化][同步CBB][同步DMS/DSS] 因为CBB message pool改造推点
Merge pull request !6229 from 董宁/msg_pool
2024-09-24 12:01:57 +00:00
e2462cdafd 修改timescaledb插件用户权限问题 2024-09-24 19:27:45 +08:00
c2b426f713 !6415 【bugfix】修复gs_increment_build部分内存泄漏点
Merge pull request !6415 from 周聪/bugfix_memecheck_gs_increment_build
2024-09-24 11:17:39 +00:00
66ed8686c7 不允许生成密钥明文 2024-09-24 17:48:50 +08:00
bdc0aabbbd 修改两处未释放内存 2024-09-24 17:48:40 +08:00
d2e7b93be8 1.修改两个文件格式;
2.修改部分拼写错误;
3.修改一个pg_dump/pg_restore d格式加解密读写bug;
4.增加带hmac算法。
2024-09-24 17:48:30 +08:00
78220a62b0 !6408 gs_probackup备份恢复支持指定带hmac算法类型,以及部分代码优化
Merge pull request !6408 from 耶梦加得/probackup_hmac_param
2024-09-24 09:37:10 +00:00
ea57e4bf50 !6423 修复gs_basebackup相关的memcheck
Merge pull request !6423 from cchen676/240710master
2024-09-24 09:24:36 +00:00
b0818689e6 !6438 gs_probackup help提示重复
Merge pull request !6438 from 姜岩/master
2024-09-24 08:22:36 +00:00
7765382bd9 Fix subscription bug. 2024-09-24 15:45:49 +08:00
40bad1f583 gs_probackup help提示重复 2024-09-24 14:58:46 +08:00
6c496178a6 [资源池化][同步CBB][同步DMS/DSS] 因为CBB message pool改造推点 2024-09-24 14:42:25 +08:00
db2a08770b probackup memcheck 2024-09-24 14:41:31 +08:00
4d206b3ecd !6397 解决timescaledb插件,时序表查看指定的SQL执行计划不准确
Merge pull request !6397 from 叶某人/IA5DSZ
2024-09-24 06:39:11 +00:00
9db841db7c !6427 修复6.0.0版本直装和升级至6.0.0版本后get_global_full_sql_by_timestamp元数据不一致的问题
Merge pull request !6427 from 蒋宏博/master
2024-09-24 03:32:32 +00:00
4b3f8015ed 修复6.0.0版本直装和升级至6.0.0版本后get_global_full_sql_by_timestamp,get_global_slow_sql_by_timestamp元数据不一致的问题 2024-09-24 10:26:55 +08:00
bb25941e51 !6431 【内核】废弃tts_tupslotTableAm参数,更新为tts_tam_ops
Merge pull request !6431 from 孙德超/master923
2024-09-24 01:11:15 +00:00
818b389260 修复memcheck 2024-09-24 08:42:37 +08:00
b6dce50e00 废弃tts_tupslotTableAm参数,更新为tts_tam_ops 2024-09-23 21:51:12 +08:00
82d8bd50b0 修复libpqwalreceiver若干内存泄漏问题 2024-09-23 20:34:45 +08:00
c2c0275abe !6405 修复单机容器pg_hba.conf配置问题
Merge pull request !6405 from zzh/cherry-pick-1727059487
2024-09-23 12:08:55 +00:00
58fe50409d !6416 reinforce checkneedswitch
Merge pull request !6416 from lyannaa/checkundozone
2024-09-23 11:29:15 +00:00
536093c2cf gs_probackup备份恢复支持指定带hmac算法类型,以及部分代码优化 2024-09-23 18:56:27 +08:00
9c2ebd0872 !6402 gs_guc reload前判断gaussdb.state状态是否正常
Merge pull request !6402 from 申正/reslove_guc_reload
2024-09-23 09:14:19 +00:00
be6b46310e !6414 【回合 6.0.0->master】 压缩表使用support_extended_feature控制
Merge pull request !6414 from 胡正超/master
2024-09-23 08:52:45 +00:00
f8b036a2b0 !5694 fix libpgtypes打包版本问题
Merge pull request !5694 from liuheng/fix1
2024-09-23 08:33:12 +00:00
87d77fb85f !6364 修复gs_dump使用sql通过视图和外表越权执行问题
Merge pull request !6364 from 王平云/master
2024-09-23 08:24:00 +00:00
eb38f83807 reinforce checkneedswitch 2024-09-23 16:20:35 +08:00
f1ceac6ee7 修复访问已被release buffer问题 2024-09-23 16:16:57 +08:00
532e2aa218 【bugfix】修复gs_increment_build部分内存泄漏点 2024-09-23 16:10:39 +08:00
ab778fc810 disable compress table with guc support_extended_features 2024-09-23 15:48:54 +08:00
f41d36a839 !6385 修复gs_get_recv_locations()查询replay_lsn与其余三个不一致
Merge pull request !6385 from james/lsn666
2024-09-23 07:37:00 +00:00
aa5715b8e2 !6406 fix undorecycle core
Merge pull request !6406 from lyannaa/master932
2024-09-23 06:06:41 +00:00
b84cc027a0 fix undorecycle core 2024-09-23 11:47:46 +08:00
9f5cbeab4a gs_guc reload before read gaussdb.state 2024-09-23 11:11:23 +08:00
6a2d201af7 add fix 2024-09-23 10:55:40 +08:00
zzh
5f7e94c347 单机容器pg_hba.conf配置问题
(cherry picked commit from <gitee.com//opengauss/openGauss-server/commit/a0b11e859876f5732352cc1423e2a22536a2fbca>
2024-09-23 02:44:48 +00:00
a7b6f5cad7 解决timescaledb插件,时序表查看指定的SQL执行计划不准确 2024-09-22 20:13:32 +08:00
92a5ac8935 !6388 修复聚合嵌套时的core问题
Merge pull request !6388 from wangfeihuo/agg
2024-09-21 09:37:05 +00:00
0a98949741 !6390 修复回放日志打印加固的告警问题
Merge pull request !6390 from wofanzheng/master
2024-09-21 09:17:33 +00:00
141071fc82 !6375 【5.0.0回合master】字符集增加pg_description
Merge pull request !6375 from 梅程/suncan_master
2024-09-21 08:56:01 +00:00
1d1d11fd32 !6329 修复gs_dump 导出普通用户触发器的owner被改变了的问题
Merge pull request !6329 from yuchao/master
2024-09-21 08:46:14 +00:00
cc278fc708 !6365 备机全量build阶段添加对undometa的校验
Merge pull request !6365 from liuchangfeng/master
2024-09-21 03:51:49 +00:00
7c6c2a1b55 修复聚合嵌套时的core问题 2024-09-21 10:30:20 +08:00
19eb68f08e !6079 更新master分支版本号至7.0.0-RC1
Merge pull request !6079 from 李锦波/master
2024-09-21 01:55:10 +00:00
f390570e38 !6197 6.0版本审计日志支持完整性校验-tpcc性能下降
Merge pull request !6197 from 邮储-王建达/feature_audit_tpcc_6.0
2024-09-20 11:16:03 +00:00
f9c8e4b215 !6372 ecpg、gms_*、pg_archivecleanup添加安全编译选项
Merge pull request !6372 from lukeman/oss
2024-09-20 10:37:07 +00:00
afacd6c03a 修复gs_dump 导出普通用户触发器的owner被改变了的问题 2024-09-20 18:16:59 +08:00
65461e2391 备机全量build对undometa文件做校验 2024-09-20 17:40:00 +08:00
a208e19493 !6355 处理07c99512在release版本下core的问题
Merge pull request !6355 from lukeman/master
2024-09-20 09:34:36 +00:00
c1a75adc70 !6338 pg_query_audit函数参数处理
Merge pull request !6338 from 邮储-王建达/feature_upgrade_audit
2024-09-20 09:03:02 +00:00
c6c3f1d525 字符集增加pg_description 2024-09-20 16:45:20 +08:00
6e834c151a 修复回放日志打印加固的告警问题 2024-09-20 15:15:56 +08:00
ce82ee05fa ecpg、gms_*、pg_archivecleanup添加安全编译选项 2024-09-20 14:45:08 +08:00
b6fd8742c3 !6312 修复表分区删除后,执行查询语句报错partition does not exist的问题
Merge pull request !6312 from yuchao/master
2024-09-20 06:13:04 +00:00
12f4b8ecdd 修复gs_dump使用sql通过视图和外表越权执行问题 2024-09-20 11:47:07 +08:00
69aff08a98 !6360 修复并行查询下ctescan的coredump问题
Merge pull request !6360 from chenxiaobin/fixCteSmp
2024-09-20 01:47:15 +00:00
adcf17d984 6.0版本审计日志tpcc性能下降 2024-09-19 22:07:29 +08:00
bbcb4ff286 修复并行查询下ctescan的coredump问题 2024-09-19 20:22:50 +08:00
f4db8304ec 避免异常情况下,gs_ctl stop等待 2024-09-19 20:08:35 +08:00
f9a3a0afca !6339 复合类型的列名为rownum时,查询报错
Merge pull request !6339 from 雷紫薇/bug#132188
2024-09-19 11:24:53 +00:00
e31125b98e 处理07c99512在release版本下core的问题 2024-09-19 18:06:04 +08:00
0e71d0bbbd !6346 修复yat执行shrink相关语句报错的问题
Merge pull request !6346 from wangfeihuo/shrink
2024-09-19 09:22:04 +00:00
9f3f132608 record查询伪列不能报错 2024-09-19 07:46:57 +00:00
41436335c8 【标题】:修复yat执行shrink相关语句报错的问题.
【实现内容】: 修复yat执行shrink相关语句报错的问题
【根因分析】: copyObject中缺少ShrinkStmt语句的处理
【实现方案】: copyObject中增加ShrinkStmt语句的处理
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IAS3UU
2024-09-19 15:08:06 +08:00
51c38f94f0 support create/drop materialized view log 2024-09-18 16:32:58 +08:00
99672b9f3d !5687 解决timescaledb插件,根据btree索引对时序表进行聚簇排序报错
Merge pull request !5687 from 叶某人/IA8K67
2024-09-18 07:40:07 +00:00
8606c66865 !6230 修复逻辑复制环境,create schema指定属主同步失败
Merge pull request !6230 from wenger/bug_logical_ddl_schema
2024-09-18 07:21:01 +00:00
64f1aebeaa !6221 修复开启ddl逻辑复制后,删除不存在type时报错不友好的问题
Merge pull request !6221 from wenger/bug_logical_ddl_type
2024-09-18 07:18:05 +00:00
164703d2eb pg_query_audit函数 2024-09-18 15:17:45 +08:00
caac56c8b9 !6218 修复物化视图里导致宕机的内存使用问题
Merge pull request !6218 from wenger/bug_logical_ddl_matview
2024-09-18 07:16:59 +00:00
e3e1ec8002 !6268 支持向量数据库ivfflat计算中心点前采样的range scan
Merge pull request !6268 from wangjingyuan8/ivfflat
2024-09-18 03:24:14 +00:00
05cb367f25 !6331 strip useless code
Merge pull request !6331 from lyannaa/master914
2024-09-18 01:06:54 +00:00
492571cd70 !6334 修复传统集群build
Merge pull request !6334 from Carl/heru2
2024-09-15 09:15:06 +00:00
3481bf6327 !6328 解决部分内存问题
Merge pull request !6328 from Carl/heru
2024-09-15 09:14:33 +00:00
c5ed7ae167 修复传统集群build 2024-09-15 14:40:52 +08:00
9c9f9e4459 strip useless code 2024-09-15 11:12:50 +08:00
a7e4500b3e !6313 6.0.0redme优化
Merge pull request !6313 from 李锦波/master
2024-09-14 08:34:45 +00:00
260430f25e 解决部分内存问题 2024-09-14 16:20:46 +08:00
48fbcbbf91 修复逻辑复制环境,create schema指定属主同步失败 2024-09-14 15:54:17 +08:00
d202d1c7f9 !6326 处理issue:gs_probackup delete删除备份报错
Merge pull request !6326 from lukeman/master
2024-09-14 07:17:04 +00:00
1d49b32477 !6322 解决adps线程退出异常问题
Merge pull request !6322 from 吉文克/master
2024-09-14 07:07:26 +00:00
6cc445ef65 !6319 处理issue:select …… connect by子句,出现rownum条件,未正常生效
Merge pull request !6319 from lukeman/oss
2024-09-14 07:06:27 +00:00
35becafe5c 处理issue:gs_probackup delete删除备份报错 2024-09-14 11:44:43 +08:00
bd2527a4bc 修复开启ddl逻辑复制后,删除不存在type时报错不友好的问题 2024-09-14 11:25:16 +08:00
4eac3bfeae !6316 更改容器升级查询实时的实例状态和角色
Merge pull request !6316 from zhangxubo/master
2024-09-14 03:04:24 +00:00
31bc53135b !6324 回合6299至master
Merge pull request !6324 from Carl/heru
2024-09-14 01:44:43 +00:00
07c99512ce 处理issue:select …… connect by子句,出现rownum条件,未正常生效 2024-09-14 09:33:54 +08:00
87d7b2a3a6 修复双集群尝试删除xlogtemp失败问题 2024-09-14 09:18:02 +08:00
37cd700e94 解决adps线程退出异常问题 2024-09-14 09:07:16 +08:00
b75bf53737 !6278 浮点数字面量溢出为0修改
Merge pull request !6278 from zhubin79/float-iteral
2024-09-13 09:59:12 +00:00
6b9ea3a4d3 修复表分区删除后,执行查询语句报错partition does not exist的问题 2024-09-13 16:39:53 +08:00
d2cb79fa15 容器升级临时文件记录状态 2024-09-13 15:21:05 +08:00
8d029d2edf 浮点数字面量溢出为0修改 2024-09-13 14:34:39 +08:00
41a288dfbc !6309 【测试类型:SQL功能】【测试版本:6.0.0】 【支持array嵌套array】嵌套数组赋值时,报错
Merge pull request !6309 from 雷紫薇/bug135096
2024-09-13 03:48:29 +00:00
6a7da81553 !6208 单次执行的event在执行失败后进行删除
Merge pull request !6208 from zhubin79/event-drop
2024-09-13 02:24:26 +00:00
e413cc4706 修复嵌套数组赋值bug 2024-09-13 01:30:02 +00:00
41009db26f 优化readme 2024-09-13 09:25:48 +08:00
eed9047fa3 !6307 DSS推点
Merge pull request !6307 from 徐鑫鑫/xxx
2024-09-13 01:09:39 +00:00
b80975e20d !6285 fix analyze verify error
Merge pull request !6285 from 徐达标/fix_analyze_verify
2024-09-12 12:05:52 +00:00
89b17ce962 !6305 修复在非simpleInstall目录下极简安装,创建demo database报错问题
Merge pull request !6305 from KeKe/master
2024-09-12 09:02:18 +00:00
53f412b291 !6306 更新readme
Merge pull request !6306 from 李锦波/master
2024-09-12 08:52:31 +00:00
66a522b484 DSS推点 2024-09-12 15:47:04 +08:00
301125d31e 更新readme 2024-09-12 15:28:55 +08:00
5676703d92 !5921 资源池化存储复制备集群不需要remove xlogfile
Merge pull request !5921 from Lamaric/og_remove_xlog
2024-09-12 06:19:35 +00:00
1a1b6ebeb0 !5920 修复资源池化集群内switchover卡住的问题
Merge pull request !5920 from Lamaric/og_1044745
2024-09-12 06:19:10 +00:00
6e91985365 !6176 修复在insert操作时执行vacuum full频繁出现死锁,该位置处修复前申请的锁为4号锁,无法阻塞其他会话对于3号锁的申请
Merge pull request !6176 from 赵森/vacuum_full
2024-09-12 06:14:52 +00:00
ec065085ae 修复在非simpleInstall目录下极简安装,创建demo database报错问题 2024-09-12 11:58:28 +08:00
514dee52c8 修复heap_prune_chain()中不匹配的gstrace_entry和gstrace_exit 2024-09-12 11:41:20 +08:00
c6440779ea 实现功能
用例看护

修改用例

用例修改

用例调整

只放到0看护

修改语法

恢复exec_eval_integer为静态函数

修改期望

format change

升级脚本

更名升级脚本

脚本

升级脚本修改

按代码规范修改

根据codecheck修改

修改升级脚本版本号

去掉subtype.cpp中对rangtype的处理
2024-09-12 11:33:09 +08:00
025c70161e !6289 修复decode报错
Merge pull request !6289 from 梅程/decode
2024-09-12 03:16:29 +00:00
51bc7d3ed8 !6173 [bugfix] repair access a table through a synonym when no permissions
Merge pull request !6173 from douxin/bugfix_0831
2024-09-12 02:31:17 +00:00
42befb9f32 修复物化视图里导致宕机的内存使用问题 2024-09-12 10:16:23 +08:00
6a01e81189 !6291 修复部分对象升级回滚后元数据不一致的问题
Merge pull request !6291 from 蒋宏博/master
2024-09-12 01:35:58 +00:00
bdddc6b1ce !6293 双集群跳过部分校验
Merge pull request !6293 from Carl/heru
2024-09-11 13:52:41 +00:00
f23180508e [bugfix] repair access a table through a synonym when no permissions 2024-09-11 21:07:58 +08:00
ad2e1e0167 !6158 修复备份恢复工具审计日志相关issue
Merge pull request !6158 from 邮储-王建达/bugfix_修复备份恢复工具审计日志issue
2024-09-11 12:34:18 +00:00
38a7d855c0 修复decode报错 2024-09-11 19:59:27 +08:00
50e3d6ed3d 修复部分对象升级回滚后元数据不一致的问题 2024-09-11 19:32:26 +08:00
f0bb4cc47e !6284 在gsql中处理header option,保证在\copy from语句并行导入数据在有header时,导入数据正确
Merge pull request !6284 from 许树堃/xsk-copy-parallel
2024-09-11 09:51:11 +00:00
20b47e5b55 !6270 【6.0.0回合master】readfuncs新属性根据是否有值进行反序列化
Merge pull request !6270 from 梅程/master
2024-09-11 09:47:47 +00:00
714cc1679b !6242 alter index实现中,设置visible状态时,replace和nulls数组长度有问题
Merge pull request !6242 from levy5307/fix-index-visible
2024-09-11 08:41:35 +00:00
a1c5cb6f71 修复备份恢复工具审计日志issue 2024-09-11 16:37:09 +08:00
a44193c7a2 !5535 当backup超时时,清除掉残留的tablespace_map文件
Merge pull request !5535 from levy5307/backup-timeout
2024-09-11 08:30:44 +00:00
be9c02cc68 双集群跳过部分校验 2024-09-11 16:09:03 +08:00
9a4f12c8f7 【CMIT】FIX COPY PARALLEL WITH HEADER MISS DATA 2024-09-11 06:56:36 +00:00
4fbe2f73d0 !6282 修复容器部署pg_hba.conf文件缺少白名单问题
Merge pull request !6282 from zzh/bugfix
2024-09-11 02:23:43 +00:00
4c03736881 支持datavec ivfflat计算中心点时SampleRows的range scan 2024-09-11 10:18:44 +08:00
379b2c2dc8 fix analyze verify error 2024-09-11 10:09:22 +08:00
b9ee0789dd !6275 资源池化单集群禁止build
Merge pull request !6275 from Carl/heru
2024-09-11 01:12:14 +00:00
f4cd5a25f8 !6264 修复create_master_slave.sh脚本执行失败问题
Merge pull request !6264 from zzh/master
2024-09-11 00:56:03 +00:00
3eb85366dc !6279 处理issue:gs_probackup恢复对象存储上的备份集时数据备份文件恢复顺序和备份顺序不一致
Merge pull request !6279 from lukeman/master_tmp
2024-09-10 13:53:03 +00:00
zzh
f2e7f7501f pg_hba.conf文件缺少白名单配置 2024-09-10 21:24:10 +08:00
10528c1ba0 处理issue:gs_probackup恢复对象存储上的备份集时数据备份文件恢复顺序和备份顺序不一致 2024-09-10 20:32:35 +08:00
7eb7f8afa7 !6251 兼容mysql支持FOREIGN_KEY_CHECKS参数
Merge pull request !6251 from wangfeihuo/const
2024-09-10 12:11:46 +00:00
d60a528aa7 !6271 【内核】ustore_verify_level & ustore_verify_module参数默认值更改
Merge pull request !6271 from 孙德超/master910
2024-09-10 08:26:33 +00:00
e8ecd924c3 资源池化单集群禁止build 2024-09-10 15:12:13 +08:00
46e200072f 修改ustore_verify_level默认值为fast,ustore_verify_module为upage&ubtree 2024-09-10 15:02:06 +08:00
5226b18821 单次执行的event在执行失败后进行删除 2024-09-10 14:53:42 +08:00
6f4e27c084 !6269 调整资源池化部分校验与初始化逻辑
Merge pull request !6269 from Carl/heru
2024-09-10 06:25:41 +00:00
6f5af1823a readfuncs新属性根据是否有值进行反序列化 2024-09-10 10:18:52 +08:00
7c27b09a7c 支持FOREIGN_KEY_CHECKS参数 2024-09-09 21:39:17 +08:00
817530822b 调整部分校验与初始化逻辑 2024-09-09 21:27:49 +08:00
360596beff !6166 【测试类型:SQL功能】【测试版本:6.0.0】 【支持用ROWTYPE给游标赋值】游标rowtype类型为numeric,赋值时未检查精度
Merge pull request !6166 from 雷紫薇/bug134835
2024-09-09 11:50:34 +00:00
e7a27faad6 修复在insert操作时执行vacuum full频繁出现死锁,该位置处修复前申请的锁为4号锁,无法阻塞其他会话对于3号锁的申请 2024-09-09 19:02:08 +08:00
2827dd2577 !6234 更改容器升级查询实时的实例状态和角色
Merge pull request !6234 from zhangxubo/master
2024-09-09 07:39:32 +00:00
3ef3d1346c !6226 修正gsql执行copy with header时,导致gsql解析sql字符串时,没有处理空指针
Merge pull request !6226 from 许树堃/xsk-copy-gsql
2024-09-09 03:06:08 +00:00
zzh
c29a4088dd 修复create_master_slave.sh脚本执行错误问题 2024-09-09 10:56:59 +08:00
86ed553880 !6256 fix upgrade diff
Merge pull request !6256 from 徐达标/0906
2024-09-08 01:54:11 +00:00
a159ec6dd4 !6240 修复双集群首备读问题
Merge pull request !6240 from Carl/heru
2024-09-07 11:09:22 +00:00
b91f63ea6f fix upgrade diff 2024-09-07 17:25:46 +08:00
18b2cb59d7 !6135 向量数据库支持Xstore存储
Merge pull request !6135 from 吉文克/datavec-0.7.2
2024-09-07 08:37:45 +00:00
5cbd71200d !6247 disable deferrable constraints
Merge pull request !6247 from 徐达标/0906
2024-09-07 06:22:05 +00:00
ab67d5cd1f !6252 修改memset_s函数语法错误CIPHER_LEN
Merge pull request !6252 from zhangtingtingting/7.0.0
2024-09-07 01:49:14 +00:00
caa4b2e025 !6250 修复基础表和toast表的存储引擎不一致比较错误的问题
Merge pull request !6250 from wofanzheng/master_test
2024-09-07 00:59:14 +00:00
effc9c0131 修改memset_s函数语法错误CIPHER_LEN 2024-09-06 17:51:48 +08:00
e5573675da 修复基础表和toast表的存储引擎不一致比较错误的问题 2024-09-06 17:41:34 +08:00
08ac80d043 revert xstore deferrable constraints 2024-09-06 17:13:31 +08:00
4731bcd0b6 !6241 打包添加datavec-1.0
Merge pull request !6241 from 吉文克/version
2024-09-06 08:07:19 +00:00
c880e009bf !6138 修复date类型直接插入与使用TO_DATE函数行为不一致,是否要允许>9999值直接插入的问题
Merge pull request !6138 from yuchao/master
2024-09-06 07:46:24 +00:00
53a818051b !5805 修改gms_stats高级包cha收集一千张表报错bug
Merge pull request !5805 from humengyao/dev_hmy_gms_stats
2024-09-06 07:05:25 +00:00
4ebd232745 fix bug in alter index visible 2024-09-06 14:16:47 +08:00
b1dd52b782 打包添加datavec-1.0 2024-09-06 14:15:59 +08:00
e15b1dd08b 5805 修改gms_stats高级包cha收集一千张表报错bug 2024-09-05 20:48:09 -07:00
f2e9811864 修复双集群首备读问题 2024-09-06 11:42:11 +08:00
547e87e77a !6227 修复toast表索引类型问题
Merge pull request !6227 from lyannaa/master905
2024-09-05 13:42:58 +00:00
f0ee9134ba 更改容器升级查询实时的实例状态和角色 2024-09-05 21:10:11 +08:00
2d5da0dcdf !6224 修改系统对象中substring的用法以适配插件
Merge pull request !6224 from chenxiaobin/fixSubstr
2024-09-05 12:46:12 +00:00
2ca4db82b7 修复date类型直接插入与使用TO_DATE函数行为不一致,是否要允许>9999值直接插入的问题 2024-09-05 17:36:24 +08:00
dc7d66fa04 【CMIT】gsql core when execute copy with header 2024-09-05 08:44:53 +00:00
e337166c56 1、修复toast表存储类型和索引不一致的问题
2、修复基础表和toast表春初类型不一致问题
2024-09-05 14:37:51 +08:00
5dd9a9d75d !5217 修复 reindex table pg_class 与 drop table 死锁问题
Merge pull request !5217 from sungwu/reindx_pg_class_deadlock
2024-09-05 03:57:05 +00:00
8d06c92b46 !6065 修改query_page_distribution_info错误提示信息等级
Merge pull request !6065 from scmysxb/sxb_bug_fix
2024-09-05 03:56:39 +00:00
1a24fb04df 修改系统对象中substring的用法以适配插件 2024-09-04 20:48:52 +08:00
2182c28688 !6214 参考gaussdb,完善out_param_override打开时对call函数的约束的提示打印信息
Merge pull request !6214 from wangfeihuo/override
2024-09-04 09:34:49 +00:00
c8c67bab95 update 2024-09-04 08:16:05 +00:00
b60b8373f5 Merge remote-tracking branch 'origin/master' into backup-timeout 2024-09-04 07:19:31 +00:00
5165750466 完善out_param_func_overload场景下不支持的函数的提示信息 2024-09-04 14:59:25 +08:00
d79aa5c7b5 !6187 双集群build tblspc修复
Merge pull request !6187 from Carl/master
2024-09-04 06:45:46 +00:00
56feeef2b6 参数显示问题修复 2024-09-04 14:17:03 +08:00
b7d4419cf6 !6203 probackup硬件加密添加hmac校验
Merge pull request !6203 from 耶梦加得/probackup_hmac
2024-09-04 06:12:40 +00:00
88f72e7bf5 增加双集群build tblspc 2024-09-04 10:37:39 +08:00
049c5f122c !6115 添加支持主机通过广播形式收集备机的oldestxmin的开关和逻辑
Merge pull request !6115 from cchen676/240710master
2024-09-04 01:40:08 +00:00
731a3fed38 !6184 修复列存表 select (t).* from t;语句类型不识别的错误
Merge pull request !6184 from Eureka/buf_fix_cstore
2024-09-03 11:55:32 +00:00
dd872bb91a !6130 【feature】逻辑备份p和d格式支持硬件加密
Merge pull request !6130 from lyoursly/pg_dump_enc_new
2024-09-03 10:59:16 +00:00
83edb6418e probackup硬件加密添加hmac校验 2024-09-03 18:49:29 +08:00
5d3ceceeaf 修改query_page_distribution_info的错误提示信息等级 2024-09-03 18:21:10 +08:00
0bf4146012 !6147 【feature】pg_probackup适配硬件密码模块
Merge pull request !6147 from 耶梦加得/probackup_enc
2024-09-03 09:26:56 +00:00
e9ca155e21 !6071 【feature】提交硬件密码模块接口封装库
Merge pull request !6071 from lyoursly/common_cipher
2024-09-03 09:26:05 +00:00
91fbe383f7 !6171 DSS推点
Merge pull request !6171 from 徐鑫鑫/xxx
2024-09-03 08:49:51 +00:00
0afbafecbf 支持hmac 2024-09-03 16:41:46 +08:00
78c4d5931c 修复列存表 select (t).* from t;语句类型不识别的错误 2024-09-03 15:47:32 +08:00
13d6c6f90f !6144 修改流水线编译TSDB
Merge pull request !6144 from 叶某人/BUILD
2024-09-03 06:19:08 +00:00
efe7266c06 !6182 麒麟V10 arm执行gs_guc generate报错
Merge pull request !6182 from 杨皓/master
2024-09-03 03:34:33 +00:00
40d4708c38 !6180 修复创建event时初始为disable的问题
Merge pull request !6180 from chenxiaobin/fixEvent
2024-09-03 01:58:24 +00:00
17c4d15eb0 !6190 调整压缩表刷脏逻辑和普通表一致
Merge pull request !6190 from wofanzheng/personal/hanlizhu/writeback
2024-09-03 01:04:56 +00:00
2606ad0a2b !6183 修复create view语句中包含order siblings by时, 出现ERROR: parseNodeString(): badly formatted node string问题
Merge pull request !6183 from shijuzheng1997/master
2024-09-02 14:33:03 +00:00
2c74ebb659 调整压缩表刷脏逻辑和普通表一致 2024-09-02 21:43:18 +08:00
90f402831c 修复parseNodeString() error问题 2024-09-02 21:00:43 +08:00
7d1ed655a5 !6175 修改列为允许NULL值时,添加检测是否为逻辑复制解码列
Merge pull request !6175 from zhubin79/alter-logic
2024-09-02 11:58:06 +00:00
3b198f3ec2 modify the max password length of 'gs_guc encrypt/generate' from 16 to 15 2024-09-02 19:30:50 +08:00
273cb3c3b8 修复创建event时初始为disable的问题 2024-09-02 16:43:40 +08:00
bc46853849 clean code 2024-09-02 16:36:03 +08:00
a2eb78db5c !6096 页面可见性与vacuum优化
Merge pull request !6096 from laishenghao/visible-opt-serial
2024-09-02 06:33:03 +00:00
5763d342eb !6030 修复gs_dump导出哈希二级分区失败的问题
Merge pull request !6030 from 景涛/rto_issue
2024-09-02 02:30:43 +00:00
998d307d4d !6170 修复主机重启后延迟备建连慢的问题
Merge pull request !6170 from 胡正超/startwalrecv
2024-09-02 02:16:14 +00:00
81a43f6436 修改列为允许NULL值时,添加检测是否为逻辑复制解码列的功能 2024-09-02 10:12:17 +08:00
48982dedc1 页面可见性与vacuum优化 2024-09-02 10:08:49 +08:00
28742406c4 !6172 修复打开proc_outparam_override后,视图依赖package.function,执行查询时返回结果不正确的问题.
Merge pull request !6172 from wangfeihuo/master
2024-09-02 02:06:06 +00:00
51c5c3a062 DSS&&CBB推点 2024-09-02 09:17:04 +08:00
862001c0a1 !6167 资源池化网络双集群同步system ID
Merge pull request !6167 from Carl/master
2024-09-02 01:10:22 +00:00
bd3c185fde 修复打开proc_outparam_override后,视图依赖package.function,执行查询时返回结果不正确的问题 2024-08-31 19:22:34 +08:00
1bf2016625 !6136 gs_dump导出B库时设置GUC参数 quote_all_identifiers开启
Merge pull request !6136 from 王平云/master
2024-08-31 10:36:00 +00:00
5e74e3e8eb !6165 【master】修复1.1.0 升级6.0.0报错
Merge pull request !6165 from 梅程/6.0.0_update_master
2024-08-31 09:50:17 +00:00
4dead4e776 修复gs_dump导出二级分区表失败的问题并添加fastcheck用例 2024-08-31 17:26:46 +08:00
d467556900 网络双集群build调整 2024-08-31 17:15:33 +08:00
c88581569e gs_dump导出B库时设置GUC参数 quote_all_identifiers开启 2024-08-31 16:54:40 +08:00
ffd3ded986 delay redo connect 2024-08-31 14:15:44 +08:00
bdce2f37f7 !6159 修复sonichashagg 查询挂库问题
Merge pull request !6159 from jemappellehc/sonicagg
2024-08-31 01:46:08 +00:00
8969344dc9 修改类型转换时使用的typmod 2024-08-30 10:12:10 +00:00
c5e4dfc40f !6132 修复存储过程执行commit报错的问题
Merge pull request !6132 from chenxiaobin/fixForbid
2024-08-30 09:39:27 +00:00
21fdda934c !6160 处理issue:使用gs_probackup时的部分打印信息需将oss修改为s3
Merge pull request !6160 from lukeman/oss
2024-08-30 09:32:26 +00:00
770625fb5a !6162 极简安装demo database输入yes报错问题修复
Merge pull request !6162 from KeKe/master
2024-08-30 08:10:43 +00:00
4fa62c7a4c !6082 主备同步与延时回放机制优化
Merge pull request !6082 from maxiang/startwalrcv
2024-08-30 08:00:47 +00:00
9ae0cfd7dc 修复gs_stat_undo,gs_xlog_keepers系统函数升级问题 2024-08-30 10:36:07 +08:00
77d885f4af 极简安装demo database输入yes报错问题修复 2024-08-29 20:47:51 +08:00
3e042de906 sonic hash agg bugfix 2024-08-29 20:31:14 +08:00
9f48acf200 处理issue:gs_probackup时的部分打印信息需将oss修改为s3 2024-08-29 20:12:51 +08:00
d606da7437 !5787 raise notice打印不存在的列,未报错
Merge pull request !5787 from 雷紫薇/bug132202
2024-08-29 11:35:57 +00:00
9588433244 !6157 修复gs_dump开启quote-all-identifiers选项导致B库列属性丢失
Merge pull request !6157 from 王平云/fix1
2024-08-29 11:31:38 +00:00
18672532da 【feature】pg_probackup适配硬件密码模块 2024-08-29 15:36:10 +08:00
e40fee3f63 添加GAUSSHOME环境变量审查 2024-08-29 15:22:27 +08:00
49b9faeb6e gs_dump导出B库时设置GUC参数 quote_all_identifiers开启 2024-08-29 14:57:20 +08:00
038a58626f !6154 修复0019ff4的一处笔误
Merge pull request !6154 from lukeman/core_pr
2024-08-29 06:25:17 +00:00
db27a56f3f !6153 Switch zone代码加固
Merge pull request !6153 from lyannaa/master829
2024-08-29 02:59:36 +00:00
85f8fb182d 修复0019ff4的一处笔误 2024-08-29 10:09:04 +08:00
7326e5c0f9 1.switch zone代码加固
2.删除无用校验
2024-08-29 09:37:23 +08:00
0b2bb08fe7 !6150 initdb阶段调整DSS api日志为debug级别
Merge pull request !6150 from Carl/master
2024-08-28 12:02:29 +00:00
74a5a15d0b initdb阶段调整DSS api日志为debug级别 2024-08-28 17:11:47 +08:00
d65f3bb02b !6123 【处理8.0 core问题】hex和bit_and函数,当入参为整数或二进制类型时和mysql查询结果不一致
Merge pull request !6123 from lukeman/core_pr
2024-08-28 08:14:08 +00:00
0305af7c4c !5937 【测试类型:SQL功能】【支持arry嵌套arry】嵌套数组赋值给嵌套数组类型,输出结果有误
Merge pull request !5937 from yelingzhi/bug_IAHA67
2024-08-28 06:06:01 +00:00
7e9e62c878 未执行的sql语句中包含raise不存在列时抛出错误 2024-08-28 13:58:12 +08:00
315d0b76d2 !5976 包中proc调用其他包中参数为cursor%rowtype的proc,挂库,产生core
Merge pull request !5976 from 雷紫薇/bug133890
2024-08-28 03:40:51 +00:00
cd765bd629 !5789 只有一列时,rowtype的值插入表,表现错误
Merge pull request !5789 from 雷紫薇/bug132408
2024-08-28 02:55:13 +00:00
0019ff4d7c 【处理8.0 core问题】hex和bit_and函数,当入参为整数或二进制类型时和mysql查询结果不一致 2024-08-28 10:14:47 +08:00
7c67eebf6d 修改流水线编译TSDB 2024-08-28 10:00:00 +08:00
8f355c1a26 !5934 【feature】 字符串类型支持char和byte语义
Merge pull request !5934 from dwordge/dev_charbyte_0802_1
2024-08-28 01:26:12 +00:00
c4d32a65bf 清理elog中reset和clean时不必要的内存上下文切换 2024-08-27 18:08:38 +08:00
8d2646d600 !6105 修复增加自增列主键报错的问题
Merge pull request !6105 from chenxiaobin/fixAutoInc
2024-08-27 09:56:36 +00:00
082c0b24f8 支持逻辑备份p和d格式的硬件加密 2024-08-27 17:28:33 +08:00
1046a3b463 提交硬件密码模块接口库 2024-08-27 17:26:39 +08:00
fa9a3a8b3b !6109 解决双集群swicthover pageredo线程卡住问题
Merge pull request !6109 from Carl/master
2024-08-27 09:03:52 +00:00
b2197daf83 主备同步与延时回放机制优化 2024-08-26 17:50:48 +08:00
aca7e26632 修复存储过程执行commit报错的问题 2024-08-26 17:40:37 +08:00
fea5d62364 !6129 [VACUUM] 修复tidstore在disable_memory_stats开启时core的问题
Merge pull request !6129 from tino247/master
2024-08-26 09:27:20 +00:00
6f63f23120 向量数据库支持Xstore存储 2024-08-26 15:37:03 +08:00
c0c48b8d92 !6127 autovacuum流程优化
Merge pull request !6127 from lyannaa/8-26
2024-08-26 07:20:26 +00:00
beb349ecc4 [VACUUM] Fix tidstore core problem when disable_memory_stats is on 2024-08-26 14:36:19 +08:00
9330d1a0fe 字符串类型支持char和byte语义 2024-08-25 19:44:27 -07:00
0c94cbafdf 1.toast表场景下获取oldestXmin
2.autovacuum流程优化
3.刪除冗餘代碼,clean code
2024-08-26 10:11:13 +08:00
9e85f1f234 !6122 打包构建增加pg_archivecleanup工具
Merge pull request !6122 from zhangxubo/master
2024-08-26 01:30:58 +00:00
75068dc41c !6104 故障注入框架重写适配
Merge pull request !6104 from 陈超/fault
2024-08-24 07:01:01 +00:00
75c7efa57c !6120 修复执行regexp_count函数时ctr+c无法掐断的问题的问题.
Merge pull request !6120 from wangfeihuo/master
2024-08-24 02:51:21 +00:00
b280b1d7ab add pg_archivecleanup tools 2024-08-24 10:42:02 +08:00
a9f09b7af1 !5819 【SMP】 parallel_index_scan 测试用例
Merge pull request !5819 from 赵森/parallel_index_scan_test
2024-08-24 00:59:45 +00:00
8cf81e0675 【标题】:修复执行regexp_count函数是ctr+c无法掐断的问题的问题
【实现内容】: 修复执行regexp_count函数是ctr+c无法掐断的问题的问题.
【根因分析】: 在while (RE_wchar_execute())时未处理CHECK_FOR_INTERRUPTS();
【实现方案】: 在while (RE_wchar_execute())中增加CHECK_FOR_INTERRUPTS的处理。
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IAK8VI
2024-08-24 08:39:00 +08:00
fe68105ad9 !6107 redo page code refactor
Merge pull request !6107 from lyannaa/822
2024-08-23 08:37:18 +00:00
f8ac4c0f70 添加支持主机通过广播形式收集备机的oldestxmin的开关和逻辑 2024-08-23 15:31:53 +08:00
11430ec60d !6112 修复使用关键字作为游标名,关键字带单引号、反引号报错信息不合理的问题
Merge pull request !6112 from wangfeihuo/master
2024-08-23 06:38:40 +00:00
16e2af074e 【标题】:修复使用关键字作为游标名,关键字带单引号、反引号报错信息不合理的问题
【实现内容】: 修复使用关键字作为游标名,关键字带单引号、反引号报错信息不合理的问题.
【根因分析】: 在处理cursor expression时,预读两位导致yyextra->scanbuf的内容变更
【实现方案】: 预读两位改成先预读一位,判断是(再预读下一位。
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IAIJ67
2024-08-23 11:26:33 +08:00
50ebe5416d 故障注入框架重写适配 2024-08-23 09:12:12 +08:00
9095b66157 redo page code refactor 2024-08-23 08:15:44 +08:00
e0a4925a79 修复增加自增列主键报错的问题 2024-08-22 19:23:37 +08:00
055cccce33 解决双集群swicthover pageredo线程clean up锁问题 2024-08-22 18:07:17 +08:00
4b934c709e !6075 gs_dump导出非sql格式时添加behavior_compat_options参数
Merge pull request !6075 from zhubin79/dump-c
2024-08-22 07:45:22 +00:00
8903749f6e !6092 修改\d查询表信息的storage_type大小写的不一致问题
Merge pull request !6092 from 王明轩/master
2024-08-22 07:27:28 +00:00
ece900991a gs_dump导出时添加behavior_compat_options参数 2024-08-22 11:32:44 +08:00
0def8adb6e !6098 解决双集群build完成切主问题
Merge pull request !6098 from Carl/master
2024-08-21 11:43:40 +00:00
9822f5f51c !6095 修复校验误报error
Merge pull request !6095 from 徐达标/0821
2024-08-21 10:53:59 +00:00
8ceeab2f80 !6031 mppdb_decoding逻辑复制槽解码添加truncate table事务信息
Merge pull request !6031 from blig/new_master2
2024-08-21 07:55:27 +00:00
c551a48b84 修复urq meta校验误报error 2024-08-21 14:29:16 +08:00
41027ffdd7 mppdb_decoding逻辑复制槽解码添加truncate table事务信息 2024-08-21 11:09:48 +08:00
a841758975 修改\d查询表信息的storage_type大小写的不一致问题 2024-08-21 11:08:36 +08:00
7e3717c011 !6046 修复insertrow中存在用户变量时异常报错的问题
Merge pull request !6046 from chenxiaobin/fixUserSet
2024-08-20 12:41:26 +00:00
c9a66fbe66 !6059 处理issue:【pg兼容性】给表创建视图,并给表增加一列,对表备份后用gs_restore恢复时报错
Merge pull request !6059 from lukeman/delete_issue
2024-08-20 11:33:08 +00:00
8cec56efe4 !6077 修复游标向量化codegen的core问题
Merge pull request !6077 from chenxiaobin/fixCodegen
2024-08-20 09:25:14 +00:00
74dddc50e2 解决双集群build完成切主问题 2024-08-20 16:49:22 +08:00
fb8814eb26 !6080 网络双集群跳过walrec term校验
Merge pull request !6080 from Carl/master
2024-08-20 07:47:59 +00:00
4288800a5f 网络双集群跳过walrec term校验 2024-08-20 14:52:53 +08:00
a50f3eeb7d !5818 【SMP】support parallel index scan
Merge pull request !5818 from 赵森/master
2024-08-20 06:07:56 +00:00
091ec9f8f9 !5966 解决timescaledb插件,时序表查看指定的SQL执行计划不准确
Merge pull request !5966 from 叶某人/IA9L9T
2024-08-20 03:24:01 +00:00
ee0023f8a6 streamDesc use normal hash table 2024-08-20 10:43:03 +08:00
56375e5502 parallel_index_scan test case 2024-08-20 09:57:25 +08:00
6b7591f437 更新版本号至7.0.0-RC1 2024-08-19 20:49:22 +08:00
021fdb28e4 修复insertrow中存在用户变量时异常报错的问题 2024-08-19 17:36:49 +08:00
77f5c8d5e1 修复游标向量化codegen的core问题 2024-08-19 16:58:10 +08:00
65f045808a !6067 upage ubtree校验增加打印rnode block offset信息
Merge pull request !6067 from 徐达标/0817
2024-08-19 08:13:12 +00:00
8592986330 !5783 [VACUUM] Use tidstore & Implement bypass vacuum index
Merge pull request !5783 from tino247/master
2024-08-19 06:42:51 +00:00
9764e9ead1 !6003 嵌套游标的rowtype,输出值有误
Merge pull request !6003 from 雷紫薇/nest_cursor
2024-08-19 03:51:00 +00:00
336ca03fa9 !6039 【中移信息】解决dump指定schema时没有导出同义词问题
Merge pull request !6039 from Rock/bug_fix
2024-08-19 03:06:00 +00:00
1bea679797 修复慢sql信息收集问题 2024-08-19 10:21:17 +08:00
3a7916b746 【中移信息技术】bugfix:gs_dump指定schema导出时没有导出同义词 2024-08-19 09:27:22 +08:00
4789e6555b !5936 【测试类型:SQL功能】【支持array嵌套array】嵌套数组一维数组赋类型不匹配的值,挂库,产生core
Merge pull request !5936 from yelingzhi/bug_IAHA5S
2024-08-19 01:21:23 +00:00
6bbc2ad158 修复嵌套数组给嵌套数组类型赋值未生效的问题 2024-08-19 01:17:58 +00:00
29fc11e0e4 upage ubtree校验增加打印rnode block offset信息
ubtree优化校验级别
2024-08-17 17:56:52 +08:00
ef01f576fe 处理issue:【pg兼容性】给表创建视图,并给表增加一列,对表备份后用gs_restore恢复时报错 2024-08-17 17:33:13 +08:00
d3198789ec !5470 修复inlist to join + for update 场景下的宕机问题
Merge pull request !5470 from cc_db_dev/fix_inlist_forupdate
2024-08-17 01:10:44 +00:00
f9944beb07 !5849 修复查询中设置用户变量卡住的问题
Merge pull request !5849 from TinyBag/uservar
2024-08-17 01:09:30 +00:00
5b8d32bde2 !6055 处理issue:merge into源为物化视图,报错cannot lock rows in materialized view
Merge pull request !6055 from lukeman/core_pr
2024-08-16 09:50:56 +00:00
c04dadb276 !6066 修复enable_security_policy=off时删除标签,系统表中数据未按预期更新问题
Merge pull request !6066 from 蒋宏博/6.0.0
2024-08-16 09:38:24 +00:00
c18d74194d !6002 适配dolphin升级到5.0
Merge pull request !6002 from chenxiaobin/upgradedolphin5.0
2024-08-16 09:09:35 +00:00
bdd8e2ecda 修复为嵌套数组的一维数组赋类型不匹配的值时挂库的问题 2024-08-16 08:54:55 +00:00
4d46d4a0f7 !6057 修复gs_get_recv_locations函数,builtin_funcs.ini与升级脚本不一致
Merge pull request !6057 from james/master
2024-08-16 08:10:04 +00:00
b75f07e47f !6061 删除极致RTO更新场景onlyCopyDelta优化
Merge pull request !6061 from wofanzheng/master
2024-08-16 07:32:53 +00:00
beb73c1ecf add fix 2024-08-16 10:32:29 +08:00
068e3a10b7 适配dolphin升级到5.0 2024-08-16 09:47:49 +08:00
33651c201b !5995 为6.0.0分支预留版本号
Merge pull request !5995 from 梅程/6.0.0reservationVersion
2024-08-16 01:43:37 +00:00
cac9c19405 为6.0.0分支预留版本号 2024-08-15 21:20:51 +08:00
1cc346ed7b !6041 decode函数A模式兼容
Merge pull request !6041 from 梅程/decode-issue
2024-08-15 13:01:51 +00:00
5cbcbc8a08 !5691 [master][5.0.2问题同步]修复gs_xlog_keepers在5.0.0升级5.0.2时,系统表中数据存在不同的问题。
Merge pull request !5691 from 何文健/master
2024-08-15 12:07:36 +00:00
8d2ce084e5 处理issue:merge into源为物化视图,报错cannot lock rows in materialized view 2024-08-15 19:29:28 +08:00
e53432eda6 !6053 修复极致RTO更新场景下页面xid未赋值FrozenTransactionId
Merge pull request !6053 from wofanzheng/master
2024-08-15 11:16:06 +00:00
5dac459fa2 !6049 【bugfix】修复normal reform时在checkpoint前将原主控制文件内容刷到自己控制文件的问题
Merge pull request !6049 from 周聪/bugfix_normal_reform_update_old_primary_controlFile
2024-08-15 10:34:03 +00:00
bae9b63a3b !6047 解决samplescan行数估算差距大,执行计划选择错误导致的性能问题
Merge pull request !6047 from laishenghao/samplescan
2024-08-15 09:27:18 +00:00
fd2711f8bc fix bug #I9P3QO #5 修复gs_xlog_keepers函数在升级前后在pg_proc显示不同的bug 2024-08-15 17:14:58 +08:00
f4232f8055 !5996 【pg兼容性】多次执行create schema if not exists AUTHORIZATION 报错
Merge pull request !5996 from TinyBag/schema
2024-08-15 08:36:58 +00:00
40372dc80d !6029 修复创建带嵌套tableof入参的包函数coredump的问题
Merge pull request !6029 from chenxiaobin/fixPkg
2024-08-15 07:42:39 +00:00
c24d2cd17a !5855 修复B模式视图权限校验遗漏
Merge pull request !5855 from TinyBag/user
2024-08-15 07:31:36 +00:00
84f04a56d1 解决samplescan行数估算差距大,执行计划选择错误导致的性能问题 2024-08-15 15:26:05 +08:00
1308535c47 !6044 【内核】创建列约束分区表,插入触发列约束的元组,报错信息问题修复
Merge pull request !6044 from 孙德超/bugfix6
2024-08-15 07:15:10 +00:00
0b3ba015cd 【bugfix】修复normal reform时在checkpoint前
误刷原主的控制文件到自己的控制文件
2024-08-15 14:50:44 +08:00
871d1ab7a6 !6027 bug修复-record_in在A模式下解析两个连续双引号没有转换成null
Merge pull request !6027 from DarkAthena/master
2024-08-15 06:46:10 +00:00
a6e8ede67d 查询中设置用户变量卡住 2024-08-15 14:45:34 +08:00
1c68650be9 codecheck 2024-08-15 12:32:46 +08:00
3e9c2b2a4d 创建列约束分区表,校验修复 2024-08-15 10:37:50 +08:00
ab376065e4 !6040 双集群备集群跳过校验
Merge pull request !6040 from Carl/master
2024-08-15 01:01:33 +00:00
ede861c86f 修复record_in在A模式下解析空字符串没有转换成null的问题
Signed-off-by: DarkAthena <yongyu.wang@enmotech.com>

统一代码风格

Signed-off-by: DarkAthena <yongyu.wang@enmotech.com>

添加测试用例

Update create_compositetype.out

Update create_compositetype.out
2024-08-15 00:48:02 +08:00
13605efc6a decode A模式兼容 2024-08-14 21:34:34 +08:00
21dfb34fb2 !5997 增加gs_ctl init工具--pwfile参数校验
Merge pull request !5997 from zzh/master
2024-08-14 12:09:07 +00:00
8c5c483d0f 双集群备集群跳过校验 2024-08-14 19:11:54 +08:00
1efd8c5778 根据free标记去释放tup 2024-08-14 10:55:07 +00:00
e76541f702 禁止插入值为record不禁止插入值为row 2024-08-14 09:40:33 +00:00
731e3ebf0b !6007 新建用户不用赋权就可以lo_open管理员创建的大对象
Merge pull request !6007 from 雷紫薇/bug131572_600
2024-08-14 08:24:21 +00:00
cbc7248dbf !5883 【测试类型:SQL功能】【支持用ROWTYPE给游标赋值】创建使用游标rowtype的触发器函数,挂库
Merge pull request !5883 from 雷紫薇/bug133809
2024-08-14 08:14:30 +00:00
b240875e76 !5790 给游标rowtype变量赋默认值时,未检查varchar类型长度约束
Merge pull request !5790 from 雷紫薇/bug132366
2024-08-14 08:11:41 +00:00
3146ffa38c !5739 新建用户不用赋权就可以lo_open管理员创建的大对象
Merge pull request !5739 from 雷紫薇/bug131572
2024-08-14 08:10:03 +00:00
daaa6f8e82 fix bug #I9KGL6 reindx table pg_class 与 drop table 死锁问题 2024-08-14 15:30:48 +08:00
8fd0f31c76 fix_event_trigger 2024-08-14 03:12:02 -04:00
84778bc934 !5665 解决《创表之后,gs_dump导出的时候上报告警,提示WARNING:archive items not in correct section order cursection》问题
Merge pull request !5665 from lexin184383/dump_synonym
2024-08-14 07:11:27 +00:00
da44eb90dd 修复创建带嵌套tableof入参的包函数coredump的问题 2024-08-14 11:35:55 +08:00
fd62411dc9 !5960 修复rotate/not rotate不支持with子句及not rotate不支持存储过程中使用自定义变量问题
Merge pull request !5960 from ljy/bugfix_rotate_with
2024-08-14 03:27:25 +00:00
f7b6889f9d !6012 修复资源池化双集群握手失败
Merge pull request !6012 from Carl/master
2024-08-14 02:00:04 +00:00
67ae120bbb !6000 GUC参数无法使备机关闭CBM线程_master
Merge pull request !6000 from 何文健/master
2024-08-14 01:32:52 +00:00
2bb007b7de 修复双集群握手失败 2024-08-13 20:39:10 +08:00
3a568c22e7 !6021 修复undo space满后,error日志报错undo_space_limit_size为0的问题
Merge pull request !6021 from yaoxin/fix_undo_spaces_limit_error
2024-08-13 11:21:08 +00:00
1db6569329 !6020 【bugfix】修复实时构建在ss_ondemand_recovery_mem_size较小的情况下,Startup线程卡在DispatchXactRecord
Merge pull request !6020 from 周聪/bugfix_ondemand_realtime_build_hangup_pr
2024-08-13 11:03:37 +00:00
6a28bcf576 修复undo space满后,error日志报错undo_space_limit_size为0的问题 2024-08-13 19:02:51 +08:00
a7cd9e56e7 修复inlist to join + for update 场景下的宕机问题
根因分析:
在inlist to  join优化中,如果被优化的目标表为for update/share的操作目标,处理逻辑有误

解决方案:
(1)在inlist to join中,如果存在for update作用于基表,此时plan中的rowmarks会被标记为RowMarkRequiresRowShareLock,但是在
inist2join_qrw_optimization优化中,会将该目标表改为subquen加入到可选路径中,对于子查询而言,此时plan中的标记不能被标记为RowMarkRequiresRowshareLock,
应该被标记为仅引用或者复制,但此时尚未选择哪种路径(扫描基表或者子查询),也即无法确定rowmarks中的值,所以冲突,目前将此种场景下的优化禁止。
(2)在inlist to join中,如果for update作用于子查询,此时的rowmark跟变换成子查询后一致,可以继续进行优化。
2024-08-13 18:04:49 +08:00
61e0ea88af !6013 修复move分区表场景bug
Merge pull request !6013 from yaoxin/fixmovepartition2
2024-08-13 09:15:35 +00:00
c1988fdb2c !6018 修复copy to命令在备机被转发了的问题
Merge pull request !6018 from cchen676/240710master
2024-08-13 08:37:33 +00:00
fdcb6a4089 【bugfix】修复实时构建在ss_ondemand_recovery_mem_size较小的情况下,Startup线程卡在DispatchXactRecord的问题 2024-08-13 16:20:52 +08:00
2230f6bc2e 修复copy to命令在备机被转发了的问题 2024-08-13 15:27:48 +08:00
f3da59e3c2 禁止获取嵌套游标的rowtype 2024-08-13 09:48:48 +08:00
d322376e17 !6011 【bugfix】修复按需回放redo阶段执行create procedure报错的问题
Merge pull request !6011 from 周聪/bugfix_redo_phase_cannot_execute_prodecure
2024-08-12 13:59:53 +00:00
c374cde0e5 !5993 jdbc建连删除冗余的server_support_trace,直接使用enable_record_nettime替代
Merge pull request !5993 from 蒋宏博/master
2024-08-12 12:27:36 +00:00
a3fdc8262a !5981 修改\d查询表信息的storage_type大小写的不一致问题
Merge pull request !5981 from 王明轩/master
2024-08-12 12:18:51 +00:00
5cf54f0cbf !5988 【资源池化】dms的线程打印error日志需要使用try-catch结构,否则线程会退出
Merge pull request !5988 from 董宁/bugfix29_up
2024-08-12 12:02:58 +00:00
cf050ccb7b clean code by zhaosen 2024-08-12 19:15:09 +08:00
91b65112e6 【bugfix】修复按需回放redo阶段执行create procedure报错的问题 2024-08-12 16:59:28 +08:00
6f9c04d7a9 !5989 【资源池化】【DMS推点】8.10推点
Merge pull request !5989 from 董宁/sync20
2024-08-12 08:19:54 +00:00
7c5308c17c !5992 修复备机开启写转发后的一些设计时场景遗漏导致的部分问题
Merge pull request !5992 from cchen676/240710master
2024-08-12 08:01:48 +00:00
f9d7ef43fd 【资源池化】dms的线程打印error日志需要使用try-catch结构,否则线程会退出 2024-08-12 15:50:00 +08:00
48ea337dfc fix bug #I8NPJP GUC参数无法使备机关闭CBM线程 2024-08-12 15:49:19 +08:00
a5f9e27a85 !5986 更新数据库包名--server改为tar.bz2后缀
Merge pull request !5986 from zhangxubo/fixver
2024-08-12 07:16:06 +00:00
ebb29c3caf !5977 修复在开启proc_outparam_override后,无法在package内重载入参不一致且带出参的函数的问题
Merge pull request !5977 from wangfeihuo/master
2024-08-12 06:25:38 +00:00
zzh
79a109441e 增加gs_ctl init工具--pwfile参数校验 2024-08-12 14:20:08 +08:00
df3d0e5ea8 fix repeatly create schema if not exists 2024-08-12 11:26:26 +08:00
3f02e21868 支持打开out_param_func_overload函数重载 2024-08-12 11:15:52 +08:00
7a6020226a 修复段错误 2024-08-12 02:14:44 +00:00
d466bedcea 修复备机开启写转发后的一些之前设计时没考虑的问题 2024-08-12 09:38:01 +08:00
8c626e1cf0 !5991 【bugfix】 修复按需回放redo阶段报错 can not find target block-record
Merge pull request !5991 from 周聪/bugfix_ondemand_redo_canot_find_target_block_record
2024-08-12 01:22:16 +00:00
34f607ba6a !5975 UHeapVerify添加置空逻辑
Merge pull request !5975 from Mijamind/0728
2024-08-11 09:19:18 +00:00
0520fb754c !5985 fix gs_undo_dump_xid
Merge pull request !5985 from 徐达标/fix_undofunc
2024-08-11 09:09:51 +00:00
4916348824 1.UHeapVerify添加置空逻辑
2.undo lock swtichover reinit
2024-08-11 14:59:24 +08:00
803a046200 【bugfix】 修复按需回放redo阶段报错 can not find target block-record 2024-08-10 16:56:59 +08:00
c7cfea4ae5 !5979 双集群跳过CheckForRestartPoint
Merge pull request !5979 from Carl/master
2024-08-10 06:43:56 +00:00
4172a5dcee 【资源池化】【DMS推点】8.10推点 2024-08-10 14:42:20 +08:00
a0c06d4e7f 双集群跳过CheckForRestartPoint 2024-08-10 11:47:57 +08:00
9a79c513ad fix undostatfuns 2024-08-10 11:06:05 +08:00
39231e3991 修改\d查询表信息的storage_type大小写的不一致问题 2024-08-10 10:09:27 +08:00
43bebe4632 !5965 A库模式,在词法中提前判断浮点数常量是否溢出
Merge pull request !5965 from zhubin79/tbf-def
2024-08-09 09:41:27 +00:00
8c1c0e4dd0 在词法中提前判断 浮点数常量是否溢出 2024-08-09 15:43:33 +08:00
d66fc9d182 clean code by zhaosen 2024-08-09 14:20:19 +08:00
d0f3f71289 clean code jin 2024-08-09 13:39:54 +08:00
74820dfb3c clean code && remove guc parameter smp_thread_cost 2024-08-09 12:29:55 +08:00
6e0b5399d1 fix libpgtypes打包版本问题 2024-08-07 09:52:04 +08:00
340b9830c2 禁止无权限用户打开大对象 2024-08-06 02:52:22 +00:00
f2d094470e 检测字符串长度 2024-08-02 10:13:37 +00:00
00f2b2f012 删除未调用函数 2024-08-01 16:40:57 +08:00
a032fff071 资源池化存储复制备集群没有remove xlogfile的需要 2024-08-01 16:20:55 +08:00
83e2cb44a4 资源池化:处理代码bug导致的switchover卡住 2024-08-01 16:00:27 +08:00
6d9f0684f2 fix backup timeout 2024-07-30 02:12:06 +00:00
dcb24b7bbc 修改锁类型为LWlock 2024-07-29 13:47:20 +08:00
3312e14cd4 fix test case plan_hint_iud 2024-07-29 13:47:18 +08:00
c601b78a54 修复合并冲突,合并时存在疏漏,代码合错了位置 2024-07-29 13:47:15 +08:00
ce4e503946 remove test case 2024-07-29 13:47:13 +08:00
d2441fa591 fix #62649744 fix parallel indexscan backward coredump 2024-07-29 13:47:04 +08:00
777d935e39 fix #62414445 btree: Support parallel index scans. #62414492 add index cost model in optimizer add smp thread cots add executor support for parallel index scans
Please enter the commit message for your changes. Lines starting
2024-07-29 13:45:48 +08:00
e7cbdfbe90 修复模式权限校验 2024-07-25 11:07:14 +08:00
688f292c9f [VACUUM] Use tidstore & implement bypass index vacuum 2024-07-16 10:22:03 +08:00
e5297cc252 解决timescaledb插件,根据btree索引对时序表进行聚簇排序报错 2024-07-09 20:16:20 +08:00
6049731c6f 创表之后,gs_dump导出的时候上报告警,提示WARNING:archive items not in correct section order cursection 2024-07-02 11:16:04 +08:00
60b8506009 修复 assemble xlogrecord 中 maindata header 注册问题 2023-11-20 10:00:20 +08:00
204cc8e60c 修复AddCStringVar函数中memcpy_s越界问题 2023-11-01 10:22:07 +08:00
88e7d319cf 修复 “debug版本修改enable_incremental_checkpoint = on -> off 产生 coredump” 的问题 2023-10-18 09:27:40 +08:00
f8ea433350 修复CBM Writer线程执行异常时未关闭打开的hash table的问题。 2023-09-22 16:19:44 +08:00
61254a1002 该用例执行后会修改pg_hba引起后续别的用例失败,应当还原pg_hba.conf 2023-08-01 11:12:41 +08:00
96425c91ae init ThreadPoolScheduler::m_getKilled 2022-11-16 09:41:41 +08:00
994 changed files with 119981 additions and 3627 deletions

View File

@ -36,6 +36,15 @@ endif()
if("${ENABLE_PRIVATEGAUSS}" STREQUAL "ON")
MESSAGE(FATAL_ERROR " The option ENABLE_PRIVATEGAUSS is not supported thus should be turned off.")
endif()
if("${ENABLE_LITE_MODE}" STREQUAL "")
set(ENABLE_LITE_MODE "OFF")
endif()
if("${ENABLE_MOT}" STREQUAL "")
set(ENABLE_MOT "OFF")
endif()
if("${ENABLE_HTAP}" STREQUAL "")
set(ENABLE_HTAP "ON")
endif()
#FIXME: make it an argument
set(openGauss ".")
@ -107,11 +116,11 @@ install(DIRECTORY ${CMAKE_BINARY_DIR}/pg_plugin DESTINATION lib/postgresql)
install(DIRECTORY ${CMAKE_BINARY_DIR}/libsimsearch DESTINATION lib)
if(EXISTS ${CMAKE_SOURCE_DIR}/contrib/dolphin)
install(CODE "execute_process(COMMAND bash cmake.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/contrib/dolphin)")
install(CODE "execute_process(COMMAND bash cmake.sh ${BUILD_TUPLE} ${ENABLE_LITE_MODE} ${ENABLE_MOT} ${ENABLE_HTAP} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/contrib/dolphin)")
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--4.0.sql
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--5.0.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--1.0--1.1.sql
@ -138,6 +147,12 @@ if(EXISTS ${CMAKE_SOURCE_DIR}/contrib/dolphin)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--4.0--3.0.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--4.0--5.0.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--5.0--4.0.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--2.0--2.0.1.sql
DESTINATION share/postgresql/extension/
)

View File

@ -102,11 +102,28 @@ install:
@if test -d contrib/spq_plugin; then $(MAKE) -C contrib/spq_plugin $@; fi
@if test -d contrib/dolphin; then $(MAKE) -C contrib/dolphin $@; fi
@if test -d contrib/age; then $(MAKE) -C contrib/age $@; fi
@if test -d contrib/datavec; then $(MAKE) -C contrib/datavec clean; fi
@if test -d contrib/datavec; then $(MAKE) -C contrib/datavec $@; fi
@if test -d contrib/gms_compress; then $(MAKE) -C contrib/gms_compress $@; fi
@if test -d contrib/gms_utility; then $(MAKE) -C contrib/gms_utility $@; fi
@if test -d contrib/gms_stats; then $(MAKE) -C contrib/gms_stats $@; fi
@if test -d contrib/gms_tcp; then $(MAKE) -C contrib/gms_tcp $@; fi
@if test -d contrib/gms_profiler; then $(MAKE) -C contrib/gms_profiler $@; fi
@if test -d contrib/gms_xmlgen; then $(MAKE) -C contrib/gms_xmlgen $@; fi
@if test -d contrib/gms_output; then $(MAKE) -C contrib/gms_output $@; fi
@if test -d contrib/gms_i18n; then $(MAKE) -C contrib/gms_i18n $@; fi
@if test -d contrib/gms_inaddr; then $(MAKE) -C contrib/gms_inaddr $@; fi
@if test -d contrib/timescaledb; then (./contrib/timescaledb/run_to_build.sh && $(MAKE) -C contrib/timescaledb/build $@); fi
@if test -d contrib/chparser; then \
if command -v scws &> /dev/null; then \
$(MAKE) -C contrib/chparser $@; \
else \
echo "SCWS is not installed, skipping chparser build."; \
fi \
fi
@if test -d contrib/gms_lob; then $(MAKE) -C contrib/gms_lob $@; fi
@if test -d contrib/gms_sql; then $(MAKE) -C contrib/gms_sql $@; fi
@if test -d contrib/gms_debug; then $(MAKE) -C contrib/gms_debug $@; fi
+@echo "openGauss installation complete."
endif
endif

View File

@ -498,9 +498,22 @@ https://opengauss.org/zh/
<strong>openEuler 22.03 arm:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.1.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_arm.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.1.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_arm.tar.gz</a><br/>
<strong>openEuler 22.03 x86:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.1.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.1.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz</a></td>
</tr>
</tr>
<tr>
<td rowspan=2>master</td>
<td rowspan=2></td>
<td rowspan=1>6.0.0</td>
<td rowspan=1></td>
<td>gcc10.3</td>
<td rowspan=1>
<strong>openEuler_arm:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_arm.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_arm.tar.gz</a><br/>
<strong>openEuler_x86:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_x86_64.tar.gz</a><br/>
<strong>Centos_x86:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_Centos7.6_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_Centos7.6_x86_64.tar.gz</a><br/>
<strong>openEuler 22.03 arm:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_arm.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_arm.tar.gz</a><br/>
<strong>openEuler 22.03 x86:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.0/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz</a></td>
</tr>
</tr>
<tr>
<td rowspan=1>master</td>
<td rowspan=1></td>
<td>gcc10.3</td>
<td rowspan=1>
<strong>openEuler_arm:</strong> <a href="https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_arm.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_arm.tar.gz</a><br/>

3
build/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*
!.gitignore
!script/

View File

@ -1,6 +1,7 @@
[server]
./bin/dsscmd
./bin/dssserver
./bin/dsstbox
./bin/perctrl
./bin/dms_contrl.sh
./bin/dss_clear.sh
@ -76,7 +77,7 @@
./share/postgresql/extension/spqplugin.control
./share/postgresql/extension/spqplugin--1.0.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -85,6 +86,8 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql

View File

@ -34,7 +34,7 @@
./share/postgresql/extension/security_plugin.control
./share/postgresql/extension/security_plugin--1.0.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -43,10 +43,14 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql
./share/postgresql/extension/dolphin--4.0.1--4.0.sql
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/openGauss_expr_dolphin.ir
./share/postgresql/extension/file_fdw--1.0.sql
./share/postgresql/extension/plpgsql.control
@ -59,6 +63,24 @@
./share/postgresql/extension/hstore--1.0--1.1.sql
./share/postgresql/extension/log_fdw--1.0.sql
./share/postgresql/extension/log_fdw.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -743,10 +765,20 @@
./lib/postgresql/proc_srclib
./lib/postgresql/security_plugin.so
./lib/postgresql/dolphin.so
./lib/postgresql/gms_compress.so
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/latin2_and_win1250.so
./lib/postgresql/euc2004_sjis2004.so
./lib/postgresql/pgoutput.so
./lib/postgresql/gms_utility.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_i18n.so
./lib/postgresql/gms_debug.so
./lib/postgresql/gms_inaddr.so
./include/postgresql/server/postgres_ext.h
./include/postgresql/server/pg_config_os.h
./include/postgresql/server/pgtime.h
@ -923,4 +955,4 @@
./include/pqcomm.h
./include/pqexpbuffer.h
[version]
6.0.0
7.0.0-RC1

View File

@ -1,6 +1,7 @@
[server]
./bin/dsscmd
./bin/dssserver
./bin/dsstbox
./bin/perctrl
./bin/dms_contrl.sh
./bin/dss_clear.sh
@ -79,7 +80,7 @@
./share/postgresql/extension/timescaledb.control
./share/postgresql/extension/timescaledb--1.7.4.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -88,6 +89,8 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql
@ -95,8 +98,10 @@
./share/postgresql/extension/openGauss_expr_dolphin.ir
./share/postgresql/extension/age--1.0.0.sql
./share/postgresql/extension/age.control
./share/postgresql/extension/datavec--0.4.4.sql
./share/postgresql/extension/datavec--1.0.sql
./share/postgresql/extension/datavec.control
./share/postgresql/extension/chparser--1.0.sql
./share/postgresql/extension/chparser.control
./share/postgresql/extension/assessment--1.0.sql
./share/postgresql/extension/assessment.control
./share/postgresql/extension/file_fdw--1.0.sql
@ -117,12 +122,30 @@
./share/postgresql/extension/dblink--1.0.sql
./share/postgresql/extension/dblink--unpackaged--1.0.sql
./share/postgresql/extension/dblink.control
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_tcp--1.0.sql
./share/postgresql/extension/gms_tcp.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_xmlgen--1.0.sql
./share/postgresql/extension/gms_xmlgen.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -735,6 +758,7 @@
./share/postgresql/tsearch_data/swedish.stop
./share/postgresql/tsearch_data/ispell_sample.dict
./share/postgresql/tsearch_data/italian.stop
./share/postgresql/tsearch_data/dict.utf8.xdb
./share/postgresql/information_schema.sql
./share/postgresql/timezonesets/Antarctica.txt
./share/postgresql/timezonesets/Australia.txt
@ -814,15 +838,25 @@
./lib/postgresql/dolphin.so
./lib/postgresql/age.so
./lib/postgresql/datavec.so
./lib/postgresql/chparser.so
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/java/pljava.jar
./lib/postgresql/postgres_fdw.so
./lib/postgresql/dblink.so
./lib/postgresql/gms_utility.so
./lib/postgresql/pgoutput.so
./lib/postgresql/assessment.so
./lib/postgresql/gms_compress.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_inaddr.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_tcp.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_debug.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_xmlgen.so
./lib/postgresql/gms_i18n.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -350,16 +350,9 @@ function read_mpp_number()
version_num=$(echo $version_num1 | tr -d ";")
#remove the blank
version_num=$(echo $version_num)
if echo $version_num | grep -qE '^92[0-9]+$'
then
# get the last three number
latter=${version_num:2}
echo "92.${latter}" >>${SCRIPT_DIR}/version.cfg
else
echo "Cannot get the version number from globals.cpp."
exit 1
fi
form=${version_num:0:2}
latter=${version_num:2}
echo "${form}.${latter}" >>${SCRIPT_DIR}/version.cfg
}
read_mpp_number
@ -473,6 +466,10 @@ function install_gaussdb()
CMAKE_OPT="$CMAKE_OPT -DENABLE_OPENEULER_MAJOR=ON"
fi
if [[ -e "/etc/openEuler-release" && "$(cat /etc/openEuler-release | awk '{print $3}')" == "24.03" ]]; then
CMAKE_OPT="$CMAKE_OPT -DENABLE_OPENEULER_MAJOR=ON"
fi
if [ "${PLATFORM_ARCH}"x == "loongarch64"x ]; then
CMAKE_OPT="$CMAKE_OPT -DENABLE_BBOX=OFF -DENABLE_JEMALLOC=OFF"
fi

View File

@ -1,2 +1,2 @@
PRODUCT=openGauss
VERSION=6.0.0
VERSION=7.0.0-RC1

View File

@ -45,6 +45,8 @@
./share/postgresql/extension/plpgsql.control
./share/postgresql/extension/dist_fdw.control
./share/postgresql/extension/dist_fdw--1.0.sql
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/hstore--1.1.sql
./share/postgresql/extension/plpgsql--unpackaged--1.0.sql
./share/postgresql/extension/file_fdw.control
@ -52,6 +54,24 @@
./share/postgresql/extension/hstore--1.0--1.1.sql
./share/postgresql/extension/log_fdw--1.0.sql
./share/postgresql/extension/log_fdw.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -714,6 +734,7 @@
./lib/postgresql/utf8_and_sjis.so
./lib/postgresql/utf8_and_cyrillic.so
./lib/postgresql/hstore.so
./lib/postgresql/gms_compress.so
./lib/postgresql/packages.so
./lib/postgresql/utf8_and_euc_kr.so
./lib/postgresql/ascii_and_mic.so
@ -738,6 +759,15 @@
./lib/postgresql/latin2_and_win1250.so
./lib/postgresql/euc2004_sjis2004.so
./lib/postgresql/pgoutput.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_inaddr.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_i18n.so
./lib/postgresql/gms_utility.so
./lib/postgresql/gms_debug.so
./include/postgresql/server/postgres_ext.h
./include/postgresql/server/pg_config_os.h
./include/postgresql/server/pgtime.h

View File

@ -1,6 +1,7 @@
[server]
./bin/dsscmd
./bin/dssserver
./bin/dsstbox
./bin/perctrl
./bin/dms_contrl.sh
./bin/dss_clear.sh
@ -97,6 +98,8 @@
./share/postgresql/extension/mot_fdw.control
./share/postgresql/extension/postgres_fdw--1.0.sql
./share/postgresql/extension/postgres_fdw.control
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/dblink--1.0.sql
./share/postgresql/extension/dblink--unpackaged--1.0.sql
./share/postgresql/extension/dblink.control
@ -775,6 +778,7 @@
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/java/pljava.jar
./lib/postgresql/postgres_fdw.so
./lib/postgresql/gms_compress.so
./lib/postgresql/dblink.so
./lib/postgresql/pgoutput.so
./lib/postgresql/assessment.so

View File

@ -79,9 +79,29 @@
./share/postgresql/extension/gsredistribute--unpackaged--1.0.sql
./share/postgresql/extension/postgres_fdw--1.0.sql
./share/postgresql/extension/postgres_fdw.control
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/dblink--1.0.sql
./share/postgresql/extension/dblink--unpackaged--1.0.sql
./share/postgresql/extension/dblink.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -755,7 +775,17 @@
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/java/pljava.jar
./lib/postgresql/postgres_fdw.so
./lib/postgresql/gms_compress.so
./lib/postgresql/dblink.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_inaddr.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_i18n.so
./lib/postgresql/gms_utility.so
./lib/postgresql/gms_debug.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -64,7 +64,7 @@
./share/postgresql/extension/timescaledb.control
./share/postgresql/extension/timescaledb--1.7.4.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -73,6 +73,8 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql
@ -80,8 +82,10 @@
./share/postgresql/extension/openGauss_expr_dolphin.ir
./share/postgresql/extension/age--1.0.0.sql
./share/postgresql/extension/age.control
./share/postgresql/extension/datavec--0.4.4.sql
./share/postgresql/extension/datavec--1.0.sql
./share/postgresql/extension/datavec.control
./share/postgresql/extension/chparser--1.0.sql
./share/postgresql/extension/chparser.control
./share/postgresql/extension/file_fdw--1.0.sql
./share/postgresql/extension/plpgsql.control
./share/postgresql/extension/dist_fdw.control
@ -105,12 +109,30 @@
./share/postgresql/extension/dblink--1.0.sql
./share/postgresql/extension/dblink--unpackaged--1.0.sql
./share/postgresql/extension/dblink.control
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_tcp--1.0.sql
./share/postgresql/extension/gms_tcp.control
./share/postgresql/extension/gms_xmlgen--1.0.sql
./share/postgresql/extension/gms_xmlgen.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -722,6 +744,7 @@
./share/postgresql/tsearch_data/swedish.stop
./share/postgresql/tsearch_data/ispell_sample.dict
./share/postgresql/tsearch_data/italian.stop
./share/postgresql/tsearch_data/dict.utf8.xdb
./share/postgresql/information_schema.sql
./share/postgresql/timezonesets/Antarctica.txt
./share/postgresql/timezonesets/Australia.txt
@ -786,13 +809,23 @@
./lib/postgresql/dolphin.so
./lib/postgresql/age.so
./lib/postgresql/datavec.so
./lib/postgresql/chparser.so
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/java/pljava.jar
./lib/postgresql/postgres_fdw.so
./lib/postgresql/dblink.so
./lib/postgresql/gms_compress.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_inaddr.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_utility.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_debug.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_tcp.so
./lib/postgresql/gms_xmlgen.so
./lib/postgresql/gms_i18n.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -39,16 +39,9 @@ function read_gaussdb_number()
version_num=$(echo $version_num1 | tr -d ";")
#remove the blank
version_num=$(echo $version_num)
if echo $version_num | grep -qE '^92[0-9]+$'
then
# get the last three number
latter=${version_num:2}
echo "92.${latter}" >>${SCRIPT_DIR}/version.cfg
else
echo "Cannot get the version number from globals.cpp."
exit 1
fi
form=${version_num:0:2}
latter=${version_num:2}
echo "${form}.${latter}" >>${SCRIPT_DIR}/version.cfg
}
#######################################################################

View File

@ -47,16 +47,9 @@ function read_gaussdb_number()
version_num=$(echo $version_num1 | tr -d ";")
#remove the blank
version_num=$(echo $version_num)
if echo $version_num | grep -qE '^92[0-9]+$'
then
# get the last three number
latter=${version_num:2}
echo "92.${latter}" >>${SCRIPT_DIR}/version.cfg
else
echo "Cannot get the version number from globals.cpp."
exit 1
fi
form=${version_num:0:2}
latter=${version_num:2}
echo "${form}.${latter}" >>${SCRIPT_DIR}/version.cfg
}
#######################################################################
@ -171,7 +164,7 @@ function install_gaussdb()
GAUSSDB_EXTRA_FLAGS=" "
if [[ "$PLATFORM_ARCH"x == "x86_64"x || "$PLATFORM_ARCH"x == "aarch64"x ]] ; then
extra_config_opt+=" --enable-mot --enable-bbox "
extra_config_opt+=" --enable-mot --enable-bbox --enable-htap"
fi
if [ "$PLATFORM_ARCH"x = "loongarch64"x ] ; then

View File

@ -1,6 +1,7 @@
[server]
./bin/dsscmd
./bin/dssserver
./bin/dsstbox
./bin/perctrl
./bin/dms_contrl.sh
./bin/dss_clear.sh
@ -76,7 +77,7 @@
./share/postgresql/extension/spqplugin.control
./share/postgresql/extension/spqplugin--1.0.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -85,6 +86,8 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql

View File

@ -34,7 +34,7 @@
./share/postgresql/extension/security_plugin.control
./share/postgresql/extension/security_plugin--1.0.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -43,10 +43,14 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql
./share/postgresql/extension/dolphin--4.0.1--4.0.sql
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/openGauss_expr_dolphin.ir
./share/postgresql/extension/file_fdw--1.0.sql
./share/postgresql/extension/plpgsql.control
@ -59,6 +63,24 @@
./share/postgresql/extension/hstore--1.0--1.1.sql
./share/postgresql/extension/log_fdw--1.0.sql
./share/postgresql/extension/log_fdw.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -742,10 +764,20 @@
./lib/postgresql/proc_srclib
./lib/postgresql/security_plugin.so
./lib/postgresql/dolphin.so
./lib/postgresql/gms_compress.so
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/latin2_and_win1250.so
./lib/postgresql/euc2004_sjis2004.so
./lib/postgresql/pgoutput.so
./lib/postgresql/gms_utility.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_i18n.so
./lib/postgresql/gms_inaddr.so
./lib/postgresql/gms_debug.so
./lib/libxgboost.so
./include/postgresql/server/postgres_ext.h
./include/postgresql/server/pg_config_os.h
@ -922,4 +954,4 @@
./include/pqcomm.h
./include/pqexpbuffer.h
[version]
6.0.0
7.0.0-RC1

View File

@ -1,6 +1,7 @@
[server]
./bin/dsscmd
./bin/dssserver
./bin/dsstbox
./bin/perctrl
./bin/dms_contrl.sh
./bin/dss_clear.sh
@ -77,7 +78,7 @@
./share/postgresql/extension/spqplugin.control
./share/postgresql/extension/spqplugin--1.0.sql
./share/postgresql/extension/dolphin.control
./share/postgresql/extension/dolphin--4.0.sql
./share/postgresql/extension/dolphin--5.0.sql
./share/postgresql/extension/dolphin--1.0--1.1.sql
./share/postgresql/extension/dolphin--1.1--1.0.sql
./share/postgresql/extension/dolphin--1.1--2.0.sql
@ -86,6 +87,8 @@
./share/postgresql/extension/dolphin--3.0--2.0.sql
./share/postgresql/extension/dolphin--3.0--4.0.sql
./share/postgresql/extension/dolphin--4.0--3.0.sql
./share/postgresql/extension/dolphin--4.0--5.0.sql
./share/postgresql/extension/dolphin--5.0--4.0.sql
./share/postgresql/extension/dolphin--2.0--2.0.1.sql
./share/postgresql/extension/dolphin--2.0.1--2.0.sql
./share/postgresql/extension/dolphin--4.0--4.0.1.sql
@ -95,8 +98,10 @@
./share/postgresql/extension/age.control
./share/postgresql/extension/timescaledb.control
./share/postgresql/extension/timescaledb--1.7.4.sql
./share/postgresql/extension/datavec--0.4.4.sql
./share/postgresql/extension/datavec--1.0.sql
./share/postgresql/extension/datavec.control
./share/postgresql/extension/chparser--1.0.sql
./share/postgresql/extension/chparser.control
./share/postgresql/extension/assessment--1.0.sql
./share/postgresql/extension/assessment.control
./share/postgresql/extension/file_fdw--1.0.sql
@ -117,12 +122,30 @@
./share/postgresql/extension/dblink--1.0.sql
./share/postgresql/extension/dblink--unpackaged--1.0.sql
./share/postgresql/extension/dblink.control
./share/postgresql/extension/gms_compress--1.0.sql
./share/postgresql/extension/gms_compress.control
./share/postgresql/extension/gms_utility--1.0.sql
./share/postgresql/extension/gms_utility.control
./share/postgresql/extension/gms_output--1.0.sql
./share/postgresql/extension/gms_output.control
./share/postgresql/extension/gms_inaddr--1.0.sql
./share/postgresql/extension/gms_inaddr.control
./share/postgresql/extension/gms_lob--1.0.sql
./share/postgresql/extension/gms_lob.control
./share/postgresql/extension/gms_stats--1.0.sql
./share/postgresql/extension/gms_stats.control
./share/postgresql/extension/gms_tcp--1.0.sql
./share/postgresql/extension/gms_tcp.control
./share/postgresql/extension/gms_profiler--1.0.sql
./share/postgresql/extension/gms_profiler.control
./share/postgresql/extension/gms_debug--1.0.sql
./share/postgresql/extension/gms_debug.control
./share/postgresql/extension/gms_sql--1.0.sql
./share/postgresql/extension/gms_sql.control
./share/postgresql/extension/gms_xmlgen--1.0.sql
./share/postgresql/extension/gms_xmlgen.control
./share/postgresql/extension/gms_i18n--1.0.sql
./share/postgresql/extension/gms_i18n.control
./share/postgresql/timezone/GB-Eire
./share/postgresql/timezone/Turkey
./share/postgresql/timezone/Kwajalein
@ -735,6 +758,7 @@
./share/postgresql/tsearch_data/swedish.stop
./share/postgresql/tsearch_data/ispell_sample.dict
./share/postgresql/tsearch_data/italian.stop
./share/postgresql/tsearch_data/dict.utf8.xdb
./share/postgresql/information_schema.sql
./share/postgresql/timezonesets/Antarctica.txt
./share/postgresql/timezonesets/Australia.txt
@ -814,15 +838,25 @@
./lib/postgresql/dolphin.so
./lib/postgresql/age.so
./lib/postgresql/datavec.so
./lib/postgresql/chparser.so
./lib/postgresql/pg_upgrade_support.so
./lib/postgresql/java/pljava.jar
./lib/postgresql/postgres_fdw.so
./lib/postgresql/dblink.so
./lib/postgresql/gms_utility.so
./lib/postgresql/gms_lob.so
./lib/postgresql/gms_stats.so
./lib/postgresql/gms_tcp.so
./lib/postgresql/pgoutput.so
./lib/postgresql/assessment.so
./lib/postgresql/gms_compress.so
./lib/postgresql/gms_output.so
./lib/postgresql/gms_inaddr.so
./lib/postgresql/gms_profiler.so
./lib/postgresql/gms_sql.so
./lib/postgresql/gms_xmlgen.so
./lib/postgresql/gms_i18n.so
./lib/postgresql/gms_debug.so
./lib/libpljava.so
./lib/libpq.a
./lib/libpq.so

View File

@ -198,7 +198,7 @@ ENDMACRO(CHECK_CC_ENABLE)
function(GET_VERSIONSTR_FROMGIT ret)
set(PG_VERSION "9.2.4")
set(OPENGAUSS_VERSION "6.0.0")
set(OPENGAUSS_VERSION "7.0.0-RC1")
execute_process(
COMMAND ${CMAKE_SOURCE_DIR}/${openGauss}/cmake/src/buildfunction.sh --s ${PROJECT_TRUNK_DIR} OUTPUT_VARIABLE GS_VERSION_STR)
set(PG_VERSION "${PG_VERSION}" PARENT_SCOPE)

View File

@ -69,6 +69,7 @@ option(BUILD_BY_CMAKE "the BUILD_BY_CMAKE is new,used in distribute pg_regress.c
option(DEBUG_UHEAP "collect USTORE statistics" OFF)
option(MAX_ALLOC_SEGNUM "max alloc xlog seg num in extreme_rto" 4)
option(USE_TASSL "build with tassl, the old is --with-tassl" OFF)#ON
option(ENABLE_HTAP "enable HTAP in single/distribute mode,the old is --enable-htap" ON)
#No matter what to set, the old mppdb aways use ENABLE_THREAD_SAFETY=yes by default defined.
option(ENABLE_THREAD_SAFETY "enable thread safety, the old is --enable-thread-safety" ON)
@ -233,6 +234,10 @@ if(${USE_SPQ})
set(GAUSSDB_CONFIGURE "${GAUSSDB_CONFIGURE} -DUSE_SPQ")
endif()
if(${ENABLE_HTAP})
set(GAUSSDB_CONFIGURE "${GAUSSDB_CONFIGURE} -DENABLE_HTAP")
endif()
if(${USE_LDAP})
set(HAVE_LIBLDAP 1)
set(LIBS "${LIBS} -lldap")

View File

@ -714,7 +714,7 @@
#define PGXC_VERSION_NUM
/* openGauss version as a number string */
#define OPENGAUSS_VERSION_NUM_STR "6.0.0"
#define OPENGAUSS_VERSION_NUM_STR "7.0.0-RC1"
/* A string containing the version number, platform, and C compiler */
#define PG_VERSION_STR "@PG_VERSION_STR@"
@ -948,4 +948,8 @@
/* Define to 1 if you want to build opengauss rpm package on openeuler os.
* (--with-openeuler-os) */
#cmakedefine WITH_OPENEULER_OS
#cmakedefine WITH_OPENEULER_OS
/* Define to 1 if you want to use htap
* --enable-htap */
#cmakedefine ENABLE_HTAP

View File

@ -695,7 +695,7 @@
#define PG_VERSION "9.2.4"
/* openGauss version as a string */
#define OPENGAUSS_VERSION "6.0.0"
#define OPENGAUSS_VERSION "7.0.0-RC1"
/* Gaussdb version as a string*/
#define DEF_GS_VERSION "(GaussDB A 8.0.0 build 21f07aff) compiled at 2020-03-17 10:59:07 commit 7431 last mr 12039 debug"

43
configure vendored
View File

@ -758,6 +758,7 @@ enable_lite_mode
enable_relocation
enable_finance_mode
enable_mot
enable_htap
enable_bbox
enable_memory_check
enable_mysql_fdw
@ -847,6 +848,7 @@ enable_lite_mode
enable_relocation
enable_finance_mode
enable_mot
enable_htap
enable_bbox
enable_memory_check
enable_mysql_fdw
@ -1560,6 +1562,7 @@ Optional Features:
--enable-memory-check build with memory checking feature
--disable-spinlocks do not use spinlocks
--enable-debug build with debugging symbols (-g)
--enable-htap enable htap feture
--enable-qunit enable query driven unit test framework(QUnit)
--enable-profiling build with profiling enabled
--enable-coverage build with coverage testing instrumentation
@ -2209,7 +2212,7 @@ PACKAGE_VERSION='9.2.4'
# Postgres-XC 1.1devel is based on PostgreSQL 9.2.4
PACKAGE_XC_VERSION='1.1'
# openGauss is based on PostgreSQL 9.2.4 and it will be the Kernel of GaussDB database
OPENGAUSS_VERSION='6.0.0'
OPENGAUSS_VERSION='7.0.0-RC1'
cat >>confdefs.h <<_ACEOF
#define PG_VERSION "$PACKAGE_VERSION"
@ -3337,6 +3340,40 @@ else
fi
# Check whether --enable-htap was given.
if test "${enable_htap+set}" = set; then
enableval=$enable_htap;
case $enableval in
yes)
cat >>confdefs.h <<\_ACEOF
#define ENABLE_HTAP 1
_ACEOF
;;
no)
:
;;
*)
{ { $as_echo "$as_me:$LINENO: error: no argument expected for --enable-htap option" >&5
$as_echo "$as_me: error: no argument expected for --enable-htap option" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
else
enable_htap=no
fi
if test "$enable_htap" = yes; then
cat >>confdefs.h <<\_ACEOF
#define ENABLE_HTAP 1
_ACEOF
fi
if test "$enable_bbox" = yes; then
cat >>confdefs.h <<\_ACEOF
@ -3391,6 +3428,10 @@ if [[ "$(cat /etc/system-release)" =~ ^"openEuler release 22.03".* ]]; then
with_openeuler_major=yes
fi
if [[ "$(cat /etc/system-release)" =~ ^"openEuler release 24.03".* ]]; then
with_openeuler_major=yes
fi
if [[ "$(cat /etc/system-release)" =~ ^"CSIOS release 1.0".* ]]; then
with_openeuler_major=yes
fi

View File

@ -16,6 +16,7 @@ set(CMAKE_MODULE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/pg_upgrade_support
${CMAKE_CURRENT_SOURCE_DIR}/postgres_fdw
${CMAKE_CURRENT_SOURCE_DIR}/gms_output
${CMAKE_CURRENT_SOURCE_DIR}/gms_inaddr
${CMAKE_CURRENT_SOURCE_DIR}/security_plugin
${CMAKE_CURRENT_SOURCE_DIR}/dummy_seclabel
${CMAKE_CURRENT_SOURCE_DIR}/pagehack
@ -26,10 +27,32 @@ set(CMAKE_MODULE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/ndpplugin
${CMAKE_CURRENT_SOURCE_DIR}/spq_plugin
${CMAKE_CURRENT_SOURCE_DIR}/datavec
${CMAKE_CURRENT_SOURCE_DIR}/chparser
${CMAKE_CURRENT_SOURCE_DIR}/gms_stats
${CMAKE_CURRENT_SOURCE_DIR}/gms_utility
${CMAKE_CURRENT_SOURCE_DIR}/gms_profiler
${CMAKE_CURRENT_SOURCE_DIR}/gms_lob
${CMAKE_CURRENT_SOURCE_DIR}/gms_sql
${CMAKE_CURRENT_SOURCE_DIR}/gms_tcp
${CMAKE_CURRENT_SOURCE_DIR}/gms_i18n
${CMAKE_CURRENT_SOURCE_DIR}/gms_debug
)
if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON")
INCLUDE_DIRECTORIES(${LIBODBC_INCLUDE_PATH})
INCLUDE_DIRECTORIES(${LIBODBC_LIB_PATH})
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/dblink)
add_subdirectory(dblink)
endif()
if("${USE_LIBXML}" STREQUAL "ON")
INCLUDE_DIRECTORIES(${LIBXML_INCLUDE_PATH}/libxml2)
INCLUDE_DIRECTORIES(${LIBXML_LIB_PATH})
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/gms_xmlgen)
add_subdirectory(gms_xmlgen)
endif()
add_subdirectory(hstore)
add_subdirectory(test_decoding)
add_subdirectory(mppdb_decoding)
@ -40,13 +63,18 @@ if("${ENABLE_MULTIPLE_NODES}" STREQUAL "ON" OR "${ENABLE_PRIVATEGAUSS}" STREQUAL
endif()
add_subdirectory(postgres_fdw)
add_subdirectory(gms_output)
add_subdirectory(gms_inaddr)
add_subdirectory(security_plugin)
add_subdirectory(dummy_seclabel)
add_subdirectory(pagehack)
add_subdirectory(pg_xlogdump)
add_subdirectory(file_fdw)
add_subdirectory(log_fdw)
add_subdirectory(gms_utility)
add_subdirectory(gms_stats)
add_subdirectory(gms_sql)
add_subdirectory(gms_tcp)
add_subdirectory(gms_debug)
if("${ENABLE_MULTIPLE_NODES}" STREQUAL "OFF")
add_subdirectory(gc_fdw)
endif()
@ -57,4 +85,9 @@ endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/datavec)
add_subdirectory(datavec)
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/chparser)
add_subdirectory(chparser)
endif()
add_subdirectory(gms_profiler)
add_subdirectory(gms_lob)
add_subdirectory(gms_i18n)

View File

@ -57,8 +57,15 @@ SUBDIRS = \
vacuumlo \
security_plugin \
ndpplugin \
gms_utility \
gms_profiler \
gms_output
gms_inaddr \
gms_output \
gms_stats \
gms_lob \
gms_sql \
gms_i18n \
gms_debug
ifeq ($(with_openssl),yes)
SUBDIRS += sslinfo
@ -68,8 +75,10 @@ endif
ifeq ($(with_libxml),yes)
SUBDIRS += xml2
SUBDIRS += gms_xmlgen
else
ALWAYS_SUBDIRS += xml2
ALWAYS_SUBDIRS += gms_xmlgen
endif
ifeq ($(with_selinux),yes)

View File

@ -0,0 +1,23 @@
#This is the main CMAKE for build all gms_stats.
# gms_stats
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_dblink_SRC)
set(TGT_dblink_INC
${PROJECT_OPENGS_DIR}/contrib/dblink
${PROJECT_OPENGS_DIR}/contrib
)
set(dblink_DEF_OPTIONS ${MACRO_OPTIONS})
set(dblink_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(dblink_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(dblink TGT_dblink_SRC TGT_dblink_INC "${dblink_DEF_OPTIONS}" "${dblink_COMPILE_OPTIONS}" "${dblink_LINK_OPTIONS}")
target_link_libraries(dblink PUBLIC -lodbc)
target_link_directories(dblink PUBLIC ${ODBC_HOME}/lib)
set_target_properties(dblink PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dblink.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dblink--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS dblink DESTINATION lib/postgresql)

View File

@ -0,0 +1,21 @@
#This is the main CMAKE for build all gms_compress.
# gms_compress
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_gms_compress_SRC)
set(TGT_gms_compress_INC
${PROJECT_OPENGS_DIR}/contrib/gms_compress
${PROJECT_OPENGS_DIR}/contrib
)
set(gms_compress_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_compress_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_compress_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_compress TGT_gms_compress_SRC TGT_gms_compress_INC "${gms_compress_DEF_OPTIONS}" "${gms_compress_COMPILE_OPTIONS}" "${gms_compress_LINK_OPTIONS}")
set_target_properties(gms_compress PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_compress.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_compress--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_compress DESTINATION lib/postgresql)

View File

@ -0,0 +1,26 @@
# contrib/gms_compress/Makefile
MODULE_big = gms_compress
OBJS = gms_compress.o
EXTENSION = gms_compress
DATA = gms_compress--1.0.sql
exclude_option = -fPIE
override CPPFLAGS := -fstack-protector-strong $(filter-out $(exclude_option),$(CPPFLAGS))
REGRESS = gms_compress
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_compress
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25632 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

View File

@ -0,0 +1,967 @@
create extension gms_compress;
create schema gms_compress_test;
set search_path=gms_compress_test;
-- test gms_compress.compress
select gms_compress.lz_compress('123'::raw);
lz_compress
----------------------------------------------
1F8B080000000000000363540600CC52A5FA02000000
(1 row)
select gms_compress.lz_compress('df'::raw);
lz_compress
--------------------------------------------
1F8B0800000000000003BB0F00C8206EC401000000
(1 row)
select gms_compress.lz_compress('12ab56'::raw);
lz_compress
------------------------------------------------
1F8B0800000000000003135A1D0600EF3F182F03000000
(1 row)
select gms_compress.lz_compress('123'::raw, 1);
lz_compress
----------------------------------------------
1F8B080000000000040363540600CC52A5FA02000000
(1 row)
select gms_compress.lz_compress('df'::raw, 6);
lz_compress
--------------------------------------------
1F8B0800000000000003BB0F00C8206EC401000000
(1 row)
select gms_compress.lz_compress('12ab56'::raw, 9);
lz_compress
------------------------------------------------
1F8B0800000000000203135A1D0600EF3F182F03000000
(1 row)
select gms_compress.lz_compress('123'::blob);
lz_compress
----------------------------------------------
1F8B080000000000000363540600CC52A5FA02000000
(1 row)
select gms_compress.lz_compress('df'::blob);
lz_compress
--------------------------------------------
1F8B0800000000000003BB0F00C8206EC401000000
(1 row)
select gms_compress.lz_compress('12ab56'::blob);
lz_compress
------------------------------------------------
1F8B0800000000000003135A1D0600EF3F182F03000000
(1 row)
select gms_compress.lz_compress('123'::blob, 1);
lz_compress
----------------------------------------------
1F8B080000000000040363540600CC52A5FA02000000
(1 row)
select gms_compress.lz_compress('df'::blob, 6);
lz_compress
--------------------------------------------
1F8B0800000000000003BB0F00C8206EC401000000
(1 row)
select gms_compress.lz_compress('12ab56'::blob, 9);
lz_compress
------------------------------------------------
1F8B0800000000000203135A1D0600EF3F182F03000000
(1 row)
DECLARE
content BLOB;
r_content BLOB;
v_handle int;
v_raw raw;
r_raw raw;
v_bool boolean;
BEGIN
content := '123';
v_raw := '12345';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content);
RAISE NOTICE 'r_content=%', r_content;
END;
/
NOTICE: r_content=1F8B080000000000000363540600CC52A5FA02000000,r_raw=1F8B080000000000000363547605005B719C4603000000
NOTICE: r_content=1F8B080000000000000363540600CC52A5FA02000000
DECLARE
content BLOB;
r_content BLOB;
v_handle int;
v_raw raw;
r_raw raw;
v_bool boolean;
BEGIN
content := 'abc';
v_raw := 'df';
r_content := GMS_COMPRESS.LZ_COMPRESS(content, 1);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw, 9);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content, 5);
RAISE NOTICE 'r_content=%', r_content;
END;
/
NOTICE: r_content=1F8B0800000000000403E3DA0300D205E17902000000,r_raw=1F8B0800000000000203BB0F00C8206EC401000000
NOTICE: r_content=1F8B0800000000000003E3DA0300D205E17902000000
-- abnormal scenario
select gms_compress.lz_compress(null::raw);
ERROR: compressed data cannot be NULL
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress(''::raw);
ERROR: compressed data cannot be NULL
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('dfg'::raw);
ERROR: invalid hexadecimal digit: "g"
LINE 1: select gms_compress.lz_compress('dfg'::raw);
^
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('dfg'::raw, 5);
ERROR: invalid hexadecimal digit: "g"
LINE 1: select gms_compress.lz_compress('dfg'::raw, 5);
^
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('123'::raw, 0);
ERROR: compression quality must be within the range of 1 to 9
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('123'::raw, 10);
ERROR: compression quality must be within the range of 1 to 9
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress(null::blob);
ERROR: compressed data cannot be NULL
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress(''::blob);
ERROR: compressed data cannot be NULL
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('dfg'::blob);
ERROR: invalid hexadecimal digit: "g"
LINE 1: select gms_compress.lz_compress('dfg'::blob);
^
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('dfg'::blob, 5);
ERROR: invalid hexadecimal digit: "g"
LINE 1: select gms_compress.lz_compress('dfg'::blob, 5);
^
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('123'::blob, 0);
ERROR: compression quality must be within the range of 1 to 9
CONTEXT: referenced column: lz_compress
select gms_compress.lz_compress('123'::blob, 10);
ERROR: compression quality must be within the range of 1 to 9
CONTEXT: referenced column: lz_compress
DECLARE
content BLOB;
r_content BLOB;
v_raw raw;
r_raw raw;
BEGIN
content := '';
v_raw := 'dfg';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content);
RAISE NOTICE 'r_content=%', r_content;
END;
/
ERROR: invalid hexadecimal digit: "g"
CONTEXT: PL/pgSQL function inline_code_block line 7 at assignment
DECLARE
content BLOB;
r_content BLOB;
v_raw raw;
r_raw raw;
BEGIN
content := 'abc';
v_raw := 'df';
r_content := GMS_COMPRESS.LZ_COMPRESS(content, 0);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw, 10);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content, -1);
RAISE NOTICE 'r_content=%', r_content;
END;
/
ERROR: compression quality must be within the range of 1 to 9
CONTEXT: PL/pgSQL function inline_code_block line 8 at assignment
-- test gms_compress.lz_uncompress
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::raw));
lz_uncompress
---------------
0123
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::raw));
lz_uncompress
---------------
DF
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::raw));
lz_uncompress
---------------
12AB56
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::raw, 1));
lz_uncompress
---------------
0123
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::raw, 6));
lz_uncompress
---------------
DF
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::raw, 9));
lz_uncompress
---------------
12AB56
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::blob));
lz_uncompress
---------------
0123
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::blob));
lz_uncompress
---------------
DF
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::blob));
lz_uncompress
---------------
12AB56
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::blob, 1));
lz_uncompress
---------------
0123
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::blob, 6));
lz_uncompress
---------------
DF
(1 row)
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::blob, 9));
lz_uncompress
---------------
12AB56
(1 row)
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
content := '123';
v_content := '123';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
NOTICE: content=0123,r_content=1F8B080000000000000363540600CC52A5FA02000000,v_content=0123
-- abnormal scenario
select gms_compress.lz_uncompress(null::raw);
ERROR: uncompressed data cannot be NULL
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress(''::raw);
ERROR: uncompressed data cannot be NULL
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress('dfg'::raw);
ERROR: invalid hexadecimal digit: "g"
LINE 1: select gms_compress.lz_uncompress('dfg'::raw);
^
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress('123'::raw);
ERROR: too small, minimum length of gzip format is 14 bytes
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress(null::blob);
ERROR: uncompressed data cannot be NULL
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress(''::blob);
ERROR: uncompressed data cannot be NULL
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress('dfg'::blob);
ERROR: invalid hexadecimal digit: "g"
LINE 1: select gms_compress.lz_uncompress('dfg'::blob);
^
CONTEXT: referenced column: lz_uncompress
select gms_compress.lz_uncompress('123'::blob);
ERROR: too small, minimum length of gzip format is 14 bytes
CONTEXT: referenced column: lz_uncompress
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
r_content := NULL;
v_content := '123';
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
ERROR: parameter cannot be NULL
CONTEXT: SQL statement "CALL gms_compress.lz_uncompress(r_content,v_content)"
PL/pgSQL function inline_code_block line 8 at SQL statement
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
r_content := '123';
v_content := '123';
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
ERROR: too small, minimum length of gzip format is 14 bytes
CONTEXT: PL/pgSQL function gms_compress.lz_uncompress(blob,blob) line 5 at assignment
SQL statement "CALL gms_compress.lz_uncompress(r_content,v_content)"
PL/pgSQL function inline_code_block line 8 at SQL statement
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
content := '123';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
v_content := NULL;
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
ERROR: parameter cannot be NULL
CONTEXT: SQL statement "CALL gms_compress.lz_uncompress(r_content,v_content)"
PL/pgSQL function inline_code_block line 9 at SQL statement
-- test gms_compress.lz_compress_open and ms_compress.lz_compress_close
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content,5);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(2,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(3,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(4,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(5,content);
END;
/
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: NULL input for detoast datum packed
CONTEXT: PL/pgSQL function inline_code_block line 5 at assignment
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content, 0);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: compression quality must be within the range of 1 to 9
CONTEXT: PL/pgSQL function inline_code_block line 5 at assignment
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(0,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: invalid handle, it be within the range of 1 to 5
CONTEXT: PL/pgSQL function gms_compress.lz_compress_close(integer,blob) line 2 at assignment
SQL statement "CALL gms_compress.lz_compress_close(0,content)"
PL/pgSQL function inline_code_block line 6 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle+1,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: handle 2 is not be used
CONTEXT: PL/pgSQL function gms_compress.lz_compress_close(integer,blob) line 2 at assignment
SQL statement "CALL gms_compress.lz_compress_close(v_handle+1,content)"
PL/pgSQL function inline_code_block line 6 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: no handle free, the maximum number of handles is 5
CONTEXT: PL/pgSQL function inline_code_block line 10 at assignment
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(2,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(3,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(4,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(5,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: handle 1 is not be used
CONTEXT: PL/pgSQL function gms_compress.lz_compress_close(integer,blob) line 2 at assignment
SQL statement "CALL gms_compress.lz_compress_close(1,content)"
PL/pgSQL function inline_code_block line 10 at SQL statement
-- test gms_compress.lz_compress_add
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=1F8B080000000000000363540600CC52A5FA02000000
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,src);
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=1F8B0800000000000003635466540600F3008F1804000000
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,NULL);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: parameter cannot be NULL
CONTEXT: SQL statement "CALL gms_compress.lz_compress_add(v_handle,content,NULL)"
PL/pgSQL function inline_code_block line 8 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(0,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: invalid handle, it be within the range of 1 to 5
CONTEXT: SQL statement "CALL gms_compress.compress_add(handle,src)"
PL/pgSQL function gms_compress.lz_compress_add(integer,blob,raw) line 5 at PERFORM
SQL statement "CALL gms_compress.lz_compress_add(0,content,src)"
PL/pgSQL function inline_code_block line 8 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle+1,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
ERROR: handle 2 is not be used
CONTEXT: SQL statement "CALL gms_compress.compress_add(handle,src)"
PL/pgSQL function gms_compress.lz_compress_add(integer,blob,raw) line 5 at PERFORM
SQL statement "CALL gms_compress.lz_compress_add(v_handle+1,content,src)"
PL/pgSQL function inline_code_block line 8 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: content=<NULL>
-- test gms_compress.lz_uncompress_open and ms_compress.lz_uncompress_close
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
END;
/
NOTICE: v_handle=1
NOTICE: content=1F8B080000000000000363540600CC52A5FA02000000
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(3);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(4);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(5);
END;
/
NOTICE: v_handle=1
NOTICE: v_handle=2
NOTICE: v_handle=3
NOTICE: v_handle=4
NOTICE: v_handle=5
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
END;
/
ERROR: uncompress_data can not be NULL
CONTEXT: PL/pgSQL function inline_code_block line 5 at assignment
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
END;
/
ERROR: handle 1 is not be used
CONTEXT: SQL statement "CALL gms_compress.uncompress_close(handle)"
PL/pgSQL function gms_compress.lz_uncompress_close(integer) line 2 at PERFORM
SQL statement "CALL gms_compress.lz_uncompress_close(v_handle)"
PL/pgSQL function inline_code_block line 7 at PERFORM
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(0);
END;
/
ERROR: invalid handle, it be within the range of 1 to 5
CONTEXT: SQL statement "CALL gms_compress.uncompress_close(handle)"
PL/pgSQL function gms_compress.lz_uncompress_close(integer) line 2 at PERFORM
SQL statement "CALL gms_compress.lz_uncompress_close(0)"
PL/pgSQL function inline_code_block line 7 at PERFORM
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
END;
/
ERROR: handle 2 is not be used
CONTEXT: SQL statement "CALL gms_compress.uncompress_close(handle)"
PL/pgSQL function gms_compress.lz_uncompress_close(integer) line 2 at PERFORM
SQL statement "CALL gms_compress.lz_uncompress_close(2)"
PL/pgSQL function inline_code_block line 7 at PERFORM
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
END;
/
ERROR: handle 1 is a compressed handle
CONTEXT: SQL statement "CALL gms_compress.uncompress_close(handle)"
PL/pgSQL function gms_compress.lz_uncompress_close(integer) line 2 at PERFORM
SQL statement "CALL gms_compress.lz_uncompress_close(v_handle)"
PL/pgSQL function inline_code_block line 6 at PERFORM
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1, content);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(3);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(4);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(5);
END;
/
NOTICE: v_handle=1
NOTICE: v_handle=2
NOTICE: v_handle=3
NOTICE: v_handle=4
NOTICE: v_handle=5
ERROR: no handle free, the maximum number of handles is 5
CONTEXT: PL/pgSQL function inline_code_block line 16 at assignment
DECLARE
content BLOB;
v_handle int;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(3);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(4);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(5);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(6);
END;
/
ERROR: invalid handle, it be within the range of 1 to 5
CONTEXT: SQL statement "CALL gms_compress.uncompress_close(handle)"
PL/pgSQL function gms_compress.lz_uncompress_close(integer) line 2 at PERFORM
SQL statement "CALL gms_compress.lz_uncompress_close(6)"
PL/pgSQL function inline_code_block line 9 at PERFORM
-- test gms_compress.lz_uncompress_extract
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
NOTICE: content=1F8B080000000000000363540600CC52A5FA02000000
NOTICE: v_raw=0123
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(0, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
ERROR: invalid handle, it be within the range of 1 to 5
CONTEXT: PL/pgSQL function gms_compress.lz_uncompress_extract(integer,raw) line 2 at assignment
SQL statement "CALL gms_compress.lz_uncompress_extract(0,v_raw)"
PL/pgSQL function inline_code_block line 8 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(1, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
ERROR: handle 1 is not be used
CONTEXT: PL/pgSQL function gms_compress.lz_uncompress_extract(integer,raw) line 2 at assignment
SQL statement "CALL gms_compress.lz_uncompress_extract(1,v_raw)"
PL/pgSQL function inline_code_block line 7 at SQL statement
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
ERROR: no compressed data found in handle 1
CONTEXT: PL/pgSQL function gms_compress.lz_uncompress_extract(integer,raw) line 2 at assignment
SQL statement "CALL gms_compress.lz_uncompress_extract(v_handle,v_raw)"
PL/pgSQL function inline_code_block line 7 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1);
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
ERROR: no compressed data found in handle 1
CONTEXT: PL/pgSQL function gms_compress.lz_uncompress_extract(integer,raw) line 2 at assignment
SQL statement "CALL gms_compress.lz_uncompress_extract(v_handle,v_raw)"
PL/pgSQL function inline_code_block line 9 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
ERROR: too small, minimum length of gzip format is 14 bytes
CONTEXT: PL/pgSQL function gms_compress.lz_uncompress_extract(integer,raw) line 2 at assignment
SQL statement "CALL gms_compress.lz_uncompress_extract(v_handle,v_raw)"
PL/pgSQL function inline_code_block line 7 at SQL statement
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
END;
/
-- test gms_compress.lz_isopen
DECLARE
content BLOB;
v_handle int;
v_bool boolean;
BEGIN
content := '123';
v_bool := false;
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
NOTICE: v_bool=t
NOTICE: v_bool=f
DECLARE
content BLOB;
v_handle int;
v_bool boolean;
BEGIN
content := '123';
v_bool := false;
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
NOTICE: v_bool=t
NOTICE: v_bool=f
-- abnormal scenario
DECLARE
v_bool boolean;
BEGIN
v_bool := true;
v_bool := GMS_COMPRESS.ISOPEN(0);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
NOTICE: v_bool=f
DECLARE
v_bool boolean;
BEGIN
v_bool := true;
v_bool := GMS_COMPRESS.ISOPEN(1);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
NOTICE: v_bool=f
reset search_path;
drop schema gms_compress_test cascade;

View File

@ -0,0 +1,102 @@
/* contrib/gms_compress/gms_compress--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_compress" to load this file. \quit
CREATE SCHEMA gms_compress;
GRANT USAGE ON SCHEMA gms_compress TO PUBLIC;
set behavior_compat_options='proc_outparam_override';
--These functions and procedures compress data using Lempel-Ziv compression algorithm.
CREATE OR REPLACE FUNCTION gms_compress.lz_compress(src IN raw, quality IN integer := 6)
RETURNS raw PACKAGE
AS 'MODULE_PATHNAME','gms_lz_compress'
LANGUAGE C;
CREATE OR REPLACE FUNCTION gms_compress.lz_compress(src IN blob, quality IN integer := 6)
RETURNS blob PACKAGE
AS 'MODULE_PATHNAME','gms_lz_compress'
LANGUAGE C;
CREATE OR REPLACE PROCEDURE gms_compress.lz_compress(src IN blob, dst INOUT blob, quality IN integer := 6) PACKAGE as
begin
dst := gms_compress.lz_compress(src, quality);
end;
CREATE OR REPLACE FUNCTION gms_compress.lz_compress_open(src INOUT blob, quality IN integer := 6)
RETURNS integer
AS 'MODULE_PATHNAME','gms_lz_compress_open'
LANGUAGE C;
CREATE OR REPLACE FUNCTION gms_compress.lz_compress_close(handle IN integer)
RETURNS blob PACKAGE
AS '$libdir/gms_compress', 'gms_lz_compress_close'
LANGUAGE C;
CREATE OR REPLACE PROCEDURE gms_compress.lz_compress_close(handle IN integer, dst INOUT blob) PACKAGE AS
begin
dst := gms_compress.lz_compress_close(handle);
end;
CREATE OR REPLACE FUNCTION gms_compress.lz_uncompress_open(src IN blob)
RETURNS integer
AS 'MODULE_PATHNAME','gms_lz_uncompress_open'
LANGUAGE C;
CREATE OR REPLACE FUNCTION gms_compress.uncompress_close(handle IN integer)
RETURNS void
AS '$libdir/gms_compress', 'gms_lz_uncompress_close'
LANGUAGE C;
CREATE OR REPLACE PROCEDURE gms_compress.lz_uncompress_close(handle IN integer) AS
begin
gms_compress.uncompress_close(handle);
end;
CREATE OR REPLACE FUNCTION gms_compress.compress_add(handle IN integer, src IN raw)
RETURNS void PACKAGE
AS '$libdir/gms_compress', 'gms_lz_compress_add'
LANGUAGE C;
CREATE OR REPLACE PROCEDURE gms_compress.lz_compress_add(handle IN integer, dst INOUT blob, src IN raw) PACKAGE AS
begin
IF src IS NULL THEN
RAISE EXCEPTION 'parameter cannot be NULL';
END IF;
gms_compress.compress_add(handle, src);
end;
CREATE OR REPLACE FUNCTION gms_compress.uncompress_extract(handle IN integer)
RETURNS raw PACKAGE
AS '$libdir/gms_compress', 'gms_lz_uncompress_extract'
LANGUAGE C;
CREATE OR REPLACE PROCEDURE gms_compress.lz_uncompress_extract(handle IN integer, dst INOUT raw) PACKAGE AS
begin
dst := gms_compress.uncompress_extract(handle);
end;
CREATE OR REPLACE FUNCTION gms_compress.isopen(handle IN integer)
RETURNS boolean
AS '$libdir/gms_compress', 'gms_isopen'
LANGUAGE C;
----These functions and procedures decompress data using the Lempel-Ziv decompression algorithm.
CREATE OR REPLACE FUNCTION gms_compress.lz_uncompress(src IN raw)
RETURNS raw PACKAGE
AS 'MODULE_PATHNAME','gms_lz_uncompress'
LANGUAGE C;
CREATE OR REPLACE FUNCTION gms_compress.lz_uncompress(src IN blob)
RETURNS blob PACKAGE
AS 'MODULE_PATHNAME','gms_lz_uncompress'
LANGUAGE C;
CREATE OR REPLACE PROCEDURE gms_compress.lz_uncompress(src IN blob, dst INOUT blob) PACKAGE as
begin
IF src IS NULL OR dst IS NULL THEN
RAISE EXCEPTION 'parameter cannot be NULL';
END IF;
dst := gms_compress.lz_uncompress(src);
end;

View File

@ -0,0 +1,5 @@
# gms_compress extension
comment = 'provides a set of data compression utilities'
default_version = '1.0'
module_pathname = '$libdir/gms_compress'
relocatable = true

View File

@ -0,0 +1,400 @@
#include <cstdlib>
#include <zlib.h>
#include "postgres.h"
#include "knl/knl_variable.h"
#include "commands/extension.h"
#include "utils/builtins.h"
#include "utils/varbit.h"
#include "utils/memutils.h"
#include "gms_compress.h"
PG_MODULE_MAGIC;
#define MIN_QUALITY 1
#define MAX_QUALITY 9
#define MIN_HANDLE 0
#define MAX_HANDLE 4
#define HANDLE_OFFSET 1
#define UNCOMPRESS_LEVEL 0
PG_FUNCTION_INFO_V1(gms_lz_compress);
PG_FUNCTION_INFO_V1(gms_lz_uncompress);
PG_FUNCTION_INFO_V1(gms_lz_compress_open);
PG_FUNCTION_INFO_V1(gms_lz_compress_close);
PG_FUNCTION_INFO_V1(gms_lz_compress_add);
PG_FUNCTION_INFO_V1(gms_lz_uncompress_open);
PG_FUNCTION_INFO_V1(gms_lz_uncompress_close);
PG_FUNCTION_INFO_V1(gms_lz_uncompress_extract);
PG_FUNCTION_INFO_V1(gms_isopen);
static void gzip_compress(void* src, Size src_len, void** dst, Size* dst_len, int quality);
static void gzip_uncompress(void* src, Size src_len, void** dst, Size* dst_len);
static void free_context(int handle);
static inline void Check_Invalid_Input(gms_compress_context* compress_cxt, int handle);
static uint32 compress_index;
void set_extension_index(uint32 index)
{
compress_index = index;
}
void init_session_vars(void) {
RepallocSessionVarsArrayIfNecessary();
gms_compress_context* psc =
(gms_compress_context*)MemoryContextAlloc(u_sess->self_mem_cxt, sizeof(gms_compress_context));
u_sess->attr.attr_common.extension_session_vars_array[compress_index] = psc;
for (int i =0;i < UTLCOMP_MAX_HANDLE;i++) {
psc->context[i].compress_level = -1;
psc->context[i].compressed_data = NULL;
psc->context[i].uncompressed_data = NULL;
psc->context[i].used = false;
}
}
gms_compress_context* get_session_context() {
if (u_sess->attr.attr_common.extension_session_vars_array[compress_index] == NULL) {
init_session_vars();
}
return (gms_compress_context*)u_sess->attr.attr_common.extension_session_vars_array[compress_index];
}
Datum gms_lz_compress(PG_FUNCTION_ARGS)
{
if (PG_ARGISNULL(0)) {
ereport(ERROR, (errmsg("compressed data cannot be NULL")));
}
bytea *input_bytea = PG_GETARG_BYTEA_PP(0);
int quality = PG_GETARG_INT32(1);
Size src_len = VARSIZE_ANY_EXHDR(input_bytea);
bytea *dst = NULL;
Size dst_len = 0;
/* Call gzip_compress function for compression */
gzip_compress(input_bytea, src_len, (void**)&dst, &dst_len, quality);
SET_VARSIZE(dst, VARHDRSZ + dst_len);
PG_RETURN_BYTEA_P(dst);
}
Datum gms_lz_uncompress(PG_FUNCTION_ARGS)
{
if (PG_ARGISNULL(0)) {
ereport(ERROR, (errmsg("uncompressed data cannot be NULL")));
}
bytea *input_bytea = PG_GETARG_BYTEA_PP(0);
Size src_len = VARSIZE_ANY_EXHDR(input_bytea);
bytea *dst = NULL;
Size dst_len = 0;
/* Call gzip_uncompress function for uncompression */
gzip_uncompress(input_bytea, src_len, (void**)&dst, &dst_len);
SET_VARSIZE(dst, VARHDRSZ + dst_len);
PG_RETURN_TEXT_P(dst);
}
/* Open a handle and initialize it */
Datum gms_lz_compress_open(PG_FUNCTION_ARGS)
{
bytea *input_bytea = PG_GETARG_BYTEA_PP(0);
int quality = PG_GETARG_INT32(1);
if (quality < MIN_QUALITY || quality > MAX_QUALITY) {
ereport(ERROR, (errmsg("compression quality must be within the range of %d to %d", MIN_QUALITY, MAX_QUALITY)));
}
gms_compress_context *compress_cxt = get_session_context();
for(int i = 0;i < UTLCOMP_MAX_HANDLE;i++) {
if (!compress_cxt->context[i].used) {
compress_cxt->context[i].compress_level = quality;
compress_cxt->context[i].used = true;
PG_RETURN_INT32(i + HANDLE_OFFSET);
}
}
ereport(ERROR, (errmsg("no handle free, the maximum number of handles is %d", MAX_HANDLE + HANDLE_OFFSET)));
PG_RETURN_VOID();
}
/* Close a handle and compress the data back */
Datum gms_lz_compress_close(PG_FUNCTION_ARGS)
{
int handle = PG_GETARG_INT32(0) - HANDLE_OFFSET;
gms_compress_context *compress_cxt = get_session_context();
Check_Invalid_Input(compress_cxt, handle);
if (compress_cxt->context[handle].uncompressed_data == NULL) {
free_context(handle);
PG_RETURN_NULL();
}
if (compress_cxt->context[handle].compress_level == UNCOMPRESS_LEVEL) {
ereport(ERROR, (errmsg("handle %d is a uncompressed handle", handle + HANDLE_OFFSET)));
}
bytea *input_bytea = (bytea *)compress_cxt->context[handle].uncompressed_data;
Assert((char*)input_bytea + VARHDRSZ == VARDATA_ANY(input_bytea));
Size src_len = VARSIZE_ANY_EXHDR(input_bytea);
if (src_len > MaxAllocSize - VARHDRSZ) {
free_context(handle);
ereport(ERROR, (errmsg("data too long, data size cannot exceed 1GB")));
}
bytea *dst = NULL;
Size dst_len = 0;
int quality = compress_cxt->context[handle].compress_level;
/* Call gzip_compress function for compression */
gzip_compress(input_bytea, src_len, (void**)&dst, &dst_len, quality);
SET_VARSIZE(dst, VARHDRSZ + dst_len);
free_context(handle);
PG_RETURN_BYTEA_P(dst);
}
/* Open a handle and store data into it */
Datum gms_lz_compress_add(PG_FUNCTION_ARGS)
{
int handle = PG_GETARG_INT32(0) - HANDLE_OFFSET;
gms_compress_context *compress_cxt = get_session_context();
bytea *input_bytea = PG_GETARG_BYTEA_PP(1);
Size src_len = VARSIZE_ANY_EXHDR(input_bytea);
Check_Invalid_Input(compress_cxt, handle);
if (compress_cxt->context[handle].compress_level == UNCOMPRESS_LEVEL) {
ereport(ERROR, (errmsg("handle %d is a uncompressed handle", handle + HANDLE_OFFSET)));
}
if (src_len > MaxAllocSize - VARHDRSZ) {
ereport(ERROR, (errmsg("data too long, data size cannot exceed 1GB")));
}
bytea *new_data = (bytea *)compress_cxt->context[handle].uncompressed_data;
if (new_data == NULL) {
new_data = (bytea *)MemoryContextAlloc(u_sess->self_mem_cxt, src_len + VARHDRSZ);
SET_VARSIZE(new_data, src_len + VARHDRSZ);
Assert((char*)new_data + VARHDRSZ == VARDATA_ANY(new_data));
errno_t rc = memcpy_s(VARDATA(new_data), src_len, VARDATA(input_bytea), src_len);
securec_check(rc, "\0", "\0");
compress_cxt->context[handle].uncompressed_data = new_data;
} else {
Size dst_len = VARSIZE_ANY_EXHDR(new_data);
Size uncompressed_size = src_len + dst_len + VARHDRSZ;
if (uncompressed_size > MaxAllocSize) {
ereport(ERROR, (errmsg("data too long, data size cannot exceed 1GB")));
}
new_data = (bytea *)repalloc(new_data, uncompressed_size);
SET_VARSIZE(new_data, uncompressed_size);
Assert((char*)new_data + VARHDRSZ == VARDATA_ANY(new_data));
errno_t rc = memcpy_s(VARDATA(new_data) + dst_len, src_len, VARDATA(input_bytea), src_len);
securec_check(rc, "\0", "\0");
compress_cxt->context[handle].uncompressed_data = new_data;
}
PG_RETURN_VOID();
}
/* Open a handle and initialize it */
Datum gms_lz_uncompress_open(PG_FUNCTION_ARGS)
{
if (PG_ARGISNULL(0)) {
ereport(ERROR, (errmsg("uncompress_data can not be NULL")));
}
bytea *input_bytea = PG_GETARG_BYTEA_PP(0);
gms_compress_context *compress_cxt = get_session_context();
for(int i = 0;i < UTLCOMP_MAX_HANDLE;i++) {
if (!compress_cxt->context[i].used) {
compress_cxt->context[i].compressed_data = input_bytea;
compress_cxt->context[i].compress_level = UNCOMPRESS_LEVEL;
compress_cxt->context[i].used = true;
PG_RETURN_INT32(i + HANDLE_OFFSET);
}
}
ereport(ERROR, (errmsg("no handle free, the maximum number of handles is %d", MAX_HANDLE + HANDLE_OFFSET)));
PG_RETURN_VOID();
}
/* Close and free the handle */
Datum gms_lz_uncompress_close(PG_FUNCTION_ARGS)
{
int handle = PG_GETARG_INT32(0) - HANDLE_OFFSET;
gms_compress_context *compress_cxt = get_session_context();
Check_Invalid_Input(compress_cxt, handle);
if (compress_cxt->context[handle].compress_level != UNCOMPRESS_LEVEL) {
ereport(ERROR, (errmsg("handle %d is a compressed handle", handle + HANDLE_OFFSET)));
}
free_context(handle);
PG_RETURN_VOID();
}
/* Open a handle and uncompress the data back */
Datum gms_lz_uncompress_extract(PG_FUNCTION_ARGS)
{
int handle = PG_GETARG_INT32(0) - HANDLE_OFFSET;
gms_compress_context *compress_cxt = get_session_context();
Check_Invalid_Input(compress_cxt, handle);
if (compress_cxt->context[handle].compressed_data == NULL) {
ereport(ERROR, (errmsg("no compressed data found in handle %d", handle + HANDLE_OFFSET)));
}
if (compress_cxt->context[handle].compress_level != UNCOMPRESS_LEVEL) {
ereport(ERROR, (errmsg("handle %d is a compressed handle", handle + HANDLE_OFFSET)));
}
bytea *src = (bytea *)compress_cxt->context[handle].compressed_data;
Size src_len = VARSIZE_ANY_EXHDR(src);
Size dst_len = 0;
bytea *dst = NULL;
compress_cxt->context[handle].compressed_data = NULL;
gzip_uncompress(src, src_len, (void**)&dst, &dst_len);
SET_VARSIZE(dst, VARHDRSZ + dst_len);
PG_RETURN_BYTEA_P(dst);
}
/* Check if a handle has been opened */
Datum gms_isopen(PG_FUNCTION_ARGS)
{
int handle = PG_GETARG_INT32(0) - HANDLE_OFFSET;
if (handle < MIN_HANDLE || handle > MAX_HANDLE) {
return false;
}
return get_session_context()->context[handle].used;
}
/* Using the zlib library and Lemoel Xiv algorithm to implement compression functionality */
static void gzip_compress(void* src, Size src_len, void** dst, Size* dst_len, int quality)
{
/* The compression quality is limited between 1 and 9 */
if (quality < MIN_QUALITY || quality > MAX_QUALITY) {
ereport(ERROR, (errmsg("compression quality must be within the range of %d to %d", MIN_QUALITY, MAX_QUALITY)));
}
bytea *input_bytea = (bytea*)src;
Size compressed_size = compressBound(src_len) + GZIP_COMPRESS_EXTRA_LENGTH;
bytea *result = (bytea*)palloc(VARHDRSZ + compressed_size);
SET_VARSIZE(result, VARHDRSZ + compressed_size);
z_stream c_stream;
c_stream.zalloc = NULL;
c_stream.zfree = NULL;
c_stream.opaque = NULL;
// MAX_WBITS + 16 for gzip
if (deflateInit2(&c_stream, quality, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK) {
pfree_ext(result);
ereport(ERROR, (errmsg("zlib compression initialization failed")));
}
c_stream.avail_out = compressed_size; // output size
c_stream.next_out = (Bytef*)VARDATA_ANY(result); // output buffer
c_stream.avail_in = src_len; // input size
c_stream.next_in = (Bytef*)VARDATA_ANY(input_bytea); // input buffer
if (deflate(&c_stream, Z_FINISH) != Z_STREAM_END) {
pfree_ext(result);
ereport(ERROR, (errmsg("zlib compression failed")));
}
if (deflateEnd(&c_stream) != Z_OK) {
pfree_ext(result);
ereport(ERROR, (errmsg("zlib cleaning up compression stream failed")));
}
*dst_len = c_stream.total_out;
*dst = result;
}
/* Using the zlib library and Lemoel Xiv algorithm to implement uncompression functionality */
static void gzip_uncompress(void* src, Size src_len, void** dst, Size* dst_len)
{
bytea *input_bytea = (bytea*)src;
if (src_len < GZIP_MIN_LENGTH) {
ereport(ERROR, (errmsg("too small, minimum length of gzip format is %d bytes", GZIP_MIN_LENGTH)));
}
unsigned char *gzip_content = (unsigned char*)VARDATA_ANY(input_bytea);
if (gzip_content[0] != GZIP_HEADER_1 || gzip_content[1] != GZIP_HEADER_2) {
ereport(ERROR, (errmsg("data corrupt, invalid compressed data head")));
}
uint4 uncompressed_size = *(uint4*)(gzip_content + src_len - sizeof(int));
#ifdef WORDS_BIGENDIAN
uncompressed_size = BSWAP32(uncompressed_size);
#endif
if (uncompressed_size > MaxAllocSize - VARHDRSZ) {
ereport(ERROR, (errmsg("data too long, data size cannot exceed 1GB")));
}
bytea *result = (bytea*)palloc(VARHDRSZ + uncompressed_size);
SET_VARSIZE(result, VARHDRSZ + uncompressed_size);
z_stream d_stream = { 0 };
d_stream.zalloc = NULL;
d_stream.zfree = NULL;
d_stream.opaque = NULL;
d_stream.next_in = (Bytef*)VARDATA_ANY(input_bytea);
d_stream.avail_in = src_len;
d_stream.avail_out = VARSIZE_ANY_EXHDR(result);
d_stream.next_out = (Bytef*)VARDATA_ANY(result);
// MAX_WBITS + 16 for gzip
if (inflateInit2(&d_stream, 16 + MAX_WBITS) != Z_OK) {
pfree_ext(result);
ereport(ERROR, (errmsg("zlib uncompression initialization failed")));
}
if (inflate(&d_stream, Z_FINISH) != Z_STREAM_END) {
pfree_ext(result);
ereport(ERROR, (errmsg("zlib uncompression failed")));
}
if (inflateEnd(&d_stream) != Z_OK) {
pfree_ext(result);
ereport(ERROR, (errmsg("zlib cleaning up uncompression stream failed")));
}
*dst_len = d_stream.total_out;
*dst = result;
return;
}
/**
* Because compressed_data is the data source address and
* uncompressed_data is the newly created data address,
* it is necessary to point compressed_data to null and release uncompressed_data
*/
static void free_context(int handle)
{
if (handle < MIN_HANDLE || handle > MAX_HANDLE)
{
return;
}
gms_compress_context *compress_cxt = get_session_context();
compress_cxt->context[handle].compressed_data =NULL;
pfree_ext(compress_cxt->context[handle].uncompressed_data);
compress_cxt->context[handle].compress_level = -1;
compress_cxt->context[handle].used = false;
return;
}
static inline void Check_Invalid_Input(gms_compress_context* compress_cxt, int handle) {
if (handle < MIN_HANDLE || handle > MAX_HANDLE) {
ereport(ERROR, (errmsg("invalid handle, it be within the range of %d to %d",
MIN_HANDLE + HANDLE_OFFSET, MAX_HANDLE + HANDLE_OFFSET)));
}
if (!compress_cxt->context[handle].used) {
ereport(ERROR, (errmsg("handle %d is not be used", handle + HANDLE_OFFSET)));
}
}

View File

@ -0,0 +1,36 @@
#ifndef __GMS_COMPRESS__
#define __GMS_COMPRESS__
#include "postgres.h"
#define GZIP_COMPRESS_EXTRA_LENGTH 18
#define GZIP_MIN_LENGTH 14
#define GZIP_HEADER_1 ((unsigned char)0x1f)
#define GZIP_HEADER_2 ((unsigned char)0x8b)
#define UTLCOMP_MAX_HANDLE 5
typedef struct gms_context {
void *uncompressed_data; /* data to be compressed */
void *compressed_data; /* data after compressed or data to be uncompressed */
int2 compress_level; /* 0 for uncompress, 1~9 for compress */
bool used;
} gms_context;
typedef struct gms_compress_context {
gms_context context[UTLCOMP_MAX_HANDLE];
} gms_compress_context;
extern "C" Datum gms_lz_compress(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_uncompress(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_compress_open(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_compress_close(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_compress_add(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_uncompress_open(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_uncompress_close(PG_FUNCTION_ARGS);
extern "C" Datum gms_lz_uncompress_extract(PG_FUNCTION_ARGS);
extern "C" Datum gms_isopen(PG_FUNCTION_ARGS);
extern "C" void set_extension_index(uint32 index);
extern "C" void init_session_vars(void);
#endif // __GMS_COMPRESS__

View File

@ -0,0 +1,715 @@
create extension gms_compress;
create schema gms_compress_test;
set search_path=gms_compress_test;
-- test gms_compress.compress
select gms_compress.lz_compress('123'::raw);
select gms_compress.lz_compress('df'::raw);
select gms_compress.lz_compress('12ab56'::raw);
select gms_compress.lz_compress('123'::raw, 1);
select gms_compress.lz_compress('df'::raw, 6);
select gms_compress.lz_compress('12ab56'::raw, 9);
select gms_compress.lz_compress('123'::blob);
select gms_compress.lz_compress('df'::blob);
select gms_compress.lz_compress('12ab56'::blob);
select gms_compress.lz_compress('123'::blob, 1);
select gms_compress.lz_compress('df'::blob, 6);
select gms_compress.lz_compress('12ab56'::blob, 9);
DECLARE
content BLOB;
r_content BLOB;
v_handle int;
v_raw raw;
r_raw raw;
v_bool boolean;
BEGIN
content := '123';
v_raw := '12345';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content);
RAISE NOTICE 'r_content=%', r_content;
END;
/
DECLARE
content BLOB;
r_content BLOB;
v_handle int;
v_raw raw;
r_raw raw;
v_bool boolean;
BEGIN
content := 'abc';
v_raw := 'df';
r_content := GMS_COMPRESS.LZ_COMPRESS(content, 1);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw, 9);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content, 5);
RAISE NOTICE 'r_content=%', r_content;
END;
/
-- abnormal scenario
select gms_compress.lz_compress(null::raw);
select gms_compress.lz_compress(''::raw);
select gms_compress.lz_compress('dfg'::raw);
select gms_compress.lz_compress('dfg'::raw, 5);
select gms_compress.lz_compress('123'::raw, 0);
select gms_compress.lz_compress('123'::raw, 10);
select gms_compress.lz_compress(null::blob);
select gms_compress.lz_compress(''::blob);
select gms_compress.lz_compress('dfg'::blob);
select gms_compress.lz_compress('dfg'::blob, 5);
select gms_compress.lz_compress('123'::blob, 0);
select gms_compress.lz_compress('123'::blob, 10);
DECLARE
content BLOB;
r_content BLOB;
v_raw raw;
r_raw raw;
BEGIN
content := '';
v_raw := 'dfg';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content);
RAISE NOTICE 'r_content=%', r_content;
END;
/
DECLARE
content BLOB;
r_content BLOB;
v_raw raw;
r_raw raw;
BEGIN
content := 'abc';
v_raw := 'df';
r_content := GMS_COMPRESS.LZ_COMPRESS(content, 0);
r_raw := GMS_COMPRESS.LZ_COMPRESS(v_raw, 10);
RAISE NOTICE 'r_content=%,r_raw=%', r_content, r_raw;
r_content := '111';
GMS_COMPRESS.LZ_COMPRESS(content, r_content, -1);
RAISE NOTICE 'r_content=%', r_content;
END;
/
-- test gms_compress.lz_uncompress
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::raw));
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::raw));
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::raw));
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::raw, 1));
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::raw, 6));
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::raw, 9));
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::blob));
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::blob));
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::blob));
select gms_compress.lz_uncompress(gms_compress.lz_compress('123'::blob, 1));
select gms_compress.lz_uncompress(gms_compress.lz_compress('df'::blob, 6));
select gms_compress.lz_uncompress(gms_compress.lz_compress('12ab56'::blob, 9));
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
content := '123';
v_content := '123';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
-- abnormal scenario
select gms_compress.lz_uncompress(null::raw);
select gms_compress.lz_uncompress(''::raw);
select gms_compress.lz_uncompress('dfg'::raw);
select gms_compress.lz_uncompress('123'::raw);
select gms_compress.lz_uncompress(null::blob);
select gms_compress.lz_uncompress(''::blob);
select gms_compress.lz_uncompress('dfg'::blob);
select gms_compress.lz_uncompress('123'::blob);
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
r_content := NULL;
v_content := '123';
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
r_content := '123';
v_content := '123';
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
DECLARE
content BLOB;
r_content BLOB;
v_content BLOB;
v_bool boolean;
BEGIN
content := '123';
r_content := GMS_COMPRESS.LZ_COMPRESS(content);
v_content := NULL;
GMS_COMPRESS.LZ_UNCOMPRESS(r_content, v_content);
RAISE NOTICE 'content=%,r_content=%,v_content=%', content, r_content, v_content;
END;
/
-- test gms_compress.lz_compress_open and ms_compress.lz_compress_close
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content,5);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(2,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(3,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(4,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(5,content);
END;
/
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content, 0);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(0,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle+1,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(2,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(3,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(4,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(5,content);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
-- test gms_compress.lz_compress_add
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,src);
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle,content,NULL);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(0,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
src raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
src := '123';
GMS_COMPRESS.LZ_COMPRESS_ADD(v_handle+1,content,src);
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1,content);
RAISE NOTICE 'content=%', content;
END;
/
-- test gms_compress.lz_uncompress_open and ms_compress.lz_uncompress_close
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(3);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(4);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(5);
END;
/
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(0);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1, content);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
RAISE NOTICE 'v_handle=%', v_handle;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(3);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(4);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(5);
END;
/
DECLARE
content BLOB;
v_handle int;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(2);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(3);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(4);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(5);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(6);
END;
/
-- test gms_compress.lz_uncompress_extract
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
-- abnormal scenario
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(0, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(1, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_COMPRESS_CLOSE(1);
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
END;
/
DECLARE
content BLOB;
v_handle int;
v_raw raw;
BEGIN
content := '123';
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
GMS_COMPRESS.LZ_UNCOMPRESS_EXTRACT(v_handle, v_raw);
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
RAISE NOTICE 'content=%', content;
RAISE NOTICE 'v_raw=%', v_raw;
END;
/
DECLARE
content BLOB;
BEGIN
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(1);
END;
/
-- test gms_compress.lz_isopen
DECLARE
content BLOB;
v_handle int;
v_bool boolean;
BEGIN
content := '123';
v_bool := false;
v_handle := GMS_COMPRESS.LZ_COMPRESS_OPEN(content);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
GMS_COMPRESS.LZ_COMPRESS_CLOSE(v_handle,content);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
DECLARE
content BLOB;
v_handle int;
v_bool boolean;
BEGIN
content := '123';
v_bool := false;
content := GMS_COMPRESS.LZ_COMPRESS(content);
v_handle := GMS_COMPRESS.LZ_UNCOMPRESS_OPEN(content);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
GMS_COMPRESS.LZ_UNCOMPRESS_CLOSE(v_handle);
v_bool := GMS_COMPRESS.ISOPEN(v_handle);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
-- abnormal scenario
DECLARE
v_bool boolean;
BEGIN
v_bool := true;
v_bool := GMS_COMPRESS.ISOPEN(0);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
DECLARE
v_bool boolean;
BEGIN
v_bool := true;
v_bool := GMS_COMPRESS.ISOPEN(1);
RAISE NOTICE 'v_bool=%', v_bool;
END;
/
reset search_path;
drop schema gms_compress_test cascade;

View File

@ -0,0 +1,21 @@
#This is the main CMAKE for build all gms_debug.
# gms_debug
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_gms_debug_SRC)
set(TGT_gms_debug_INC
${PROJECT_OPENGS_DIR}/contrib/gms_debug
${PROJECT_OPENGS_DIR}/contrib
)
set(gms_debug_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_debug_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_debug_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_debug TGT_gms_debug_SRC TGT_gms_debug_INC "${gms_debug_DEF_OPTIONS}" "${gms_debug_COMPILE_OPTIONS}" "${gms_debug_LINK_OPTIONS}")
set_target_properties(gms_debug PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_debug.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_debug--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_debug DESTINATION lib/postgresql)

View File

@ -0,0 +1,29 @@
# contrib/gms_debug/Makefile
MODULE_big = gms_debug
OBJS = gms_debug.o
EXTENSION = gms_debug
DATA = gms_debug--1.0.sql
exclude_option = -fPIE
override CPPFLAGS := -fstack-protector-strong $(filter-out $(exclude_option),$(CPPFLAGS))
REGRESS = gms_debug
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_debug
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25632 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif
gms_debug.o: gms_debug.cpp

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

View File

@ -0,0 +1,269 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test1;
CREATE or REPLACE FUNCTION gms_breakpoint(funcname text, lineno int)
returns void as $$
declare
pro_info gms_debug.program_info;
bkline binary_integer;
ret binary_integer;
begin
pro_info.name := funcname;
ret := gms_debug.set_breakpoint(pro_info, lineno, bkline,1,1);
RAISE NOTICE 'ret= %', ret;
RAISE NOTICE 'ret= %', bkline;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_info()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.get_runtime_info(1, run_info);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
attach_session
----------------
(1 row)
select pg_sleep(3);
pg_sleep
----------
(1 row)
select gms_breakpoint('test_debug', 0); -- negative
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_breakpoint('test_debug', 15); -- ok
NOTICE: ret= 1
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_breakpoint('test_debug', 17); -- invalid
NOTICE: ret= 2
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_breakpoint('test_debug', 22); -- ok
NOTICE: ret= 3
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_breakpoint('test_debug', 15); -- ok
WARNING: the given line number already contains a valid breakpoint.
CONTEXT: SQL statement "CALL gms_debug.add_breakpoint(proid,line#,breakpoint#,fuzzy,iterations,sts)"
PL/pgSQL function gms_debug.set_breakpoint(gms_debug.program_info,integer,integer,integer) line 8 at SQL statement
SQL statement "CALL gms_debug.set_breakpoint(pro_info,lineno,bkline,1,1)"
PL/pgSQL function gms_breakpoint(text,integer) line 8 at assignment
referenced column: gms_breakpoint
NOTICE: ret= -1
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= -3
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 16
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 19
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 19
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= 3
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 22
CONTEXT: referenced column: gms_next
NOTICE: reason= 2
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 46
CONTEXT: referenced column: gms_continue
NOTICE: reason= 0
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 46
CONTEXT: referenced column: gms_continue
NOTICE: reason= 0
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_debug.detach_session();
connection to server was lost

View File

@ -0,0 +1,144 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test2;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
attach_session
----------------
(1 row)
select pg_sleep(3);
pg_sleep
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 3
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 4
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 5
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 0
CONTEXT: referenced column: gms_continue
NOTICE: reason= 0
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_debug.detach_session();
detach_session
----------------
(1 row)

View File

@ -0,0 +1,144 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test3;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
attach_session
----------------
(1 row)
select pg_sleep(3);
pg_sleep
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 6
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 10
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 14
CONTEXT: referenced column: gms_continue
NOTICE: reason= 0
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 6
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_debug.detach_session();
detach_session
----------------
(1 row)

View File

@ -0,0 +1,192 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test4;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
attach_session
----------------
(1 row)
select pg_sleep(3);
pg_sleep
----------
(1 row)
select gms_step();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_step
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_step
NOTICE: line= 6
CONTEXT: referenced column: gms_step
NOTICE: reason= 3
CONTEXT: referenced column: gms_step
NOTICE: ret= 0
CONTEXT: referenced column: gms_step
gms_step
----------
(1 row)
select gms_step();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_step
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_step
NOTICE: line= 7
CONTEXT: referenced column: gms_step
NOTICE: reason= 3
CONTEXT: referenced column: gms_step
NOTICE: ret= 0
CONTEXT: referenced column: gms_step
gms_step
----------
(1 row)
select gms_step();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_step
NOTICE: stackdepth= 1
CONTEXT: referenced column: gms_step
NOTICE: line= 15
CONTEXT: referenced column: gms_step
NOTICE: reason= 3
CONTEXT: referenced column: gms_step
NOTICE: ret= 0
CONTEXT: referenced column: gms_step
gms_step
----------
(1 row)
select gms_step();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_step
NOTICE: stackdepth= 1
CONTEXT: referenced column: gms_step
NOTICE: line= 16
CONTEXT: referenced column: gms_step
NOTICE: reason= 3
CONTEXT: referenced column: gms_step
NOTICE: ret= 0
CONTEXT: referenced column: gms_step
gms_step
----------
(1 row)
select gms_step();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_step
NOTICE: stackdepth= 1
CONTEXT: referenced column: gms_step
NOTICE: line= 19
CONTEXT: referenced column: gms_step
NOTICE: reason= 3
CONTEXT: referenced column: gms_step
NOTICE: ret= 0
CONTEXT: referenced column: gms_step
gms_step
----------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 14
CONTEXT: referenced column: gms_continue
NOTICE: reason= 3
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 15
CONTEXT: referenced column: gms_continue
NOTICE: reason= 0
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_debug.detach_session();
detach_session
----------------
(1 row)

View File

@ -0,0 +1,200 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test5;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_finish()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 8, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
attach_session
----------------
(1 row)
select pg_sleep(3);
pg_sleep
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 6
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 7
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_next();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_next
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_next
NOTICE: line= 14
CONTEXT: referenced column: gms_next
NOTICE: reason= 6
CONTEXT: referenced column: gms_next
NOTICE: ret= 0
CONTEXT: referenced column: gms_next
gms_next
----------
(1 row)
select gms_step();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_step
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_step
NOTICE: line= 15
CONTEXT: referenced column: gms_step
NOTICE: reason= 3
CONTEXT: referenced column: gms_step
NOTICE: ret= 0
CONTEXT: referenced column: gms_step
gms_step
----------
(1 row)
select gms_finish();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_finish
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_finish
NOTICE: line= 15
CONTEXT: referenced column: gms_finish
NOTICE: reason= 0
CONTEXT: referenced column: gms_finish
NOTICE: ret= 0
CONTEXT: referenced column: gms_finish
gms_finish
------------
(1 row)
select gms_finish();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_finish
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_finish
NOTICE: line= 15
CONTEXT: referenced column: gms_finish
NOTICE: reason= 0
CONTEXT: referenced column: gms_finish
NOTICE: ret= 0
CONTEXT: referenced column: gms_finish
gms_finish
------------
(1 row)
select gms_debug.detach_session();
connection to server was lost

View File

@ -0,0 +1,177 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test6;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_breakpoint(funcname text, lineno int)
returns void as $$
declare
pro_info gms_debug.program_info;
bkline binary_integer;
ret binary_integer;
begin
pro_info.name := funcname;
ret := gms_debug.set_breakpoint(pro_info, lineno, bkline,1,1);
RAISE NOTICE 'ret= %', ret;
RAISE NOTICE 'ret= %', bkline;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_finish()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 8, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
attach_session
----------------
(1 row)
select pg_sleep(3);
pg_sleep
----------
(1 row)
select gms_breakpoint('test_debug', 31);
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_breakpoint('test_debug', 44);
NOTICE: ret= 1
CONTEXT: referenced column: gms_breakpoint
NOTICE: ret= 0
CONTEXT: referenced column: gms_breakpoint
gms_breakpoint
----------------
(1 row)
select gms_finish();
NOTICE: breakpoint= 0
CONTEXT: referenced column: gms_finish
NOTICE: stackdepth= 1
CONTEXT: referenced column: gms_finish
NOTICE: line= 31
CONTEXT: referenced column: gms_finish
NOTICE: reason= 2
CONTEXT: referenced column: gms_finish
NOTICE: ret= 0
CONTEXT: referenced column: gms_finish
gms_finish
------------
(1 row)
select gms_finish();
NOTICE: breakpoint= 1
CONTEXT: referenced column: gms_finish
NOTICE: stackdepth= 1
CONTEXT: referenced column: gms_finish
NOTICE: line= 44
CONTEXT: referenced column: gms_finish
NOTICE: reason= 2
CONTEXT: referenced column: gms_finish
NOTICE: ret= 0
CONTEXT: referenced column: gms_finish
gms_finish
------------
(1 row)
select gms_finish();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_finish
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_finish
NOTICE: line= 14
CONTEXT: referenced column: gms_finish
NOTICE: reason= 3
CONTEXT: referenced column: gms_finish
NOTICE: ret= 0
CONTEXT: referenced column: gms_finish
gms_finish
------------
(1 row)
select gms_continue();
NOTICE: breakpoint= -1
CONTEXT: referenced column: gms_continue
NOTICE: stackdepth= 0
CONTEXT: referenced column: gms_continue
NOTICE: line= 15
CONTEXT: referenced column: gms_continue
NOTICE: reason= 0
CONTEXT: referenced column: gms_continue
NOTICE: ret= 0
CONTEXT: referenced column: gms_continue
gms_continue
--------------
(1 row)
select gms_debug.detach_session();
detach_session
----------------
(1 row)

View File

@ -0,0 +1,181 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test1 cascade;
NOTICE: schema "gms_debugger_test1" does not exist, skipping
create schema gms_debugger_test1;
set search_path = gms_debugger_test1;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
create table show_code_table(lineno int, code text, canBreak bool);
do $$
declare
funcoid oid;
begin
select oid from pg_proc into funcoid where proname = 'test_debug';
INSERT INTO show_code_table SELECT * FROM dbe_pldebugger.info_code(funcoid);
end;
$$;
select * from show_code_table;
lineno | code | canbreak
--------+----------------------------------------------------------------------------------+----------
| CREATE OR REPLACE FUNCTION gms_debugger_test1.test_debug(x integer) | f
| RETURNS SETOF test | f
| LANGUAGE plpgsql | f
| NOT FENCED NOT SHIPPABLE | f
1 | AS $function$ | f
2 | DECLARE | f
3 | sql_stmt VARCHAR2(500); | f
4 | r test%rowtype; | f
5 | rec record; | f
6 | b_tmp text; | f
7 | cnt int; | f
8 | a_tmp int; | f
9 | cur refcursor; | f
10 | n_tmp NUMERIC(24,6); | f
11 | t_tmp tsquery; | f
12 | CURSOR cur_arg(criterion INTEGER) IS | f
13 | SELECT * FROM test WHERE a < criterion; | f
14 | BEGIN | f
15 | cnt := 0; | t
16 | FOR r IN SELECT * FROM test | t
17 | WHERE a > x | f
18 | LOOP | f
19 | RETURN NEXT r; | t
20 | END LOOP; | f
21 | | f
22 | FOR rec in SELECT * FROM test | t
23 | WHERE a < x | f
24 | LOOP | f
25 | RETURN NEXT rec; | t
26 | END LOOP; | f
27 | | f
28 | FORALL index_1 IN 0..1 | t
29 | INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1'); | t
30 | | f
31 | SELECT b FROM test where a = 7 INTO b_tmp; | t
32 | sql_stmt := 'select a from test where b = :1;'; | t
33 | OPEN cur FOR sql_stmt USING b_tmp; | t
34 | IF cur%isopen then LOOP | t
35 | FETCH cur INTO a_tmp; | t
36 | EXIT WHEN cur%notfound; | t
37 | END LOOP; | f
38 | END IF; | f
39 | CLOSE cur; | t
40 | WHILE cnt < 3 LOOP | t
41 | cnt := cnt + 1; | t
42 | END LOOP; | f
43 | | f
44 | RAISE INFO 'cnt is %', cnt; | t
45 | | f
46 | RETURN; | t
47 | | f
48 | END | f
49 | $function$; | f
(53 rows)
-- attach fail (target not turned on)
select * from gms_debug.attach_session('datanode1-0');
ERROR: target session should be init first.
-- turn off without turn on
select * from gms_debug.debug_off();
ERROR: target session should be init first
select * from gms_debug.initialize();
initialize
-------------
datanode1-0
(1 row)
select pg_sleep(1);
pg_sleep
----------
(1 row)
-- start debug - 1st run
select * from test_debug(4);
INFO: cnt is 3
a | b | c
---+---------------------+--------------------------
5 | Fasting | Sat Mar 02 00:00:00 2030
7 | Treasures in Heaven | Mon Apr 02 00:00:00 2040
2 | Giving to the Needy | Sun Feb 02 00:00:00 2020
3 | Prayer | Thu Dec 02 00:00:00 2021
(4 rows)
-- start debug - 2nd run - to be aborted
select * from test_debug(4);
INFO: cnt is 3
a | b | c
---+-----------------------+--------------------------
5 | Fasting | Sat Mar 02 00:00:00 2030
7 | Treasures in Heaven | Mon Apr 02 00:00:00 2040
2 | Giving to the Needy | Sun Feb 02 00:00:00 2020
3 | Prayer | Thu Dec 02 00:00:00 2021
0 | Happy Children's Day! | Tue Jun 01 00:00:00 2021
1 | Happy Children's Day! | Tue Jun 01 00:00:00 2021
(6 rows)
drop schema gms_debugger_test1 cascade;
NOTICE: drop cascades to 8 other objects
DETAIL: drop cascades to table test
drop cascades to function test_debug(integer)
drop cascades to table show_code_table
drop cascades to function gms_breakpoint(text,integer)
drop cascades to function gms_continue()
drop cascades to function gms_next()
drop cascades to function gms_step()
drop cascades to function gms_info()

View File

@ -0,0 +1,46 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test2 cascade;
NOTICE: schema "gms_debugger_test2" does not exist, skipping
create schema gms_debugger_test2;
set search_path = gms_debugger_test2;
-- commit/rollback in procedure
create table tb1(a int);
create or replace procedure test_debug2 as
begin
insert into tb1 values (1000);
commit;
insert into tb1 values (2000);
rollback;
end;
/
-- start debug
select * from gms_debug.initialize();
initialize
-------------
datanode1-0
(1 row)
select pg_sleep(1);
pg_sleep
----------
(1 row)
-- start debug - 1st run
select * from test_debug2();
test_debug2
-------------
(1 row)
-- start debug - 2nd run - to be aborted
select * from test_debug2();
ERROR: receive abort message
CONTEXT: PL/pgSQL function test_debug2() line 2 at SQL statement
drop schema gms_debugger_test2 cascade;
NOTICE: drop cascades to 4 other objects
DETAIL: drop cascades to table tb1
drop cascades to function test_debug2()
drop cascades to function gms_continue()
drop cascades to function gms_next()

View File

@ -0,0 +1,53 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test3 cascade;
NOTICE: schema "gms_debugger_test3" does not exist, skipping
create schema gms_debugger_test3;
set search_path = gms_debugger_test3;
-- test for implicit variables
CREATE OR REPLACE function test_debug3(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
ELSE
b := 999;
END CASE;
raise info 'pi_return : %',pi_return ;
return b;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
initialize
-------------
datanode1-0
(1 row)
select pg_sleep(1);
pg_sleep
----------
(1 row)
-- start debug - 1st run
select * from test_debug3(1);
test_debug3
-------------
101
(1 row)
-- start debug - 2nd run - to be aborted
select * from test_debug3(1);
ERROR: receive abort message
CONTEXT: PL/pgSQL function test_debug3(integer) line 13 at assignment
drop schema gms_debugger_test3 cascade;
NOTICE: drop cascades to 3 other objects
DETAIL: drop cascades to function test_debug3(integer)
drop cascades to function gms_next()
drop cascades to function gms_continue()

View File

@ -0,0 +1,114 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test4 cascade;
NOTICE: schema "gms_debugger_test4" does not exist, skipping
create schema gms_debugger_test4;
set search_path = gms_debugger_test4;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
-- test for step into
CREATE OR REPLACE FUNCTION test_debug4(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
call test_debug(a);
ELSE
b := 999;
END CASE;
return b;
raise info 'pi_return : %',pi_return ;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
initialize
-------------
datanode1-0
(1 row)
select pg_sleep(1);
pg_sleep
----------
(1 row)
select * from test_debug4(1);
INFO: cnt is 3
CONTEXT: SQL statement "call test_debug(a)"
PL/pgSQL function test_debug4(integer) line 7 at SQL statement
test_debug4
-------------
101
(1 row)
-- test with client error in exception
select * from test_debug4(1);
ERROR: receive abort message
CONTEXT: PL/pgSQL function test_debug4(integer) line 14 at assignment
drop schema gms_debugger_test4 cascade;
NOTICE: drop cascades to 5 other objects
DETAIL: drop cascades to table test
drop cascades to function test_debug(integer)
drop cascades to function test_debug4(integer)
drop cascades to function gms_step()
drop cascades to function gms_continue()

View File

@ -0,0 +1,122 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test5 cascade;
NOTICE: schema "gms_debugger_test5" does not exist, skipping
create schema gms_debugger_test5;
set search_path = gms_debugger_test5;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
-- test for step into
CREATE OR REPLACE FUNCTION test_debug4(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
call test_debug(a);
ELSE
b := 999;
END CASE;
return b;
raise info 'pi_return : %',pi_return ;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
initialize
-------------
datanode1-0
(1 row)
select pg_sleep(1);
pg_sleep
----------
(1 row)
select * from test_debug4(1);
INFO: cnt is 3
CONTEXT: SQL statement "call test_debug(a)"
PL/pgSQL function test_debug4(integer) line 7 at SQL statement
test_debug4
-------------
101
(1 row)
-- test with client error in exception
select * from test_debug4(1);
INFO: cnt is 3
CONTEXT: SQL statement "call test_debug(a)"
PL/pgSQL function test_debug4(integer) line 7 at SQL statement
test_debug4
-------------
101
(1 row)
drop schema gms_debugger_test5 cascade;
NOTICE: drop cascades to 7 other objects
DETAIL: drop cascades to table test
drop cascades to function test_debug(integer)
drop cascades to function test_debug4(integer)
drop cascades to function gms_continue()
drop cascades to function gms_step()
drop cascades to function gms_next()
drop cascades to function gms_finish()

View File

@ -0,0 +1,114 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test6 cascade;
NOTICE: schema "gms_debugger_test6" does not exist, skipping
create schema gms_debugger_test6;
set search_path = gms_debugger_test6;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
-- test for step into
CREATE OR REPLACE FUNCTION test_debug4(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
call test_debug(a);
ELSE
b := 999;
END CASE;
return b;
raise info 'pi_return : %',pi_return ;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
initialize
-------------
datanode1-0
(1 row)
select pg_sleep(1);
pg_sleep
----------
(1 row)
select * from test_debug4(1);
INFO: cnt is 3
CONTEXT: SQL statement "call test_debug(a)"
PL/pgSQL function test_debug4(integer) line 7 at SQL statement
test_debug4
-------------
101
(1 row)
-- test with client error in exception
select * from test_debug4(1);
ERROR: Debug Comm 0 has been released or not turned on yet.
drop schema gms_debugger_test6 cascade;
NOTICE: drop cascades to 6 other objects
DETAIL: drop cascades to table test
drop cascades to function test_debug(integer)
drop cascades to function test_debug4(integer)
drop cascades to function gms_continue()
drop cascades to function gms_breakpoint(text,integer)
drop cascades to function gms_finish()

View File

@ -0,0 +1,387 @@
/* contrib/gms_debug/gms_debug--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_debug" to load this file. \quit
-- gms_debug package begin
set behavior_compat_options='proc_outparam_override';
CREATE SCHEMA gms_debug;
GRANT USAGE ON SCHEMA gms_debug TO PUBLIC;
CREATE TYPE gms_debug.program_info AS (
namespace oid,
name varchar2(30),
owner varchar2(30),
dblink varchar2(30),
line# binary_integer,
libunittype binary_integer,
entrypointname varchar2(30));
CREATE TYPE gms_debug.runtime_info AS (
line# binary_integer,
terminated binary_integer,
breakpoint binary_integer,
stackdepth binary_integer,
interpreterdepth binary_integer,
reason binary_integer,
program gms_debug.program_info);
CREATE or REPLACE FUNCTION gms_debug.initialize(
IN debug_session_id varchar2(30) DEFAULT '' ,
IN diagnostics binary_integer DEFAULT 0)
returns varchar2
AS 'MODULE_PATHNAME', 'gms_debug_initialize'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE FUNCTION gms_debug.debug_on(
IN no_client_side_plsql_engine BOOLEAN DEFAULT TRUE ,
IN immediate BOOLEAN DEFAULT FALSE)
returns void AS $$
BEGIN
return;
END;
$$ language plpgsql IMMUTABLE;
CREATE or REPLACE FUNCTION gms_debug.attach_session(
IN debug_session_id varchar2(30) ,
IN diagnostics binary_integer DEFAULT 0)
returns void
AS 'MODULE_PATHNAME', 'gms_debug_attach_session'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE FUNCTION gms_debug.add_breakpoint(
IN proid oid,
IN line# binary_integer ,
OUT breakpoint# binary_integer,
IN fuzzy binary_integer,
IN iterations binary_integer,
OUT sts binary_integer)
AS 'MODULE_PATHNAME', 'gms_debug_set_breakpoint'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE FUNCTION gms_debug.set_breakpoint(
IN program gms_debug.program_info,
IN line# binary_integer,
OUT breakpoint# binary_integer,
IN fuzzy binary_integer,
IN iterations binary_integer)
returns binary_integer AS $$
DECLARE
proid oid;
sts binary_integer;
BEGIN
select oid from pg_proc where proname = program.name limit 1 into proid;
set behavior_compat_options='';
gms_debug.add_breakpoint(proid, line#, breakpoint#, fuzzy, iterations, sts);
set behavior_compat_options='proc_outparam_override';
return sts;
END;
$$ language plpgsql;
CREATE or REPLACE FUNCTION gms_debug.call_continue(
IN breakflags binary_integer ,
IN info_requested binary_integer DEFAULT NULL,
OUT err_code binary_integer,
OUT run_line binary_integer,
OUT run_breakpoint binary_integer,
OUT run_stackdepth binary_integer,
OUT run_reason binary_integer,
OUT pro_namespace oid,
OUT pro_name varchar2(30),
OUT pro_owner oid)
AS 'MODULE_PATHNAME', 'gms_debug_continue'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE FUNCTION gms_debug.continue(
OUT run_info gms_debug.runtime_info ,
IN breakflags binary_integer ,
IN info_requested binary_integer DEFAULT NULL)
returns binary_integer AS $$
DECLARE
err_code binary_integer;
run_line binary_integer;
run_terminated binary_integer;
run_breakpoint binary_integer;
run_stackdepth binary_integer;
run_interpreterdepth binary_integer;
run_reason binary_integer;
pro_namespace oid;
pro_name varchar2(30);
pro_owner oid;
pro_ownername varchar2(30);
pro gms_debug.program_info;
BEGIN
set behavior_compat_options='';
gms_debug.call_continue(breakflags, info_requested, err_code, run_line,
run_breakpoint, run_stackdepth, run_reason, pro_namespace,
pro_name, pro_owner);
set behavior_compat_options='proc_outparam_override';
select usename from pg_user where usesysid = pro_owner into pro_ownername;
run_info.line# = run_line;
run_info.terminated = 0;
run_info.breakpoint = run_breakpoint;
run_info.stackdepth = run_stackdepth;
run_info.interpreterdepth = -1;
run_info.reason = run_reason;
pro.namespace = pro_namespace;
pro.name = pro_name;
pro.owner = pro_ownername;
pro.dblink = '';
pro.line# = run_line;
pro.libunittype = 0;
pro.entrypointname = '';
run_info.program = pro;
return err_code;
END;
$$ language plpgsql;
CREATE or REPLACE FUNCTION gms_debug.get_debug_runtime_info(
IN info_requested binary_integer,
OUT err_code binary_integer,
OUT run_line binary_integer,
OUT run_breakpoint binary_integer,
OUT run_stackdepth binary_integer,
OUT run_reason binary_integer,
OUT pro_namespace oid,
OUT pro_name varchar2(30),
OUT pro_owner oid)
AS 'MODULE_PATHNAME', 'gms_debug_get_runtime_info'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE FUNCTION gms_debug.get_runtime_info(
IN info_requested binary_integer,
OUT run_info gms_debug.runtime_info)
returns binary_integer AS $$
DECLARE
err_code binary_integer;
run_line binary_integer;
run_terminated binary_integer;
run_breakpoint binary_integer;
run_stackdepth binary_integer;
run_interpreterdepth binary_integer;
run_reason binary_integer;
pro_namespace oid;
pro_name varchar2(30);
pro_owner oid;
pro_ownername varchar2(30);
pro gms_debug.program_info;
BEGIN
set behavior_compat_options='';
gms_debug.get_debug_runtime_info(info_requested, err_code, run_line,
run_breakpoint, run_stackdepth, run_reason, pro_namespace,
pro_name, pro_owner);
set behavior_compat_options='proc_outparam_override';
select usename from pg_user where usesysid = pro_owner into pro_ownername;
run_info.line# = run_line;
run_info.terminated = 0;
run_info.breakpoint = run_breakpoint;
run_info.stackdepth = run_stackdepth;
run_info.interpreterdepth = -1;
run_info.reason = run_reason;
pro.namespace = pro_namespace;
pro.name = pro_name;
pro.owner = pro_ownername;
pro.dblink = '';
pro.line# = run_line;
pro.libunittype = 0;
pro.entrypointname = '';
run_info.program = pro;
return err_code;
END;
$$ language plpgsql;
CREATE or REPLACE FUNCTION gms_debug.debug_off()
returns void
AS 'MODULE_PATHNAME', 'gms_debug_off'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE FUNCTION gms_debug.detach_session()
returns void
AS 'MODULE_PATHNAME', 'gms_debug_detach_session'
LANGUAGE C VOLATILE NOT FENCED;
CREATE or REPLACE PROCEDURE gms_debug.probe_version(OUT major binary_integer, OUT minor binary_integer)
AS
BEGIN
major := 1;
minor := 0;
END;
CREATE FUNCTION gms_debug.success() RETURNS int AS $$
BEGIN
return 0;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.error_illegal_line() RETURNS int AS $$
BEGIN
return -1;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.error_bad_handle() RETURNS int AS $$
BEGIN
return -2;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.error_already_exists() RETURNS int AS $$
BEGIN
return -3;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.error_communication() RETURNS int AS $$
BEGIN
return -4;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.info_getstackdepth() RETURNS int AS $$
BEGIN
return 0;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.info_getbreakpoint() RETURNS int AS $$
BEGIN
return 2;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.info_getlineinfo() RETURNS int AS $$
BEGIN
return 4;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.break_next_line() RETURNS int AS $$
BEGIN
return 2;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.break_any_call() RETURNS int AS $$
BEGIN
return 4;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.break_any_return() RETURNS int AS $$
BEGIN
return 8;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.break_return() RETURNS int AS $$
BEGIN
return 16;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.break_exception() RETURNS int AS $$
BEGIN
return 32;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.break_handler() RETURNS int AS $$
BEGIN
return 64;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.abort_execution() RETURNS int AS $$
BEGIN
return 128;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_none() RETURNS int AS $$
BEGIN
return 0;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_breakpoint() RETURNS int AS $$
BEGIN
return 1;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_enter() RETURNS int AS $$
BEGIN
return 2;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_return() RETURNS int AS $$
BEGIN
return 3;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_finish() RETURNS int AS $$
BEGIN
return 4;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_line() RETURNS int AS $$
BEGIN
return 5;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_interrupt() RETURNS int AS $$
BEGIN
return 6;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_exception() RETURNS int AS $$
BEGIN
return 7;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_exit() RETURNS int AS $$
BEGIN
return 8;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_knl_exit() RETURNS int AS $$
BEGIN
return 9;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_handler() RETURNS int AS $$
BEGIN
return 10;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_timeout() RETURNS int AS $$
BEGIN
return 11;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_instantiate() RETURNS int AS $$
BEGIN
return 12;
END;
$$ language plpgsql IMMUTABLE;
CREATE FUNCTION gms_debug.reason_abort() RETURNS int AS $$
BEGIN
return 13;
END;
$$ language plpgsql IMMUTABLE;
-- gms_debug package end

View File

@ -0,0 +1,5 @@
# gms_debug extension
comment = 'provides the interface to initiate and control the debugging of PL/SQL applications'
default_version = '1.0'
module_pathname = '$libdir/gms_debug'
relocatable = true

View File

@ -0,0 +1,519 @@
/*
* Copyright (c) 2024 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* --------------------------------------------------------------------------------------
*
* gms_debug.cpp
* gms_debug can effectively estimate statistical data.
*
*
* IDENTIFICATION
* contrib/gms_debug/gms_debug.cpp
*
* --------------------------------------------------------------------------------------
*/
#include "postgres.h"
#include "utils/plpgsql_domain.h"
#include "commands/copy.h"
#include "funcapi.h"
#include "utils/plpgsql.h"
#include <sys/socket.h>
#include "utils/pl_debug.h"
#include "lib/stringinfo.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
#include "utils/lsyscache.h"
#include "catalog/pg_authid.h"
#include "miscadmin.h"
#include "gms_debug.h"
#include <bitset>
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(gms_debug_attach_session);
PG_FUNCTION_INFO_V1(gms_debug_detach_session);
PG_FUNCTION_INFO_V1(gms_debug_get_runtime_info);
PG_FUNCTION_INFO_V1(gms_debug_initialize);
PG_FUNCTION_INFO_V1(gms_debug_off);
PG_FUNCTION_INFO_V1(gms_debug_continue);
PG_FUNCTION_INFO_V1(gms_debug_set_breakpoint);
static void gms_attach_session(int commidx, uint64 sid)
{
PlDebuggerComm* debug_comm = &g_instance.pldebug_cxt.debug_comm[commidx];
AutoMutexLock debuglock(&debug_comm->mutex);
debuglock.lock();
if (debug_comm->Used()) {
if (debug_comm->hasClient()) {
debuglock.unLock();
ereport(ERROR, (errmodule(MOD_PLDEBUGGER), errcode(ERRCODE_TARGET_SERVER_ALREADY_ATTACHED),
(errmsg("target session already attached on other client."))));
}
if (debug_comm->hasClientErrorOccured || debug_comm->hasServerErrorOccured) {
debuglock.unLock();
ereport(ERROR, (errmodule(MOD_PLDEBUGGER), errcode(ERRCODE_INVALID_OPERATION),
(errmsg("target function is not running in expected way."))));
}
debug_comm->clientId = sid;
} else {
debuglock.unLock();
ereport(ERROR, (errmodule(MOD_PLDEBUGGER), errcode(ERRCODE_INVALID_OPERATION),
(errmsg("target session should be init first."))));
}
debuglock.unLock();
}
static bool GMSInterfaceCheck(const char* funcname, bool needAttach)
{
#ifdef ENABLE_MULTIPLE_NODES
PLDEBUG_FEATURE_NOT_SUPPORT_IN_DISTRIBUTED();
#endif
if (!superuser() && !is_member_of_role(GetUserId(), DEFAULT_ROLE_PLDEBUGGER)) {
ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
(errmsg("must be system admin to execute", funcname))));
return false;
}
if (u_sess->plsql_cxt.debug_client != NULL && needAttach){
int commIdx = u_sess->plsql_cxt.debug_client->comm_idx;
CHECK_DEBUG_COMM_VALID(commIdx);
/* if current debug index is not myself during debug, clean up my self */
PlDebuggerComm* debug_comm = &g_instance.pldebug_cxt.debug_comm[commIdx];
DebugClientInfo* client = u_sess->plsql_cxt.debug_client;
AutoMutexLock debuglock(&debug_comm->mutex);
debuglock.lock();
if (debug_comm == nullptr) {
client->comm_idx = -1;
MemoryContextDelete(client->context);
u_sess->plsql_cxt.debug_client = NULL;
debuglock.unLock();
ereport(ERROR,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("must attach a execute func before execute", funcname),
errhint("attach a execute func and retry")));
return false;
}
if (!debug_comm->isRunning()) {
debuglock.unLock();
return false;
}
debuglock.unLock();
}
return true;
}
/*
* This function initializes the target session for debugging.
*/
Datum gms_debug_initialize(PG_FUNCTION_ARGS)
{
StringInfoData buf;
bool found = false;
// TupleDesc tupdesc;
int commIdx = -1;
const int DEBUG_TURN_ON_ATTR_NUM = 1;
GMSInterfaceCheck("gms_debug.initialize", false);
if (unlikely(u_sess->plsql_cxt.debug_proc_htbl == NULL)) {
init_pldebug_htcl();
}
/* return nodename & socket idx as port */
if (!PG_ARGISNULL(0)) {
// check if the debug_session_id valid
char *debug_session_id = text_to_cstring(PG_GETARG_VARCHAR_PP(0));
char *psave = NULL;
char *nodename = strtok_r(debug_session_id, "-", &psave);
char *fir = AssignStr(psave, false);
char *new_fir = TrimStr(fir);
if (new_fir == NULL) {
ereport(ERROR, ( (errmsg("invalid debug_session_id %s", debug_session_id))));
}
commIdx = pg_strtoint32(new_fir);
if (commIdx < 0 || commIdx >= PG_MAX_DEBUG_CONN) {
ereport(ERROR, ( (errmsg("invalid debug_session_id %s", debug_session_id))));
}
if (!AcquireDebugCommIdx(commIdx)) {
ereport(ERROR,
( errmsg("debug_session_id %s has already been used", debug_session_id)));
}
} else {
commIdx = GetValidDebugCommIdx();
if (commIdx == -1) {
ereport(ERROR, (
(errmsg("max debug function is %d, turn_on function is out of range", PG_MAX_DEBUG_CONN))));
}
}
SetDebugCommGmsUsed(commIdx, true);
// dms_debug indicates that session debugging functionality should be enabled.
u_sess->plsql_cxt.gms_debug_idx = commIdx;
initStringInfo(&buf);
// simple concatenate node_name and port with an underscore
appendStringInfo(&buf, "%s-%d", g_instance.attr.attr_common.PGXCNodeName, commIdx);
PG_RETURN_VARCHAR_P(cstring_to_text(buf.data));
}
/*
* This procedure notifies the debug session about the target program.
*/
Datum gms_debug_attach_session(PG_FUNCTION_ARGS)
{
GMSInterfaceCheck("gms_debug.attach_session", false);
char *debug_session_id = text_to_cstring(PG_GETARG_VARCHAR_PP(0));
int32 diagnostics = PG_GETARG_INT32(1);
char *psave = NULL;
int commidx = -1;
char *nodename = strtok_r(debug_session_id, "-", &psave);
char *fir = AssignStr(psave, false);
char *new_fir = TrimStr(fir);
if (new_fir == NULL) {
ereport(ERROR, ( (errmsg("invalid debug_session_id %s", debug_session_id))));
}
commidx = pg_strtoint32(new_fir);
/* if is attach to some other function, just clean up it */
clean_up_debug_client(true);
/* this nodename check is only for single node */
nodename = TrimStr(nodename);
if (nodename == NULL || strcasecmp(nodename, g_instance.attr.attr_common.PGXCNodeName) != 0) {
ereport(ERROR, ( errcode(ERRCODE_AMBIGUOUS_PARAMETER),
(errmsg("wrong debug nodename, should be %s.", g_instance.attr.attr_common.PGXCNodeName))));
}
if (commidx < 0 || commidx >= PG_MAX_DEBUG_CONN) {
ereport(ERROR, ( errcode(ERRCODE_AMBIGUOUS_PARAMETER),
(errmsg("invalid debug port id %d.", commidx))));
}
/* only can attach when comm satisfy contidion */
gms_attach_session(commidx, u_sess->session_id);
u_sess->plsql_cxt.debug_client = InitDebugClient(commidx);
PG_RETURN_VOID();
}
/**
* This function sets a breakpoint in a program unit, which persists for the current session.
*/
Datum gms_debug_set_breakpoint(PG_FUNCTION_ARGS)
{
const int DEBUG_BREAK_TUPLE_ATTR_NUM = 2;
Oid funcOid = PG_GETARG_OID(0);
int32 lineno = PG_GETARG_INT32(1);
int32 fuzzy = PG_GETARG_INT32(2);
int32 iterations = PG_GETARG_INT32(3);
int headerlines = 0;
uint32 nLine = 0;
CodeLine *lines = NULL;
CodeLine cl;
cl.code = NULL;
bool found = false;
DebugClientInfo *client = u_sess->plsql_cxt.debug_client;
StringInfoData str;
if(client == nullptr) {
ereport(ERROR,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("error happened in debug session, please reattach target session and try")));
}
TupleDesc tupdesc;
MemoryContext oldcontext = MemoryContextSwitchTo(client->context);
tupdesc = CreateTemplateTupleDesc(DEBUG_BREAK_TUPLE_ATTR_NUM, false);
TupleDescInitEntry(tupdesc, (AttrNumber)1, "status", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)2, "breakpoint", INT4OID, -1, 0);
TupleDesc tuple_desc = BlessTupleDesc(tupdesc);
Datum values[DEBUG_BREAK_TUPLE_ATTR_NUM];
bool nulls[DEBUG_BREAK_TUPLE_ATTR_NUM];
HeapTuple tuple;
errno_t rc = 0;
rc = memset_s(values, sizeof(values), 0, sizeof(values));
securec_check(rc, "\0", "\0");
rc = memset_s(nulls, sizeof(nulls), 0, sizeof(nulls));
securec_check(rc, "\0", "\0");
(void)MemoryContextSwitchTo(oldcontext);
values[0] = Int32GetDatum(0);
values[1] = Int32GetDatum(-1);
if (OidIsValid(funcOid)) {
bool checked = GMSInterfaceCheck("gms_debug.add_breakpoint", true);
if(!checked) {
ereport(WARNING,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("target func not attached")));
values[0] = Int32GetDatum(ERROR_BAD_HANDLE);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
} else {
ereport(WARNING, (errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("pl debugger only support function with language plpgsql"),
errdetail("the given function is %lu", funcOid),
errcause("pl debugger do not support the given function"),
erraction("use pl debugger with only plpgsql function")));
values[0] = Int32GetDatum(ERROR_BAD_HANDLE);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
if (unlikely(u_sess->plsql_cxt.debug_proc_htbl == NULL)) {
init_pldebug_htcl();
}
PlDebugEntry *entry =
(PlDebugEntry *)hash_search(u_sess->plsql_cxt.debug_proc_htbl, (void *)(&funcOid), HASH_ENTER, &found);
entry->key = funcOid;
if (!found) {
entry->commIdx = client->comm_idx;
entry->func = NULL;
}
initStringInfo(&str);
uint64 sid = ENABLE_THREAD_POOL ? u_sess->session_id : t_thrd.proc_cxt.MyProcPid;
appendStringInfo(&str, "%lu:%u:%d:%s", sid, funcOid, lineno, cl.code == NULL ? "NULL" : cl.code);
debug_client_send_msg(client, GMS_DEBUG_ADDBREAKPOINT_HEADER, str.data, str.len);
debug_client_rec_msg(client);
int32 ans = pg_strtoint32(client->rec_buffer);
pfree_ext(lines);
pfree_ext(str.data);
if (ans == ADD_BP_ERR_ALREADY_EXISTS) {
ereport(WARNING, (errcode(ERRCODE_WARNING),
errmsg("the given line number already contains a valid breakpoint.")));
values[0] = Int32GetDatum(ERROR_ALREADY_EXISTS);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
} else if (ans == ADD_BP_ERR_OUT_OF_RANGE) {
ereport(WARNING, (errcode(ERRCODE_WARNING),
errmsg("lineno must be within the range of [1, MaxLineNumber]." )));
values[0] = Int32GetDatum(ERROR_ILLEGAL_LINE);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
} else if (ans == ADD_BP_ERR_INVALID_BP_POS) {
ereport(WARNING, (errcode(ERRCODE_WARNING),
errmsg("the given line number does not name a valid breakpoint.")));
values[0] = Int32GetDatum(ERROR_ILLEGAL_LINE);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
values[0] = Int32GetDatum(0);
values[1] = Int32GetDatum(ans);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
static char* parse_and_valid(char **psave, const char* rec_buf)
{
char *fir = strtok_r(NULL, ":", psave);
char *new_fir = TrimStr(fir);
if (new_fir == NULL) {
ReportInvalidMsg(rec_buf);
return NULL;
}
return new_fir;
}
static Datum build_runtime_info(DebugClientInfo *client, int err_code)
{
const int DEBUG_RUNTIME_TUPLE_ATTR_NUM = 8;
int i = 0;
TupleDesc tupdesc;
MemoryContext oldcontext = MemoryContextSwitchTo(client->context);
tupdesc = CreateTemplateTupleDesc(DEBUG_RUNTIME_TUPLE_ATTR_NUM, false);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "err_code", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "run_line", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "run_breakpoint", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "run_stackdepth", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "run_reason", INT4OID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "pro_namespace", OIDOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "pro_name", TEXTOID, -1, 0);
TupleDescInitEntry(tupdesc, (AttrNumber)++i, "pro_owner", OIDOID, -1, 0);
TupleDesc tuple_desc = BlessTupleDesc(tupdesc);
/* Received buffer will be in the form of <namespaceoid, owneroid, lineno, breakpoint, stackdepth, reason,
* pkgfuncname> */
char *psave = NULL;
char *fir = strtok_r(client->rec_buffer, ":", &psave);
const int int64Size = 10;
Oid namespaceoid;
Oid funcoid;
Oid owneroid;
int run_line = -1;
int run_breakpoint = -1;
int run_stackdepth = -1;
int run_reason = 0;
char *pro_name = NULL;
Datum values[DEBUG_RUNTIME_TUPLE_ATTR_NUM];
bool nulls[DEBUG_RUNTIME_TUPLE_ATTR_NUM];
HeapTuple tuple;
errno_t rc = 0;
if(err_code == 0) {
char *new_fir = TrimStr(fir);
if (new_fir == NULL) {
ReportInvalidMsg(client->rec_buffer);
PG_RETURN_DATUM(0);
}
funcoid = (Oid)pg_strtouint64(new_fir, NULL, int64Size);
new_fir = parse_and_valid(&psave, client->rec_buffer);
CHECK_RETURN_DATUM(new_fir);
namespaceoid = (Oid)pg_strtouint64(new_fir, NULL, int64Size);
new_fir = parse_and_valid(&psave, client->rec_buffer);
CHECK_RETURN_DATUM(new_fir);
owneroid = (Oid)pg_strtouint64(new_fir, NULL, int64Size);
new_fir = parse_and_valid(&psave, client->rec_buffer);
CHECK_RETURN_DATUM(new_fir);
run_line = pg_strtoint32(new_fir);
new_fir = parse_and_valid(&psave, client->rec_buffer);
CHECK_RETURN_DATUM(new_fir);
run_breakpoint = pg_strtoint32(new_fir);
new_fir = parse_and_valid(&psave, client->rec_buffer);
CHECK_RETURN_DATUM(new_fir);
run_stackdepth = pg_strtoint32(new_fir);
new_fir = parse_and_valid(&psave, client->rec_buffer);
CHECK_RETURN_DATUM(new_fir);
run_reason = pg_strtoint32(new_fir);
pro_name = AssignStr(psave, false);
}
(void)MemoryContextSwitchTo(oldcontext);
rc = memset_s(values, sizeof(values), 0, sizeof(values));
securec_check(rc, "\0", "\0");
rc = memset_s(nulls, sizeof(nulls), 0, sizeof(nulls));
securec_check(rc, "\0", "\0");
i = 0;
values[i++] = Int32GetDatum(err_code);
values[i++] = Int32GetDatum(run_line);
values[i++] = Int32GetDatum(run_breakpoint);
values[i++] = Int32GetDatum(run_stackdepth);
values[i++] = Int32GetDatum(run_reason);
values[i++] = ObjectIdGetDatum(namespaceoid);
values[i++] = CStringGetTextDatum(pro_name);
values[i++] = ObjectIdGetDatum(owneroid);
tuple = heap_form_tuple(tuple_desc, values, nulls);
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
/**
* This function passes the given breakflags
* (a mask of the events that are of interest) to Probe in the target process.
* It tells Probe to continue execution of the target process,
* and it waits until the target process runs to completion or signals an event.
* If info_requested is not NULL, then calls GET_RUNTIME_INFO.
*/
Datum gms_debug_continue(PG_FUNCTION_ARGS)
{
DebugClientInfo *client = u_sess->plsql_cxt.debug_client;
if(client == nullptr) {
ereport(ERROR,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("error happened in debug session, please reattach target session and try")));
}
const int DEBUG_ACTION_ATTR_NUM = 5;
const char actions[DEBUG_ACTION_ATTR_NUM] = {
GMS_DEBUG_CONTINUE_HEADER,
GMS_DEBUG_NEXT_HEADER,
GMS_DEBUG_STEP_INTO_HEADER,
GMS_DEBUG_FINISH_HEADER,
GMS_DEBUG_ABORT_HEADER
};
int err_code = 0;
bool checked = GMSInterfaceCheck("gms_debug.continue", true);
if(!checked) {
ereport(WARNING,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("target func not attached")));
err_code = ERROR_FUNC_NOT_ATTACHED;
return build_runtime_info(client,err_code);
}
int32 breakflags = PG_GETARG_INT32(0);
int32 info_requested = PG_GETARG_INT32(1);
char action;
std::bitset<DEBUG_ACTION_ATTR_NUM> breakflags_bitset(breakflags);
for (int i = 0; i < breakflags_bitset.size(); ++i) {
if (breakflags_bitset.test(i)) {
action = actions[i];
}
}
debug_client_send_msg(client, action, NULL, 0);
debug_client_rec_msg(client);
return build_runtime_info(client,err_code);
}
/***
* This function returns information about the current program.
* It is only needed if the info_requested parameter to SYNCHRONIZE
* or CONTINUE was set to 0.
*/
Datum gms_debug_get_runtime_info(PG_FUNCTION_ARGS)
{
int err_code = 0;
DebugClientInfo *client = u_sess->plsql_cxt.debug_client;
if(client == nullptr) {
ereport(ERROR,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("error happened in debug session, please reattach target session and try")));
}
bool checked = GMSInterfaceCheck("gms_debug.runtime_info",true);
if(!checked) {
ereport(WARNING,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("target func not attached")));
err_code = ERROR_FUNC_NOT_ATTACHED;
return build_runtime_info(client, err_code);
}
int32 info_requested = PG_GETARG_INT32(0);
debug_client_send_msg(client, GMS_DEBUG_RUNTIMEINFO_HEADER, NULL, 0);
debug_client_rec_msg(client);
return build_runtime_info(client, err_code);
}
/***
* This procedure notifies the target session that
* debugging should no longer take place in that session.
* It is not necessary to call this function before ending the session.
*/
Datum gms_debug_off(PG_FUNCTION_ARGS)
{
GMSInterfaceCheck("gms_debug.debug_off",false);
// dms_debug indicates that session debugging functionality should be enabled.
SetDebugCommGmsUsed(u_sess->plsql_cxt.gms_debug_idx, false);
u_sess->plsql_cxt.gms_debug_idx = -1;
PG_RETURN_VOID();
}
/***
* This procedure stops debugging the target program.
* This procedure may be called at any time,
* but it does not notify the target session that the debug session is detaching itself,
* and it does not terminate execution of the target session.
* Therefore, care should be taken to ensure that the target session does not hang itself.
*/
Datum gms_debug_detach_session(PG_FUNCTION_ARGS)
{
DebugClientInfo *client = u_sess->plsql_cxt.debug_client;
if(client == nullptr) {
ereport(ERROR,
(errcode(ERRCODE_TARGET_SERVER_NOT_ATTACHED),
errmsg("error happened in debug session, please reattach target session and try")));
}
GMSInterfaceCheck("gms_debug.detach_session",true);
debug_client_send_msg(client, DEBUG_ABORT_HEADER, NULL, 0);
debug_client_rec_msg(client);
clean_up_debug_client();
PG_RETURN_VOID();
}

View File

@ -0,0 +1,46 @@
/*---------------------------------------------------------------------------------------*
* gms_debug.h
*
* Definition about gms_debug package.
*
* IDENTIFICATION
* contrib/gms_debug/gms_debug.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef GMS_DEBUG_H
#define GMS_DEBUG_H
#define BREAK_NEXT_LINE 2
#define BREAK_ANY_CALL 4
#define BREAK_ANY_RETURN 8
#define BREAK_RETURN 16
#define BREAK_EXCEPTION 32
#define BREAK_HANDLER 64
#define BREAK_ABORT_EXECUTION 128
#define ERROR_ILLEGAL_LINE -1
#define ERROR_BAD_HANDLE -2
#define ERROR_ALREADY_EXISTS -3
#define ERROR_COMMUNICATION -4
#define ERROR_FUNC_NOT_ATTACHED -9
/* from gms_debug.cpp */
extern "C" Datum gms_debug_attach_session(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_detach_session(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_get_runtime_info(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_probe_version(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_initialize(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_on(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_off(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_continue(PG_FUNCTION_ARGS);
extern "C" Datum gms_debug_set_breakpoint(PG_FUNCTION_ARGS);
#define CHECK_RETURN_DATUM(mask_string) \
do { \
if (mask_string == NULL) \
PG_RETURN_DATUM(0); \
} while (0)
#endif

View File

@ -0,0 +1,138 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test1;
CREATE or REPLACE FUNCTION gms_breakpoint(funcname text, lineno int)
returns void as $$
declare
pro_info gms_debug.program_info;
bkline binary_integer;
ret binary_integer;
begin
pro_info.name := funcname;
ret := gms_debug.set_breakpoint(pro_info, lineno, bkline,1,1);
RAISE NOTICE 'ret= %', ret;
RAISE NOTICE 'ret= %', bkline;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_info()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.get_runtime_info(1, run_info);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_breakpoint('test_debug', 0); -- negative
select gms_breakpoint('test_debug', 15); -- ok
select gms_breakpoint('test_debug', 17); -- invalid
select gms_breakpoint('test_debug', 22); -- ok
select gms_breakpoint('test_debug', 15); -- ok
select gms_next();
select gms_next();
select gms_next();
select gms_next();
select gms_continue();
select gms_continue();
select gms_debug.detach_session();

View File

@ -0,0 +1,82 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test2;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_next();
select gms_next();
select gms_next();
select gms_continue();
select gms_debug.detach_session();

View File

@ -0,0 +1,82 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test3;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_next();
select gms_next();
select gms_continue();
select gms_next();
select gms_debug.detach_session();

View File

@ -0,0 +1,88 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test4;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_step();
select gms_step();
select gms_step();
select gms_step();
select gms_step();
select gms_continue();
select gms_continue();
select gms_debug.detach_session();

View File

@ -0,0 +1,116 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test5;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_next()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 2, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_finish()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 8, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_next();
select gms_next();
select gms_next();
select gms_step();
select gms_finish();
select gms_finish();
select gms_debug.detach_session();

View File

@ -0,0 +1,99 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test6;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_breakpoint(funcname text, lineno int)
returns void as $$
declare
pro_info gms_debug.program_info;
bkline binary_integer;
ret binary_integer;
begin
pro_info.name := funcname;
ret := gms_debug.set_breakpoint(pro_info, lineno, bkline,1,1);
RAISE NOTICE 'ret= %', ret;
RAISE NOTICE 'ret= %', bkline;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_finish()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 8, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_breakpoint('test_debug', 31);
select gms_breakpoint('test_debug', 44);
select gms_finish();
select gms_finish();
select gms_finish();
select gms_continue();
select gms_debug.detach_session();

View File

@ -0,0 +1,103 @@
-- wait for server establishment
CREATE OR REPLACE FUNCTION wait_for_gms_debug_extension()
RETURNS BOOLEAN AS $$
DECLARE
extension_exists BOOLEAN;
BEGIN
-- 初始化变量
extension_exists := FALSE;
-- 循环查询扩展是否存在
WHILE NOT extension_exists LOOP
-- 查询扩展是否存在
PERFORM 1 FROM pg_extension WHERE extname = 'gms_debug';
IF FOUND THEN
-- 如果扩展存在,则退出循环
extension_exists := TRUE;
ELSE
-- 如果扩展不存在,则等待一段时间再重试
PERFORM pg_sleep(1); -- 等待1秒
END IF;
END LOOP;
-- 返回扩展存在的标志
RETURN extension_exists;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF wait_for_gms_debug_extension() THEN
-- 扩展存在,执行下一步操作
END IF;
END $$;
set search_path = gms_debugger_test7;
CREATE or REPLACE FUNCTION gms_step()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 4, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_continue()
returns void as $$
declare
run_info gms_debug.runtime_info;
ret binary_integer;
begin
ret := gms_debug.continue(run_info, 0, 2);
RAISE NOTICE 'breakpoint= %', run_info.breakpoint;
RAISE NOTICE 'stackdepth= %', run_info.stackdepth;
RAISE NOTICE 'line= %', run_info.line#;
RAISE NOTICE 'reason= %', run_info.reason;
RAISE NOTICE 'ret= %',ret;
end;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION gms_breakpoint(funcname text, lineno int)
returns void as $$
declare
pro_info gms_debug.program_info;
bkline binary_integer;
ret binary_integer;
begin
pro_info.name := funcname;
ret := gms_debug.set_breakpoint(pro_info, lineno, bkline,1,1);
RAISE NOTICE 'ret= %', ret;
RAISE NOTICE 'ret= %', bkline;
end;
$$ LANGUAGE plpgsql;
-- attach debug server
select * from gms_debug.attach_session('datanode1-0');
select pg_sleep(3);
select gms_breakpoint('test_debug_recursive', 5);
select gms_step();
select gms_step();
select gms_step();
select gms_step();
select gms_step();
select gms_continue();
select gms_continue();
select gms_debug.detach_session();

View File

@ -0,0 +1,95 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test1 cascade;
create schema gms_debugger_test1;
set search_path = gms_debugger_test1;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
create table show_code_table(lineno int, code text, canBreak bool);
do $$
declare
funcoid oid;
begin
select oid from pg_proc into funcoid where proname = 'test_debug';
INSERT INTO show_code_table SELECT * FROM dbe_pldebugger.info_code(funcoid);
end;
$$;
select * from show_code_table;
-- attach fail (target not turned on)
select * from gms_debug.attach_session('datanode1-0');
-- turn off without turn on
select * from gms_debug.debug_off();
select * from gms_debug.initialize();
select pg_sleep(1);
-- start debug - 1st run
select * from test_debug(4);
-- start debug - 2nd run - to be aborted
select * from test_debug(4);
select * from gms_debug.debug_off();
drop schema gms_debugger_test1 cascade;

View File

@ -0,0 +1,32 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test2 cascade;
create schema gms_debugger_test2;
set search_path = gms_debugger_test2;
-- commit/rollback in procedure
create table tb1(a int);
create or replace procedure test_debug2 as
begin
insert into tb1 values (1000);
commit;
insert into tb1 values (2000);
rollback;
end;
/
-- start debug
select * from gms_debug.initialize();
select pg_sleep(1);
-- start debug - 1st run
select * from test_debug2();
-- start debug - 2nd run - to be aborted
select * from test_debug2();
select * from gms_debug.debug_off();
drop schema gms_debugger_test2 cascade;

View File

@ -0,0 +1,39 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test3 cascade;
create schema gms_debugger_test3;
set search_path = gms_debugger_test3;
-- test for implicit variables
CREATE OR REPLACE function test_debug3(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
ELSE
b := 999;
END CASE;
raise info 'pi_return : %',pi_return ;
return b;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
select pg_sleep(1);
-- start debug - 1st run
select * from test_debug3(1);
-- start debug - 2nd run - to be aborted
select * from test_debug3(1);
select * from gms_debug.debug_off();
drop schema gms_debugger_test3 cascade;

View File

@ -0,0 +1,97 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test4 cascade;
create schema gms_debugger_test4;
set search_path = gms_debugger_test4;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
-- test for step into
CREATE OR REPLACE FUNCTION test_debug4(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
call test_debug(a);
ELSE
b := 999;
END CASE;
return b;
raise info 'pi_return : %',pi_return ;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
select pg_sleep(1);
select * from test_debug4(1);
-- test with client error in exception
select * from test_debug4(1);
select * from gms_debug.debug_off();
drop schema gms_debugger_test4 cascade;

View File

@ -0,0 +1,97 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test5 cascade;
create schema gms_debugger_test5;
set search_path = gms_debugger_test5;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
-- test for step into
CREATE OR REPLACE FUNCTION test_debug4(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
call test_debug(a);
ELSE
b := 999;
END CASE;
return b;
raise info 'pi_return : %',pi_return ;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
select pg_sleep(1);
select * from test_debug4(1);
-- test with client error in exception
select * from test_debug4(1);
select * from gms_debug.debug_off();
drop schema gms_debugger_test5 cascade;

View File

@ -0,0 +1,97 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test6 cascade;
create schema gms_debugger_test6;
set search_path = gms_debugger_test6;
create table test(a int, b varchar(40), c timestamp);
insert into test values (2, 'Giving to the Needy', '2020-02-02');
insert into test values (3, 'Prayer', '2021-12-02');
insert into test values (5, 'Fasting', '2030-03-02');
insert into test values (7, 'Treasures in Heaven', '2040-04-02');
CREATE OR REPLACE FUNCTION test_debug(x int) RETURNS SETOF test AS
$BODY$
DECLARE
sql_stmt VARCHAR2(500);
r test%rowtype;
rec record;
b_tmp text;
cnt int;
a_tmp int;
cur refcursor;
n_tmp NUMERIC(24,6);
t_tmp tsquery;
CURSOR cur_arg(criterion INTEGER) IS
SELECT * FROM test WHERE a < criterion;
BEGIN
cnt := 0;
FOR r IN SELECT * FROM test
WHERE a > x
LOOP
RETURN NEXT r;
END LOOP;
FOR rec in SELECT * FROM test
WHERE a < x
LOOP
RETURN NEXT rec;
END LOOP;
FORALL index_1 IN 0..1
INSERT INTO test VALUES (index_1, 'Happy Children''s Day!', '2021-6-1');
SELECT b FROM test where a = 7 INTO b_tmp;
sql_stmt := 'select a from test where b = :1;';
OPEN cur FOR sql_stmt USING b_tmp;
IF cur%isopen then LOOP
FETCH cur INTO a_tmp;
EXIT WHEN cur%notfound;
END LOOP;
END IF;
CLOSE cur;
WHILE cnt < 3 LOOP
cnt := cnt + 1;
END LOOP;
RAISE INFO 'cnt is %', cnt;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
-- test for step into
CREATE OR REPLACE FUNCTION test_debug4(a in integer) return integer
AS
declare
b int;
BEGIN
CASE a
WHEN 1 THEN
b := 111;
call test_debug(a);
ELSE
b := 999;
END CASE;
return b;
raise info 'pi_return : %',pi_return ;
EXCEPTION WHEN others THEN
b := 101;
return b;
END;
/
select * from gms_debug.initialize();
select pg_sleep(1);
select * from test_debug4(1);
-- test with client error in exception
select * from test_debug4(1);
select * from gms_debug.debug_off();
drop schema gms_debugger_test6 cascade;

View File

@ -0,0 +1,29 @@
-- setups
create extension if not exists gms_debug;
drop schema if exists gms_debugger_test7 cascade;
create schema gms_debugger_test7;
set search_path = gms_debugger_test7;
create or replace function test_debug_recursive (ct int, pr int)
returns table (counter int, product int)
language plpgsql
as $$
begin
return query select ct, pr;
if ct < 5 then
return query select * from test_debug_recursive(ct+ 1, pr * (ct+ 1));
end if;
end $$;
select * from gms_debug.initialize();
select pg_sleep(1);
select * from test_debug_recursive (1, 1);
-- test with client error in exception
select * from test_debug_recursive (1, 1);
select * from gms_debug.debug_off();
drop schema gms_debugger_test7 cascade;

View File

@ -0,0 +1,21 @@
#This is the main CMAKE for build all gms_i18n.
# gms_i18n
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_gms_i18n_SRC)
set(TGT_gms_i18n_INC
${PROJECT_OPENGS_DIR}/contrib/gms_i18n
${PROJECT_OPENGS_DIR}/contrib
)
set(gms_i18n_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_i18n_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_i18n_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_i18n TGT_gms_i18n_SRC TGT_gms_i18n_INC "${gms_i18n_DEF_OPTIONS}" "${gms_i18n_COMPILE_OPTIONS}" "${gms_i18n_LINK_OPTIONS}")
set_target_properties(gms_i18n PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_i18n.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_i18n--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_i18n DESTINATION lib/postgresql)

26
contrib/gms_i18n/Makefile Normal file
View File

@ -0,0 +1,26 @@
# contrib/gms_i18n/Makefile
MODULE_big = gms_i18n
OBJS = gms_i18n.o
EXTENSION = gms_i18n
DATA = gms_i18n--1.0.sql
exclude_option = -fPIE
override CPPFLAGS := $(filter-out $(exclude_option),$(CPPFLAGS))
REGRESS = gms_i18n
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_i18n
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25632 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

View File

@ -0,0 +1,145 @@
create extension gms_i18n;
create schema gms_i18n_test;
set search_path=gms_i18n_test;
-- test gms_i18n.raw_to_char
select gms_i18n.raw_to_char(hextoraw('616263646566C2AA'), 'utf8');
raw_to_char
-------------
abcdefª
(1 row)
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'), 'utf8');
raw_to_char
-------------
测试
(1 row)
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'), '');
raw_to_char
-------------
测试
(1 row)
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'));
raw_to_char
-------------
测试
(1 row)
select gms_i18n.raw_to_char('', 'utf8');
raw_to_char
-------------
(1 row)
select gms_i18n.raw_to_char('', '');
raw_to_char
-------------
(1 row)
select gms_i18n.raw_to_char('');
raw_to_char
-------------
(1 row)
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'), 'unvalid_charset');
ERROR: invalid source encoding name "unvalid_charset"
CONTEXT: referenced column: raw_to_char
select gms_i18n.raw_to_char(hextoraw('b2e2cad4'), 'gbk');
raw_to_char
-------------
测试
(1 row)
select gms_i18n.raw_to_char(hextoraw('b2e2cad4'), 'euc_cn');
raw_to_char
-------------
测试
(1 row)
select gms_i18n.raw_to_char(hextoraw('b4fab8d5'), 'big5');
raw_to_char
-------------
測試
(1 row)
select gms_i18n.raw_to_char();
ERROR: function gms_i18n.raw_to_char() does not exist
LINE 1: select gms_i18n.raw_to_char();
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
CONTEXT: referenced column: raw_to_char
-- test gms_i18n.string_to_raw
select gms_i18n.string_to_raw('abcdefª', 'utf8');
string_to_raw
------------------
616263646566C2AA
(1 row)
select gms_i18n.string_to_raw('测试', 'utf8');
string_to_raw
---------------
E6B58BE8AF95
(1 row)
select gms_i18n.string_to_raw('测试', '');
string_to_raw
---------------
E6B58BE8AF95
(1 row)
select gms_i18n.string_to_raw('测试');
string_to_raw
---------------
E6B58BE8AF95
(1 row)
select gms_i18n.string_to_raw('', 'utf8');
string_to_raw
---------------
(1 row)
select gms_i18n.string_to_raw('', '');
string_to_raw
---------------
(1 row)
select gms_i18n.string_to_raw('');
string_to_raw
---------------
(1 row)
select gms_i18n.string_to_raw('测试', 'unvalid_charset');
ERROR: invalid destination encoding name "unvalid_charset"
CONTEXT: referenced column: string_to_raw
select gms_i18n.string_to_raw('测试', 'gbk');
string_to_raw
---------------
B2E2CAD4
(1 row)
select gms_i18n.string_to_raw('测试', 'euc_cn');
string_to_raw
---------------
B2E2CAD4
(1 row)
select gms_i18n.string_to_raw('測試', 'big5');
string_to_raw
---------------
B4FAB8D5
(1 row)
select gms_i18n.string_to_raw();
ERROR: function gms_i18n.string_to_raw() does not exist
LINE 1: select gms_i18n.string_to_raw();
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
CONTEXT: referenced column: string_to_raw
reset search_path;
drop schema gms_i18n_test cascade;

View File

@ -0,0 +1,17 @@
/* contrib/gms_i18n/gms_i18n--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_i18n" to load this file. \quit
CREATE SCHEMA gms_i18n;
GRANT USAGE ON SCHEMA gms_i18n TO PUBLIC;
CREATE OR REPLACE FUNCTION gms_i18n.raw_to_char(IN rawdata raw, IN charset varchar2 DEFAULT NULL)
RETURNS varchar2
AS 'MODULE_PATHNAME', 'gms_i18n_raw_to_char'
LANGUAGE C IMMUTABLE;
CREATE OR REPLACE FUNCTION gms_i18n.string_to_raw(IN strdata varchar2, IN charset varchar2 DEFAULT NULL)
RETURNS raw
AS 'MODULE_PATHNAME', 'gms_i18n_string_to_raw'
LANGUAGE C IMMUTABLE;

View File

@ -0,0 +1,5 @@
# gms_i18n extension
comment = 'collection of i18n for PL/SQL applications'
default_version = '1.0'
module_pathname = '$libdir/gms_i18n'
relocatable = true

View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2024 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* --------------------------------------------------------------------------------------
*
* gms_i18n.cpp
* gms_i18n package
*
*
* IDENTIFICATION
* contrib/gms_i18n/gms_i18n.cpp
*
* --------------------------------------------------------------------------------------
*/
#include "postgres.h"
#include "utils/builtins.h"
#include "gms_i18n.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(gms_i18n_raw_to_char);
PG_FUNCTION_INFO_V1(gms_i18n_string_to_raw);
Datum gms_i18n_raw_to_char(PG_FUNCTION_ARGS)
{
Datum raw = PG_GETARG_DATUM(0);
Datum src_encoding_name;
Datum dest_encoding_name;
Datum result;
if (PG_ARGISNULL(0)) {
PG_RETURN_NULL();
}
dest_encoding_name = DirectFunctionCall1(namein, CStringGetDatum(u_sess->mb_cxt.DatabaseEncoding->name));
if (PG_ARGISNULL(1)) {
src_encoding_name = dest_encoding_name;
} else {
src_encoding_name = DirectFunctionCall1(text_name, PG_GETARG_DATUM(1));
}
/*
* pg_convert expects a bytea as its first argument. We're passing it a
* raw argument here, relying on the fact that they are both in fact
* varlena types, and thus structurally identical.
*/
result = DirectFunctionCall3(pg_convert, raw, src_encoding_name, dest_encoding_name);
PG_RETURN_DATUM(result);
}
Datum gms_i18n_string_to_raw(PG_FUNCTION_ARGS)
{
Datum string = PG_GETARG_DATUM(0);
Datum dest_encoding_name;
Datum src_encoding_name;
Datum result;
if (PG_ARGISNULL(0)) {
PG_RETURN_NULL();
}
src_encoding_name = DirectFunctionCall1(namein, CStringGetDatum(u_sess->mb_cxt.DatabaseEncoding->name));
if (PG_ARGISNULL(1)) {
dest_encoding_name = src_encoding_name;
} else {
dest_encoding_name = DirectFunctionCall1(text_name, PG_GETARG_DATUM(1));
}
/*
* pg_convert expects a bytea as its first argument. We're passing it a
* varchar2 argument here, relying on the fact that they are both in fact
* varlena types, and thus structurally identical.
*/
result = DirectFunctionCall3(pg_convert, string, src_encoding_name, dest_encoding_name);
PG_RETURN_DATUM(result);
}

View File

@ -0,0 +1,19 @@
/*---------------------------------------------------------------------------------------*
* gms_i18n.h
*
* Definition about gms_i18n package.
*
* IDENTIFICATION
* contrib/gms_i18n/gms_i18n.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef __GMS_I18N__
#define __GMS_I18N__
#include "postgres.h"
extern "C" Datum gms_i18n_raw_to_char(PG_FUNCTION_ARGS);
extern "C" Datum gms_i18n_string_to_raw(PG_FUNCTION_ARGS);
#endif // __GMS_I18N__

View File

@ -0,0 +1,34 @@
create extension gms_i18n;
create schema gms_i18n_test;
set search_path=gms_i18n_test;
-- test gms_i18n.raw_to_char
select gms_i18n.raw_to_char(hextoraw('616263646566C2AA'), 'utf8');
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'), 'utf8');
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'), '');
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'));
select gms_i18n.raw_to_char('', 'utf8');
select gms_i18n.raw_to_char('', '');
select gms_i18n.raw_to_char('');
select gms_i18n.raw_to_char(hextoraw('e6b58be8af95'), 'unvalid_charset');
select gms_i18n.raw_to_char(hextoraw('b2e2cad4'), 'gbk');
select gms_i18n.raw_to_char(hextoraw('b2e2cad4'), 'euc_cn');
select gms_i18n.raw_to_char(hextoraw('b4fab8d5'), 'big5');
select gms_i18n.raw_to_char();
-- test gms_i18n.string_to_raw
select gms_i18n.string_to_raw('abcdefª', 'utf8');
select gms_i18n.string_to_raw('测试', 'utf8');
select gms_i18n.string_to_raw('测试', '');
select gms_i18n.string_to_raw('测试');
select gms_i18n.string_to_raw('', 'utf8');
select gms_i18n.string_to_raw('', '');
select gms_i18n.string_to_raw('');
select gms_i18n.string_to_raw('测试', 'unvalid_charset');
select gms_i18n.string_to_raw('测试', 'gbk');
select gms_i18n.string_to_raw('测试', 'euc_cn');
select gms_i18n.string_to_raw('測試', 'big5');
select gms_i18n.string_to_raw();
reset search_path;
drop schema gms_i18n_test cascade;

View File

@ -0,0 +1,18 @@
#This is the main CMAKE for build all components.
# gms_inaddr.so
AUX_SOURCE_DIRECTORY(${PROJECT_OPENGS_DIR}/contrib/gms_inaddr TGT_gms_inaddr_SRC)
set(gms_inaddr_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_inaddr_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_inaddr_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_inaddr TGT_gms_inaddr_SRC "" "${gms_inaddr_DEF_OPTIONS}" "${gms_inaddr_COMPILE_OPTIONS}" "${gms_inaddr_LINK_OPTIONS}")
set_target_properties(gms_inaddr PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_inaddr.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_inaddr--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_inaddr LIBRARY DESTINATION lib/postgresql)

View File

@ -0,0 +1,25 @@
# contrib/gms_inaddr/Makefile
MODULE_big = gms_inaddr
OBJS = gms_inaddr.o
EXTENSION = gms_inaddr
DATA = gms_inaddr--1.0.sql
exclude_option = -fPIE
override CPPFLAGS := -fstack-protector-strong $(filter-out $(exclude_option),$(CPPFLAGS))
REGRESS = gms_inaddr
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_inaddr
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25632 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

View File

@ -0,0 +1,29 @@
create extension gms_output;
create extension gms_inaddr;
begin
gms_output.enable;
gms_output.put_line(gms_inaddr.get_host_address('localhost'));
gms_output.put_line(gms_inaddr.get_host_name('127.0.0.1'));
end
/
127.0.0.1
localhost
begin
gms_output.enable;
gms_output.put_line(gms_inaddr.get_host_address('localhostxx'));
gms_output.put_line(gms_inaddr.get_host_name('127.0.0.1'));
end;
/
ERROR: could not translate host name "localhostxx" to address: Name or service not known
CONTEXT: SQL statement "CALL gms_output.put_line(gms_inaddr.get_host_address('localhostxx'))"
PL/pgSQL function inline_code_block line 3 at PERFORM
begin
gms_output.enable;
gms_output.put_line(gms_inaddr.get_host_name('10.254.180.400'));
end;
/
ERROR: error happen when fetch hostname: Name or service not known
CONTEXT: SQL statement "CALL gms_output.put_line(gms_inaddr.get_host_name('10.254.180.400'))"
PL/pgSQL function inline_code_block line 3 at PERFORM
drop extension gms_output;
drop extension gms_inaddr;

View File

@ -0,0 +1,17 @@
/* contrib/gms_output/gms_output--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_output" to load this file. \quit
CREATE SCHEMA gms_inaddr;
GRANT USAGE ON SCHEMA gms_inaddr TO PUBLIC;
CREATE OR REPLACE FUNCTION gms_inaddr.get_host_address(text default 'localhost')
RETURNS text
AS 'MODULE_PATHNAME','gms_inaddr_get_host_address'
LANGUAGE C;
CREATE OR REPLACE FUNCTION gms_inaddr.get_host_name(text default '127.0.0.1')
RETURNS text
AS 'MODULE_PATHNAME','gms_inaddr_get_host_name'
LANGUAGE C;

View File

@ -0,0 +1,5 @@
# gms_inaddr extension
comment = 'gms_inaddr package'
default_version = '1.0'
module_pathname = '$libdir/gms_inaddr'
relocatable = false

View File

@ -0,0 +1,99 @@
#include <arpa/inet.h>
#include "postgres.h"
#include "funcapi.h"
#include "commands/extension.h"
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
#include "utils/lsyscache.h"
#include "utils/builtins.h"
#include "getaddrinfo.h"
#include "gms_inaddr.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(gms_inaddr_get_host_address);
PG_FUNCTION_INFO_V1(gms_inaddr_get_host_name);
#define MAXLINE 8192
#define ADDRESSSIZE 40
Datum
gms_inaddr_get_host_address(PG_FUNCTION_ARGS)
{
struct addrinfo *gai_result = NULL, *gai = NULL;
int ret = -1;
char result[ADDRESSSIZE] = {0};
char* hostname = text_to_cstring(PG_GETARG_TEXT_PP(0));
if(PG_ARGISNULL(0)){
char hostname[256] = {0};
(void)gethostname(hostname, 255);
ereport(WARNING,
(errcode(ERRCODE_WARNING),
errmsg("hostname %s!", hostname)));
}
ret = getaddrinfo(hostname, NULL, NULL, &gai_result);
if (ret != 0) {
ereport(ERROR,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
errmsg(
"could not translate host name \"%s\" to address: %s", hostname, gai_strerror(ret))));
}
for (gai = gai_result; gai; gai = gai->ai_next) {
errno_t rt;
if (gai->ai_addr->sa_family == AF_INET) {
struct sockaddr_in* h = (struct sockaddr_in*)gai->ai_addr;
char* address = inet_ntoa(h->sin_addr);
rt = strcpy_s(result, ADDRESSSIZE, address);
securec_check(rt, "\0", "\0");
break;
}
#ifdef HAVE_IPV6
else if (gai->ai_addr->sa_family == AF_INET6) {
struct sockaddr_in6* h = (struct sockaddr_in6*)gai->ai_addr;
inet_net_ntop(AF_INET6, &(h)->sin6_addr, 128, result, ADDRESSSIZE);
break;
}
#endif
}
if (gai_result != NULL)
freeaddrinfo(gai_result);
text* result_text = cstring_to_text(result);
PG_RETURN_TEXT_P(result_text);
}
Datum
gms_inaddr_get_host_name(PG_FUNCTION_ARGS){
char* ip_address = text_to_cstring(PG_GETARG_TEXT_PP(0));
if(PG_ARGISNULL(0)){
ip_address = "127.0.0.1";
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip_address);
char buf[MAXLINE];
int rc = getnameinfo((struct sockaddr *)&addr,sizeof(struct sockaddr_in),buf,MAXLINE,NULL,0,NI_NAMEREQD);
if(rc != 0){
elog(ERROR,
"error happen when fetch hostname: %s",
gai_strerror(rc));
}
text* result_text = cstring_to_text(buf);
PG_RETURN_TEXT_P(result_text);
}

View File

@ -0,0 +1,9 @@
#ifndef __GMS_INADDR__
#define __GMS_INADDR__
#include "postgres.h"
extern "C" Datum gms_inaddr_get_host_address(PG_FUNCTION_ARGS);
extern "C" Datum gms_inaddr_get_host_name(PG_FUNCTION_ARGS);
#endif // __GMS_INADDR__

View File

@ -0,0 +1,25 @@
create extension gms_output;
create extension gms_inaddr;
begin
gms_output.enable;
gms_output.put_line(gms_inaddr.get_host_address('localhost'));
gms_output.put_line(gms_inaddr.get_host_name('127.0.0.1'));
end
/
begin
gms_output.enable;
gms_output.put_line(gms_inaddr.get_host_address('localhostxx'));
gms_output.put_line(gms_inaddr.get_host_name('127.0.0.1'));
end;
/
begin
gms_output.enable;
gms_output.put_line(gms_inaddr.get_host_name('10.254.180.400'));
end;
/
drop extension gms_output;
drop extension gms_inaddr;

View File

@ -0,0 +1,21 @@
#This is the main CMAKE for build all gms_stats.
# gms_stats
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_gms_lob_SRC)
set(TGT_gms_lob_INC
${PROJECT_OPENGS_DIR}/contrib/gms_lob
${PROJECT_OPENGS_DIR}/contrib
)
set(gms_lob_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_lob_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_lob_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_lob TGT_gms_lob_SRC TGT_gms_lob_INC "${gms_lob_DEF_OPTIONS}" "${gms_lob_COMPILE_OPTIONS}" "${gms_lob_LINK_OPTIONS}")
set_target_properties(gms_lob PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_lob.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_lob--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_lob DESTINATION lib/postgresql)

28
contrib/gms_lob/Makefile Normal file
View File

@ -0,0 +1,28 @@
# contrib/gms_lob/Makefile
MODULE_big = gms_lob
OBJS = gms_lob.o
EXTENSION = gms_lob
DATA = gms_lob--1.0.sql
exclude_option = -fPIE
override CPPFLAGS := -fstack-protector-strong $(filter-out $(exclude_option),$(CPPFLAGS))
REGRESS = gms_lob
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_lob
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25632 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif
gms_lob.o: gms_lob.cpp

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,139 @@
/* contrib/gms_lob/gms_lob--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_lob" to load this file. \quit
create schema gms_lob;
GRANT USAGE ON SCHEMA gms_lob TO PUBLIC;
-- GMS_LOB Constants - Basic
CREATE OR REPLACE FUNCTION gms_lob."CALL"() returns int
as $$
begin
return 12;
end;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION gms_lob.FILE_READONLY() returns int
as $$
begin
return 0;
end;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION gms_lob.LOB_READONLY() returns BINARY_INTEGER
as $$
begin
return 0;
end;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION gms_lob.LOB_READWRITE() returns BINARY_INTEGER
as $$
begin
return 1;
end;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION gms_lob.LOBMAXSIZE() returns numeric
as $$
begin
return 18446744073709551615;
end;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION gms_lob.SESSION() returns INTEGER
as $$
begin
return 10;
end;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION gms_lob.createtemporary(INOUT lob_loc BLOB, cache boolean, dur INTEGER DEFAULT 10, lobname text DEFAULT ':')
RETURNS BLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_createtemporary'
LANGUAGE C IMMUTABLE NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.createtemporary(INOUT lob_loc CLOB, cache boolean, dur INTEGER DEFAULT 10, lobname text DEFAULT ':')
RETURNS CLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_createtemporary'
LANGUAGE C IMMUTABLE NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.freetemporary(INOUT lob_loc BLOB, lobname text DEFAULT ':')
RETURNS BLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_freetemporary'
LANGUAGE C STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.freetemporary(INOUT lob_loc CLOB, lobname text DEFAULT ':')
RETURNS CLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_freetemporary'
LANGUAGE C STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.read(lob_loc BLOB, INOUT amount INTEGER, "offset" bigint, INOUT buffer raw, lobname text DEFAULT ':')
RETURNS record
AS 'MODULE_PATHNAME', 'gms_lob_og_read_blob'
LANGUAGE C NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.read(lob_loc CLOB, INOUT amount INTEGER, "offset" bigint, INOUT buffer varchar, lobname text DEFAULT ':')
RETURNS record
AS 'MODULE_PATHNAME', 'gms_lob_og_read_clob'
LANGUAGE C NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.write(INOUT lob_loc BLOB, amount numeric, "offset" numeric, buffer raw, lobname text DEFAULT ':')
RETURNS BLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_write_blob'
LANGUAGE C IMMUTABLE NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.write(INOUT lob_loc CLOB, amount numeric, "offset" numeric, buffer varchar, lobname text DEFAULT ':')
RETURNS CLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_write_clob'
LANGUAGE C IMMUTABLE NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.isopen(lob_loc BLOB, lobname text DEFAULT ':')
RETURNS INTEGER
AS 'MODULE_PATHNAME', 'gms_lob_og_isopen'
LANGUAGE C STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.isopen(lob_loc CLOB, lobname text DEFAULT ':')
RETURNS INTEGER
AS 'MODULE_PATHNAME', 'gms_lob_og_isopen'
LANGUAGE C STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.open(INOUT lob_loc BLOB, open_mode INTEGER, lobname text DEFAULT ':')
RETURNS BLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_open'
LANGUAGE C NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.open(INOUT lob_loc CLOB, open_mode INTEGER, lobname text DEFAULT ':')
RETURNS CLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_open'
LANGUAGE C NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.append(INOUT dest_lob BLOB, src_lob BLOB, lobname text DEFAULT ':')
RETURNS BLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_append_blob'
LANGUAGE C IMMUTABLE NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.append(INOUT dest_lob CLOB, src_lob CLOB, lobname text DEFAULT ':')
RETURNS CLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_append_clob'
LANGUAGE C IMMUTABLE NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.close(INOUT lob_loc BLOB, lobname text DEFAULT ':')
RETURNS BLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_close'
LANGUAGE C STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.close(INOUT lob_loc CLOB, lobname text DEFAULT ':')
RETURNS CLOB
AS 'MODULE_PATHNAME', 'gms_lob_og_close'
LANGUAGE C STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.getlength(lob_loc BLOB, lobname text DEFAULT ':')
RETURNS INTEGER
AS 'MODULE_PATHNAME', 'gms_lob_og_bloblength'
LANGUAGE C IMMUTABLE STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.getlength(lob_loc CLOB, lobname text DEFAULT ':')
RETURNS INTEGER
AS 'MODULE_PATHNAME', 'gms_lob_og_cloblength'
LANGUAGE C IMMUTABLE STRICT NOT FENCED;
CREATE OR REPLACE FUNCTION gms_lob.getlength(lobname text DEFAULT ':')
RETURNS void
AS 'MODULE_PATHNAME', 'gms_lob_og_null'
LANGUAGE C IMMUTABLE STRICT NOT FENCED;

View File

@ -0,0 +1,5 @@
# gms_lob extension
comment = 'collection of stats data for PL/SQL applications'
default_version = '1.0'
module_pathname = '$libdir/gms_lob'
relocatable = true

899
contrib/gms_lob/gms_lob.cpp Normal file
View File

@ -0,0 +1,899 @@
/*------------------------------------------------------------------------------
* gms_lob.cpp
*
* gms_lob内置包的实现
*
* Copyright (c) 2002-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 2021, openGauss Contributors
*
* IDENTIFICATION
* contrib/gms_stats/gms_lob.cpp
*
*------------------------------------------------------------------------------
*/
#include "postgres.h"
#include "knl/knl_session.h"
#include "utils/memutils.h"
#include "catalog/pg_proc.h"
#include "c.h"
#include "miscadmin.h"
#include "access/xact.h"
#include "access/hash.h"
#include "utils/rel.h"
#include "utils/builtins.h"
#include "utils/syscache.h"
#include "access/genam.h"
#include "utils/lsyscache.h"
#include "executor/spi.h"
#include "lib/stringinfo.h"
#include "executor/executor.h"
#include "catalog/storage_gtt.h"
#include "utils/numeric.h"
#include "access/tuptoaster.h"
#include "funcapi.h"
#include "fmgr.h"
#include "catalog/pg_directory.h"
#include "mb/pg_wchar.h"
#include "libpq/pqformat.h"
#include "storage/ipc.h"
#include "utils/acl.h"
#include "utils/bytea.h"
#include "libpq/be-fsstubs.h"
#include "libpq/libpq-fs.h"
#include "commands/extension.h"
#include "gms_lob.h"
#include "utils/palloc.h"
PG_MODULE_MAGIC;
#define NUMLOB 64
static uint32 gmslob_index;
PG_FUNCTION_INFO_V1(gms_lob_og_createtemporary);
PG_FUNCTION_INFO_V1(gms_lob_og_freetemporary);
PG_FUNCTION_INFO_V1(gms_lob_og_read_blob);
PG_FUNCTION_INFO_V1(gms_lob_og_read_clob);
PG_FUNCTION_INFO_V1(gms_lob_og_write_blob);
PG_FUNCTION_INFO_V1(gms_lob_og_write_clob);
PG_FUNCTION_INFO_V1(gms_lob_og_isopen);
PG_FUNCTION_INFO_V1(gms_lob_og_open);
PG_FUNCTION_INFO_V1(gms_lob_og_append_blob);
PG_FUNCTION_INFO_V1(gms_lob_og_append_clob);
PG_FUNCTION_INFO_V1(gms_lob_og_close);
PG_FUNCTION_INFO_V1(gms_lob_og_cloblength);
PG_FUNCTION_INFO_V1(gms_lob_og_bloblength);
PG_FUNCTION_INFO_V1(gms_lob_og_null);
void init_session_vars(void) {
RepallocSessionVarsArrayIfNecessary();
GmsLobContext* psc =
(GmsLobContext*)MemoryContextAllocZero(u_sess->self_mem_cxt, sizeof(GmsLobContext));
u_sess->attr.attr_common.extension_session_vars_array[gmslob_index] = psc;
psc->gmsLobNameHash = NULL;
}
GmsLobContext* get_session_context() {
if (u_sess->attr.attr_common.extension_session_vars_array[gmslob_index] == NULL) {
init_session_vars();
}
return (GmsLobContext*)u_sess->attr.attr_common.extension_session_vars_array[gmslob_index];
}
static int32 getVarSize(varlena* var)
{
if (VARATT_IS_HUGE_TOAST_POINTER(var)) {
struct varatt_lob_external large_toast_pointer;
VARATT_EXTERNAL_GET_HUGE_POINTER(large_toast_pointer, var);
return large_toast_pointer.va_rawsize;
} else {
return VARSIZE_ANY_EXHDR(var);
}
}
/*
* charlen_to_bytelen()
* Compute the number of bytes occupied by n characters starting at *p
*
* It is caller's responsibility that there actually are n characters;
* the string need not be null-terminated.
*/
static int charlen_to_bytelen(const char* p, int n)
{
if (pg_database_encoding_max_length() == 1) {
/* Optimization for single-byte encodings */
return n;
} else {
const char* s = NULL;
for (s = p; n > 0; n--)
s += pg_mblen(s);
return s - p;
}
}
/* numeric 向下取整转成int4 */
int32 numericFloorToInt4(Numeric num)
{
Datum datumnum = DirectFunctionCall1(numeric_floor, NumericGetDatum(num));
return DatumGetInt32(DirectFunctionCall1(numeric_int4, datumnum));
}
/*****************************************************************************
* LOB哈希表相关
*****************************************************************************/
struct GmsLobHashKey {
char* keyvalue;
int length;
};
typedef struct LobHashEnt {
GmsLobHashKey key; /* hash表key值 */
int open_mode; /* 打开方式 */
} LobHashEnt;
/*
* lob数据的hash值生成函数
*/
uint32 lob_hash(const void* key, Size kwysize)
{
const GmsLobHashKey* hash_key = (const GmsLobHashKey*)key;
return DatumGetUInt32(hash_any((const unsigned char*)hash_key->keyvalue, hash_key->length));
}
/*
* lob数据的hash比较函数
*/
int lob_match(const void* key1, const void* key2, Size kwysize)
{
const GmsLobHashKey* k1 = (const GmsLobHashKey*)key1;
const GmsLobHashKey* k2 = (const GmsLobHashKey*)key2;
if (k1->length > k2->length) {
return 1;
} else if (k1->length < k2->length) {
return -1;
}
return strncmp(k1->keyvalue, k2->keyvalue, k1->length);
}
/*
* 创建hash表
*/
static HTAB* createlobHash()
{
HASHCTL hash_ctl;
hash_ctl.keysize = sizeof(GmsLobHashKey);
hash_ctl.entrysize = sizeof(LobHashEnt);
hash_ctl.hash = lob_hash;
hash_ctl.match = lob_match;
return hash_create("Lob hash", NUMLOB, &hash_ctl, HASH_ELEM | HASH_FUNCTION | HASH_COMPARE);
}
/*
* 程序退出时的清理函数
* 作为回调函数添加到proc_exit()调用的函数列表中
*/
static void gms_lob_og_lob_exit(int code, Datum arg)
{
HASH_SEQ_STATUS scan;
LobHashEnt *hentry = NULL;
if (get_session_context()->gmsLobNameHash == NULL) {
return;
}
hash_seq_init(&scan, get_session_context()->gmsLobNameHash);
while ((hentry = (LobHashEnt *)hash_seq_search(&scan))) {
if (hentry->key.keyvalue) {
pfree(hentry->key.keyvalue);
}
}
/* 清理hash表 */
hash_destroy(get_session_context()->gmsLobNameHash);
get_session_context()->gmsLobNameHash = NULL;
}
char* generateLobKey(char* argname)
{
char* key = NULL;
int keylen = 0;
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
TransactionId currentTransactionId = GetCurrentTransactionId();
// TransactionId采用16进制方式打印,逗号末尾结束符各占一个字节
keylen = strlen(argname) + sizeof(TransactionId) * 2 + 1 + 1;
key = (char*)palloc0(keylen);
errno_t errorno = snprintf_s(key, keylen, keylen - 1, "%16x,%s", currentTransactionId, argname);
securec_check_ss(errorno, "\0", "\0");
return key;
}
int searchLob(char* argname, bool* found)
{
LobHashEnt* hentry = NULL;
GmsLobHashKey hash_key;
if (get_session_context()->gmsLobNameHash) {
hash_key.keyvalue = generateLobKey(argname);
hash_key.length = strlen(hash_key.keyvalue) + 1;
hentry = (LobHashEnt*)hash_search(get_session_context()->gmsLobNameHash, &hash_key, HASH_FIND, NULL);
if (hentry) {
*found = true;
return hentry->open_mode;
}
if (hash_key.keyvalue) {
pfree(hash_key.keyvalue);
}
} else {
get_session_context()->gmsLobNameHash = createlobHash();
on_proc_exit(&gms_lob_og_lob_exit, PointerGetDatum(NULL));
}
*found = false;
return -1;
}
static void closeLob(char* argname)
{
bool found;
LobHashEnt* hentry = NULL;
GmsLobHashKey hash_key;
searchLob(argname, &found);
if (found) {
hash_key.keyvalue = generateLobKey(argname);
hash_key.length = strlen(hash_key.keyvalue) + 1;
hentry = (LobHashEnt*)hash_search(get_session_context()->gmsLobNameHash, &hash_key, HASH_REMOVE, NULL);
if (!hentry) {
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("undefined lob.")));
}
if (hash_key.keyvalue) {
pfree(hash_key.keyvalue);
}
if (hentry->key.keyvalue) {
pfree(hentry->key.keyvalue);
}
}
}
static void openLob(char* argname, int openmode)
{
bool found;
LobHashEnt* hentry = NULL;
GmsLobHashKey hash_key;
hash_key.keyvalue = generateLobKey(argname);
hash_key.length = strlen(hash_key.keyvalue) + 1;
hentry = (LobHashEnt*)hash_search(get_session_context()->gmsLobNameHash, &hash_key, HASH_ENTER, &found);
if (found) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_DUPLICATE_OBJECT),
errmsg("duplicate lob(%s) openned", argname)));
}
hentry->key.keyvalue = (char*)MemoryContextAlloc(THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR), hash_key.length);
int rc = memcpy_s(hentry->key.keyvalue, hash_key.length, hash_key.keyvalue, hash_key.length);
securec_check(rc, "\0", "\0");
hentry->key.length = hash_key.length;
hentry->open_mode = openmode;
if (hash_key.keyvalue) {
pfree(hash_key.keyvalue);
}
}
/*
* GMS_LOB.CREATETEMPORARY (
* lob_loc IN OUT BLOB/CLOB, --blob/clob对象
* cache IN BOOLEAN, --是否将LOB读取到缓冲区(不生效)
* dur IN PLS_INTEGER := GMS_LOB.SESSION); --指定何时清除临时LOB(10/ SESSION:会话结束时;12/ CALL:调用结束时)(不生效
)
*/
Datum gms_lob_og_createtemporary(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(3));
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
varlena* res = NULL;
if (PG_ARGISNULL(0)) {
res = (varlena*)palloc(VARHDRSZ);
SET_VARSIZE(res, VARHDRSZ);
PG_RETURN_POINTER(res);
}
PG_RETURN_DATUM(PG_GETARG_DATUM(0));
}
/*
* GMS_LOB.FREETEMPORARY (
* lob_loc IN OUT BLOB/CLOB); --blob/clob对象
*/
Datum gms_lob_og_freetemporary(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(1));
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
/* lob如果没关闭,将其关闭 */
closeLob(argname);
/* 返回一个空值的varlena */
varlena* res = (varlena*)palloc0(VARHDRSZ);
SET_VARSIZE(res, VARHDRSZ);
PG_RETURN_DATUM(PointerGetDatum(res));
}
/*
* lob_loc IN BLOB,
* amount IN OUT NOCOPY BINARY_INTEGER,
* offset IN INTEGER,
* buffer INOUT RAW
*/
Datum gms_lob_og_read_blob(PG_FUNCTION_ARGS)
{
if (PG_ARGISNULL(0))
ereport(ERROR,(errcode(ERRCODE_INVALID_PARAMETER_VALUE),errmsg("invalid LOB object specified")));
if (PG_ARGISNULL(1) || PG_ARGISNULL(2)) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("numeric or value error")));
}
bytea *src_lob = PG_GETARG_BYTEA_P(0);
int32 amount = PG_GETARG_INT32(1);
int32 offset = PG_GETARG_INT32(2);
if (amount < 1 || amount > AMOUNT_MAX_SIZE) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("amount is invalid or out of range")));
}
if (offset < 1 || offset > LOBMAXSIZE) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("offset is invalid or out of range")));
}
int32 srclen = VARSIZE(src_lob) - VARHDRSZ;
if (offset > srclen) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("no data found")));
}
int32 srcamount = amount > (srclen - offset + 1) ? (srclen - offset + 1) : amount; //src实际复制的字节数
bytea* res = NULL;
int rc = 0;
res = (bytea*)palloc0(srcamount + VARHDRSZ);
SET_VARSIZE(res, srcamount + VARHDRSZ);
rc = memcpy_s(VARDATA(res), srcamount, VARDATA(src_lob) + offset - 1, srcamount);
securec_check(rc, "\0", "\0");
TupleDesc tupdesc;
Datum result;
HeapTuple tuple;
Datum values[2];
bool nulls[2] = { false, false };
/* 构造返回结果集 */
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) {
elog(ERROR, "return type must be a row type");
}
/*拼接结果*/
values[0] = Int32GetDatum(srcamount);
values[1] = PointerGetDatum(res);
tuple = heap_form_tuple(tupdesc, values, nulls);
result = HeapTupleGetDatum(tuple);
PG_RETURN_DATUM(result);
}
/*
* lob_loc IN CLOB,
* amount IN OUT NOCOPY BINARY_INTEGER,
* offset IN INTEGER,
* buffer INOUT VARCHAR2
*/
Datum gms_lob_og_read_clob(PG_FUNCTION_ARGS)
{
if (PG_ARGISNULL(0))
ereport(ERROR,(errcode(ERRCODE_INVALID_PARAMETER_VALUE),errmsg("invalid LOB object specified")));
if (PG_ARGISNULL(1) || PG_ARGISNULL(2)) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("numeric or value error")));
}
text* src_lob = PG_GETARG_TEXT_P(0);
int32 amount = PG_GETARG_INT32(1);
int32 offset = PG_GETARG_INT32(2);
if (amount < 1 || amount > AMOUNT_MAX_SIZE) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("amount is invalid or out of range")));
}
if (offset < 1 || offset > LOBMAXSIZE) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("offset is invalid or out of range")));
}
int32 srclen = DirectFunctionCall1(textlen, PointerGetDatum(src_lob));
if (offset > srclen) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("no data found")));
}
int32 srcamount = amount > (srclen - offset + 1) ? (srclen - offset + 1) : amount; //src实际复制的字符数
int32 srcbytestart = charlen_to_bytelen(VARDATA(src_lob), offset - 1); //src复制起点
int32 copybyte = charlen_to_bytelen(VARDATA(src_lob) + srcbytestart, srcamount); //src实际复制的字节数
text* res = NULL;
int rc = 0;
res = (text*)palloc0(copybyte + VARHDRSZ);
SET_VARSIZE(res, copybyte + VARHDRSZ);
rc = memcpy_s(VARDATA(res), copybyte, VARDATA(src_lob) + srcbytestart, copybyte);
securec_check(rc, "\0", "\0");
TupleDesc tupdesc;
Datum result;
HeapTuple tuple;
Datum values[2];
bool nulls[2] = { false, false };
/* 构造返回结果集 */
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) {
elog(ERROR, "return type must be a row type");
}
/*拼接结果*/
values[0] = Int32GetDatum(srcamount);
values[1] = PointerGetDatum(res);
tuple = heap_form_tuple(tupdesc, values, nulls);
result = HeapTupleGetDatum(tuple);
PG_RETURN_DATUM(result);
}
/*
* GMS_LOB.WRITE (
* lob_loc IN OUT NOCOPY BLOB, --目标blob对象
* amount IN INTEGER, --指定的传入字节数
* offset IN INTEGER, --开始读取blob的字节数的偏移量(原点在1)
* buffer IN RAW); --用于写的输入缓冲区
*/
Datum gms_lob_og_write_blob(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(4));
/* check input args */
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
if (PG_ARGISNULL(0)) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid LOB object specified")));
}
if (PG_ARGISNULL(1) || PG_ARGISNULL(2)) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("Any of the input parameters are NULL")));
}
bytea* destlob = PG_GETARG_BYTEA_P(0);
int32 amount = numericFloorToInt4(PG_GETARG_NUMERIC(1));
int32 offset = numericFloorToInt4(PG_GETARG_NUMERIC(2));
bytea* buffer = PG_GETARG_BYTEA_P(3);
int32 bufsize = getVarSize(buffer);
if (amount < 1 || amount > 32767 || amount > bufsize) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("amount is invalid or out of range")));
}
if (offset < 1 || offset > LOBMAXSIZE) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("Invalid argument value for dest_offset.")));
}
/* check lob's write and read permissions */
bool found;
int32 openmode = searchLob(argname, &found);
if (found && openmode == 0) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_OPERATION),
errmsg("cannot update a LOB opened in read-only mode.")));
}
int32 destlen = getVarSize(destlob);
int destbytestart = (offset - 1) > destlen ? destlen : (offset - 1);
int32 spacecnt = (offset - 1) > destlen ? (offset - destlen - 1) : 0;
int32 appendbyte = amount;
int32 destbyteend = (offset - 1 + appendbyte) > destlen ? destlen : (offset - 1 + appendbyte);
int64 reslen = destbytestart + spacecnt + appendbyte + (destlen - destbyteend);
bytea* res = NULL;
char* resdata = NULL;
int rc = 0;
if (reslen != destlen || buffer == destlob) {
/* dest is lack of space, or displaced copy when
* buffer is the same as destlob, to avoid errors
* in memcpy_s checking, reapply
*/
if (reslen > MAX_TOAST_CHUNK_SIZE - VARHDRSZ) {
#ifdef ENABLE_MULTIPLE_NODES
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Un-support clob/blob type more than 1GB for distributed system")));
#endif
}
res = (bytea*)palloc(reslen + VARHDRSZ);
SET_VARSIZE(res, reslen + VARHDRSZ);
} else {
res = destlob;
}
resdata = VARDATA(res);
if (destbytestart > 0 && res != destlob) {
rc = memcpy_s(resdata, destbytestart, VARDATA(destlob), destbytestart);
securec_check(rc, "\0", "\0");
}
resdata += destbytestart;
if (spacecnt > 0) {
rc = memset_s(resdata, spacecnt, ' ', spacecnt);
securec_check(rc, "\0", "\0");
}
resdata += spacecnt;
if (appendbyte > 0) {
rc = memcpy_s(resdata, appendbyte, VARDATA(buffer), appendbyte);
securec_check(rc, "\0", "\0");
}
resdata += appendbyte;
if (destbyteend < destlen && res != destlob) {
rc = memcpy_s(resdata, destlen - destbyteend, VARDATA(destlob) + destbyteend, destlen - destbyteend);
securec_check(rc, "\0", "\0");
}
PG_RETURN_BYTEA_P(res);
}
/*
* GMS_LOB.WRITE (
* lob_loc IN OUT NOCOPY CLOB CHARACTER SET ANY_CS, --目标clob对象
* amount IN INTEGER, --指定传入的字符数
* offset IN INTEGER, --开始读取blob的字符数的偏移量(原点在1)
* buffer IN VARCHAR2 CHARACTER SET lob_loc%CHARSET); --用于写入的缓冲区
*/
Datum gms_lob_og_write_clob(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(4));
/* check input args */
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
if (PG_ARGISNULL(0)) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid LOB object specified")));
}
if (PG_ARGISNULL(1) || PG_ARGISNULL(2)) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("Any of the input parameters are NULL")));
}
text* destlob = PG_GETARG_TEXT_P(0);
int32 amount = numericFloorToInt4(PG_GETARG_NUMERIC(1));
int32 offset = numericFloorToInt4(PG_GETARG_NUMERIC(2));
text* buffer = PG_GETARG_TEXT_P(3);
int32 bufsize = DirectFunctionCall1(textlen, (Datum)buffer);
if (amount < 1 || amount > 32767 || amount > bufsize) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("amount is invalid or out of range")));
}
if (offset < 1 || offset > LOBMAXSIZE) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("Invalid argument value for dest_offset.")));
}
/* check lob's write and read permissions */
bool found;
int32 openmode = searchLob(argname, &found);
if (found && openmode == 0) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_OPERATION),
errmsg("cannot update a LOB opened in read-only mode.")));
}
int32 destlen = DirectFunctionCall1(textlen, (Datum)destlob);
int32 srcamount = amount;
int32 destbytestart = 0;
int32 spacecnt = 0;
int32 appendbyte = charlen_to_bytelen(VARDATA(buffer), srcamount);
int32 destamount = 0;
int32 destbyteend = 0;
int32 destbytecnt = VARSIZE(destlob) - VARHDRSZ;
int64 reslen = 0;
text* res = NULL;
char* resdata = NULL;
int rc = 0;
if (destlen < offset - 1) {
destamount = destlen;
spacecnt = offset - 1 - destamount;
destbytestart = destbytecnt;
destbyteend = destbytecnt;
} else {
destamount = srcamount > (destlen - offset + 1) ? (destlen - offset + 1) : srcamount;
destbytestart = charlen_to_bytelen(VARDATA(destlob), offset - 1);
destbyteend = charlen_to_bytelen(VARDATA(destlob) + destbytestart, destamount) + destbytestart;
}
reslen = destbytestart + spacecnt + appendbyte + (destbytecnt - destbyteend);
if (reslen != destbytecnt || buffer == destlob) {
/* dest is lack of space, or displaced copy when
* buffer is the same as destlob, to avoid errors
* in memcpy_s checking, reapply
*/
if (reslen > MAX_TOAST_CHUNK_SIZE - VARHDRSZ) {
#ifdef ENABLE_MULTIPLE_NODES
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Un-support clob/blob type more than 1GB for distributed system")));
#endif
}
res = (text*)palloc(reslen + VARHDRSZ);
SET_VARSIZE(res, reslen + VARHDRSZ);
} else {
res = destlob;
}
resdata = VARDATA(res);
if (destbytestart > 0 && res != destlob) {
rc = memcpy_s(resdata, destbytestart, VARDATA(destlob), destbytestart);
securec_check(rc, "\0", "\0");
}
resdata += destbytestart;
if (spacecnt > 0) {
rc = memset_s(resdata, spacecnt, ' ', spacecnt);
securec_check(rc, "\0", "\0");
}
resdata += spacecnt;
if (appendbyte > 0) {
rc = memcpy_s(resdata, appendbyte, VARDATA(buffer), appendbyte);
securec_check(rc, "\0", "\0");
}
resdata += appendbyte;
if (destbyteend < destbytecnt && res != destlob) {
rc = memcpy_s(resdata, destbytecnt - destbyteend, VARDATA(destlob) + destbyteend, destbytecnt - destbyteend);
securec_check(rc, "\0", "\0");
}
PG_RETURN_TEXT_P(res);
}
/*
* GMS_LOB.ISOPEN (
* lob_loc IN OUT BLOB/CLOB); --blob/clob对象
*/
Datum gms_lob_og_isopen(PG_FUNCTION_ARGS)
{
bool found;
char* argname = text_to_cstring(PG_GETARG_TEXT_P(1));
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
searchLob(argname, &found);
if (found) {
PG_RETURN_UINT8(1);
} else {
PG_RETURN_UINT8(0);
}
}
/*
* GMS_LOB.OPEN (
* lob_loc IN OUT BLOB/CLOB,
* open_mode IN BINARY_INTEGER);
*/
Datum gms_lob_og_open(PG_FUNCTION_ARGS)
{
if PG_ARGISNULL(0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid LOB object specified")));
}
bool found;
int openmode = PG_GETARG_INT32(1);
if (openmode != 0 && openmode != 1) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid open_mode")));
}
char* argname = text_to_cstring(PG_GETARG_TEXT_P(2));
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
searchLob(argname, &found);
if (found) {
ereport(NOTICE, (errmsg("Lob(%s) already opened in the same transaction", argname)));
PG_RETURN_DATUM(PG_GETARG_DATUM(0));
}
openLob(argname, openmode);
PG_RETURN_DATUM(PG_GETARG_DATUM(0));
}
/*
GMS_LOB.APPEND (
dest_lob IN OUT NOCOPY BLOB, --目标blob对象
src_lob IN BLOB); --源blob对象
*/
Datum gms_lob_og_append_blob(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(2));
/* check input args */
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid LOB object specified")));
}
/* check lob's write and read permissions */
bool found;
int32 openmode = searchLob(argname, &found);
if (found && openmode == 0) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_OPERATION),
errmsg("cannot update a LOB opened in read-only mode.")));
}
Datum destlob = PG_GETARG_DATUM(0);
Datum srclob = PG_GETARG_DATUM(1);
Datum result = DirectFunctionCall2(byteacat, destlob, srclob);
PG_RETURN_BYTEA_P(DatumGetPointer(result));
}
/*
GMS_LOB.APPEND (
dest_lob IN OUT NOCOPY CLOB CHARACTER SET ANY_CS, --目标clob对象
src_lob IN CLOB CHARACTER SET dest_lob%CHARSET); --源clob对象
*/
Datum gms_lob_og_append_clob(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(2));
/* check input args */
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid LOB object specified")));
}
/* check lob's write and read permissions */
bool found;
int32 openmode = searchLob(argname, &found);
if (found && openmode == 0) {
closeLob(argname);
ereport(ERROR,
(errcode(ERRCODE_INVALID_OPERATION),
errmsg("cannot update a LOB opened in read-only mode.")));
}
Datum destlob = PG_GETARG_DATUM(0);
Datum srclob = PG_GETARG_DATUM(1);
Datum result = DirectFunctionCall2(textcat, destlob, srclob);
PG_RETURN_TEXT_P(DatumGetPointer(result));
}
/*
* GMS_LOB.CLOSE (
* lob_loc IN OUT BLOB/CLOB); --blob/clob对象
*/
Datum gms_lob_og_close(PG_FUNCTION_ARGS)
{
char* argname = text_to_cstring(PG_GETARG_TEXT_P(1));
if (strcmp(argname, ":") == 0) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("output parameter not a bind variable")));
}
bool found;
searchLob(argname, &found);
if (!found) {
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("cannot perform operation on an unopened file or LOB")));
}
closeLob(argname);
PG_RETURN_DATUM(PG_GETARG_DATUM(0));
}
/*
* GMS_LOB.getlength (
* lob_loc IN OUT CLOB); --clob对象
*/
Datum gms_lob_og_cloblength(PG_FUNCTION_ARGS)
{
Datum data = PG_GETARG_DATUM(0);
int datalen = 0;
datalen = DirectFunctionCall1(textlen, data);
PG_RETURN_INT32(datalen);
}
/*
* GMS_LOB.getlength (
* lob_loc IN OUT BLOB); --blob对象
*/
Datum gms_lob_og_bloblength(PG_FUNCTION_ARGS)
{
bytea* data = PG_GETARG_BYTEA_P(0);
int datalen = 0;
datalen = VARSIZE(data) - VARHDRSZ;
PG_RETURN_INT32(datalen);
}
/*
* GMS_LOB.getlength (); --NULL对象
*/
Datum gms_lob_og_null(PG_FUNCTION_ARGS)
{
PG_RETURN_VOID();
}

37
contrib/gms_lob/gms_lob.h Normal file
View File

@ -0,0 +1,37 @@
/*---------------------------------------------------------------------------------------*
* gms_lob.h
*
* Definition about gms_lob package.
*
* IDENTIFICATION
* contrib/gms_stats/gms_lob.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef GMS_LOB_H
#define GMS_LOB_H
/* blob/clob最大存储长度1G*/
#define LOBMAXSIZE (int64)0x3fffffff
#define AMOUNT_MAX_SIZE 32767
typedef struct GmsLobContext {
struct HTAB* gmsLobNameHash;
} GmsLobContext;
extern "C" Datum gms_lob_og_createtemporary(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_freetemporary(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_read_blob(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_read_clob(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_write_blob(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_write_clob(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_isopen(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_open(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_append_blob(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_append_clob(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_close(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_cloblength(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_bloblength(PG_FUNCTION_ARGS);
extern "C" Datum gms_lob_og_null(PG_FUNCTION_ARGS);
extern "C" void set_extension_index(uint32 index);
extern "C" void init_session_vars(void);
extern "C" GmsLobContext* get_session_context();
#endif

View File

@ -0,0 +1,990 @@
drop database if exists testlob;
create database testlob;
\c testlob
create extension gms_lob;
create extension gms_output;
select gms_output.enable(4000);
create or replace function cast_to_raw(strdata varchar2) returns raw
as 'select encode(cast($1 as bytea), ''hex'')::raw;'LANGUAGE SQL;
--blob类型长度
CREATE TABLE testblob(id INT, b BLOB);
--cast_to_raw
INSERT INTO testblob VALUES(1, cast_to_raw('Blob'));
INSERT INTO testblob VALUES(2, cast_to_raw('中文测试'));
INSERT INTO testblob VALUES(3, cast_to_raw(''));
INSERT INTO testblob VALUES(4, cast_to_raw('test
test'));
SELECT id, gms_lob.getlength(b) FROM testblob;
DROP TABLE testblob;
--clob类型的长度
CREATE TABLE testclob(id INT, b CLOB);
INSERT INTO testclob VALUES(1, ('Blob'));
INSERT INTO testclob VALUES(2, ('中文测试'));
INSERT INTO testclob VALUES(3, (''));
INSERT INTO testclob VALUES(4, ('test
test'));
SELECT *,gms_lob.getlength(b) FROM testclob;
DROP TABLE testclob;
--
CREATE OR REPLACE FUNCTION fun_blob() RETURNS INTEGER LANGUAGE plpgsql AS $$
DECLARE
lob_object BLOB := cast_to_raw('中文1');
offset INTEGER;
BEGIN
RETURN gms_lob.getlength(lob_object);
END;
$$;
SELECT fun_blob();
CREATE OR REPLACE FUNCTION fun_clob() RETURNS INTEGER LANGUAGE plpgsql AS $$
DECLARE
lob_object CLOB := ('中文1');
offset INTEGER;
BEGIN
RETURN gms_lob.getlength(lob_object);
END;
$$;
SELECT fun_clob();
CREATE OR REPLACE FUNCTION fun_null() RETURNS INTEGER LANGUAGE plpgsql AS $$
DECLARE
lob_object CLOB;
offset INTEGER;
BEGIN
RETURN gms_lob.getlength(lob_object);
END;
$$;
SELECT fun_null();
DROP FUNCTION fun_blob;
DROP FUNCTION fun_clob;
DROP FUNCTION fun_null;
--
SELECT gms_lob.getlength();
create table tbl_testlob(id int, c_lob clob, b_lob blob);
insert into tbl_testlob values(1, 'clob', cast_to_raw('blob'));
insert into tbl_testlob values(2, '中文clobobject测试', cast_to_raw('中文blobobject测试'));
create or replace function func_clob() returns void
AS $$
DECLARE
v_clob1 clob;
v_clob2 clob;
v_clob3 clob;
len1 int;
len3 int;
BEGIN
select c_lob into v_clob1 from tbl_testlob where id = 1;
gms_lob.open(v_clob1, gms_lob.LOB_READWRITE);
gms_lob.append(v_clob1, ' test');
len1 := gms_lob.getlength(v_clob1);
gms_output.put_line('clob2:' || v_clob2);
gms_lob.read(v_clob1, len1, 1, v_clob2);
gms_output.put_line('clob1:' || v_clob1);
gms_output.put_line('clob2:' || v_clob2);
select c_lob into v_clob3 from tbl_testlob where id = 2;
len3 := gms_lob.getlength(v_clob3);
gms_output.put_line('clob3:' || v_clob3);
--open函数
gms_lob.write(v_clob3, len1, len3, v_clob1);
gms_output.put_line('clob3:' || v_clob3);
gms_lob.close(v_clob1);
gms_lob.freetemporary(v_clob2);
END;
$$LANGUAGE plpgsql;
create or replace function func_blob() returns void
AS $$
DECLARE
v_blob1 blob;
v_blob2 blob;
v_blob3 blob;
len1 int;
len3 int;
BEGIN
select b_lob into v_blob1 from tbl_testlob where id = 1;
gms_lob.open(v_blob1, gms_lob.LOB_READWRITE);
len1 := gms_lob.getlength(v_blob1);
gms_output.put_line('blob1:' || v_blob1::text);
gms_output.put_line('blob2:' || v_blob2::text);
gms_lob.read(v_blob1, len1, 1, v_blob2);
gms_output.put_line('blob1:' || v_blob1::text);
gms_output.put_line('blob2:' || v_blob2::text);
select b_lob into v_blob3 from tbl_testlob where id = 2;
len3 := gms_lob.getlength(v_blob3);
--open函数
gms_output.put_line('blob3:' || v_blob3::text);
gms_lob.write(v_blob3, len1, len3, v_blob1);
gms_output.put_line('blob3:' || v_blob3::text);
gms_lob.close(v_blob1);
gms_lob.freetemporary(v_blob2);
END;
$$LANGUAGE plpgsql;
select func_clob();
select func_blob();
----------open函数-----------
--(1)打开无效的lob
DECLARE
v_clob clob;
BEGIN
gms_lob.open(v_clob, gms_lob.LOB_READWRITE);
gms_lob.close(v_clob);
END;
/
--2open_mode为数值
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false, 10);
gms_lob.open(v_clob, 1);
gms_lob.close(v_clob);
gms_lob.freetemporary(v_clob);
END;
/
--3open_mode为其他值
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false);
gms_lob.open(v_clob, 100);
gms_lob.close(v_clob);
gms_lob.freetemporary(v_clob);
END;
/
--
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false);
gms_lob.open(v_clob, gms_lob.LOB_READONLY);
gms_lob.open(v_clob, gms_lob.LOB_READWRITE);
gms_lob.close(v_clob);
gms_lob.freetemporary(v_clob);
END;
/
-- 大写名称
declare
"MYLOB" CLOB;
begin
gms_lob.createtemporary("MYLOB",true);
gms_lob.open("MYLOB",gms_lob.lob_readwrite);
"MYLOB":='foo';
raise notice '%',"MYLOB";
end;
/
----------isopen函数-----------
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false);
gms_lob.open(v_clob, gms_lob.LOB_READWRITE);
gms_output.put_line('isopen: ' || gms_lob.isopen(v_clob));
gms_lob.close(v_clob);
gms_output.put_line('isopen: ' || gms_lob.isopen(v_clob));
gms_lob.freetemporary(v_clob);
END;
/
-----------freetemporary函数-----------
DECLARE
v_clob CLOB;
v_char VARCHAR2(100);
BEGIN
v_char := 'Chinese中国人';
gms_lob.createtemporary(v_clob,TRUE,12);
gms_lob.append(v_clob,v_char);
gms_output.put_line(v_clob||' 字符长度:'||gms_lob.getlength(v_clob));
gms_lob.freetemporary(v_clob);
gms_output.put_line(' 释放后再输出:'||v_clob);
END;
/
drop table tbl_testlob;
drop function func_clob;
drop function func_blob;
declare
lob1 clob := '123';
lob2 clob := '456';
lob3 clob := '789';
begin
gms_lob.open (lob_loc => lob1,open_mode => 1);
gms_lob.open (lob_loc => lob2,open_mode => gms_lob.lob_readwrite);
gms_lob.open (lob_loc => lob3,open_mode => gms_lob.lob_readonly);
raise notice '%,%,%',lob1,lob2,lob3;
end;
/
-- 支持GMS_LOB.WRITE/READ/APPEND函数
-----------read函数-----------
--gms_lob.gms_lob_read_blob
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
-- float
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.2;
off_set float :=2.1;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.8;
off_set float :=2.9;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.8;
off_set float :=2.9;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=8;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=20;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, b2);
gms_output.put_line(r1::text);
end;
/
--VALUEERROR
--lob为空
declare
b1 blob;
amount INTEGER :=3;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--amount为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER;
off_set INTEGER :=9;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--offset为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--lob无效
declare
amount INTEGER :=3;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.read(cast_to_raw('111111'), amount, off_set, r1);
end;
/
--amount大于buffer大小
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=15;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--offset超出范围
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER :=30;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--lob只读
declare
b1 blob :=cast_to_raw('1111');
amount INTEGER :=2;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.open(b1, gms_lob.LOB_READONLY);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
--gms_lob.gms_lob_read_clob
declare
c1 clob :='abcdefgh';
amount INTEGER :=3;
off_set INTEGER :=1;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
declare
c1 clob :='abcdefgh';
amount INTEGER :=3;
off_set INTEGER :=9;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
declare
c1 clob :='abcdefgh';
amount INTEGER :=10;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--VALUEERROR
--lob为空
declare
c1 clob;
amount INTEGER :=3;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--amount为空
declare
c1 clob :='abcdefgh';
amount INTEGER;
off_set INTEGER :=1;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--offset为空
declare
c1 clob :='abcdefgh';
amount INTEGER :=3;
off_set INTEGER;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--lob无效
declare
c1 clob;
amount INTEGER :=3;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--amount大于buffer大小
declare
c1 clob :='abcdefgh';
amount INTEGER :=6;
off_set INTEGER :=2;
var_buf varchar2(3);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--offset超出范围
declare
c1 clob :='abcdefgh';
amount INTEGER :=2;
off_set INTEGER :=0;
var_buf varchar2(3);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--lob只读
declare
c1 clob :='1111';
amount INTEGER :=2;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.open(c1, gms_lob.LOB_READONLY);
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
-----------write函数-----------
--gms_lob.gms_lob_write_blob
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=8;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=20;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
--buffer等于destlob
declare
b1 blob :=cast_to_raw('1234');
amount INTEGER :=2;
off_set INTEGER :=2;
begin
gms_lob.write(b1, amount, off_set, b1);
gms_output.put_line(b1::text);
end;
/
--VALUEERROR
--lob为空
declare
b1 blob;
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--amount为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER;
off_set INTEGER :=9;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--amount,offset向下取整
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.9; -- 3
off_set float :=5.6; -- 5
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=2.2; -- 2
off_set float :=5.1; -- 5
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=4;
off_set INTEGER :=8;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
--offset为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--lob无效
declare
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(cast_to_raw('111111'), amount, off_set, b2);
end;
/
--amount大于buffer大小
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=5;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--offset超出范围
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER :=0;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--lob只读
declare
b1 blob :=cast_to_raw('1111');
amount INTEGER :=2;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.open(b1, gms_lob.LOB_READONLY);
gms_lob.write(b1, amount, off_set, b2);
end;
/
--gms_lob.gms_lob_write_clob
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=1;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
-- amount, off_set 不向下取整
declare
c1 clob :='11111111';
amount INTEGER :=3.9;
off_set INTEGER :=1.8;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=1.8;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=9;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=10;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
--buffer等于destlob
declare
c1 clob :='1234';
amount INTEGER :=2;
off_set INTEGER :=2;
begin
gms_lob.write(c1, amount, off_set, c1);
gms_output.put_line(c1::text);
end;
/
--VALUEERROR
--lob为空
declare
c1 clob;
amount INTEGER :=3;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--amount为空
declare
c1 clob :='11111111';
amount INTEGER;
off_set INTEGER :=10;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--offset为空
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--lob无效
declare
amount INTEGER :=3;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.write('11111111', amount, off_set, c2);
end;
/
--amount大于buffer大小
declare
c1 clob :='11111111';
amount INTEGER :=5;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--offset超出范围
declare
c1 clob :='11111111';
amount INTEGER :=2;
off_set INTEGER :=0;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--lob只读
declare
c1 clob :='1111';
amount INTEGER :=2;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.open(c1, gms_lob.LOB_READONLY);
gms_lob.write(c1, amount, off_set, c2);
end;
/
-----------append函数-----------
--gms_lob.gms_lob_append_blob
declare
b1 blob :=cast_to_raw('11111111');
b2 blob :=cast_to_raw('222');
begin
gms_lob.append(b1, b2);
gms_output.put_line(b1::text);
end;
/
--VALUEERROR
--destlob为空
declare
b1 blob;
b2 blob :=cast_to_raw('222');
begin
gms_lob.append(b1, b2);
end;
/
--srclob为空
declare
b1 blob :=cast_to_raw('11111111');
b2 blob;
begin
gms_lob.append(b1, b2);
end;
/
--lob无效
declare
b2 blob :=cast_to_raw('222');
begin
gms_lob.append(cast_to_raw('1111'), b2);
end;
/
--lob只读
declare
b1 blob :=cast_to_raw('1111');
b2 blob :=cast_to_raw('222');
begin
gms_lob.open(b1, gms_lob.LOB_READONLY);
gms_lob.append(b1, b2);
end;
/
--gms_lob.gms_lob_append_clob
declare
c1 clob :='11111111';
c2 clob :='222';
begin
gms_lob.append(c1, c2);
gms_output.put_line(c1::text);
end;
/
--VALUEERROR
--destlob为空
declare
c1 clob;
c2 clob :='222';
begin
gms_lob.append(c1, c2);
end;
/
--srclob为空
declare
c1 clob :='11111111';
c2 clob;
begin
gms_lob.append(c1, c2);
end;
/
--lob无效
declare
c2 clob :='222';
begin
gms_lob.append('1111', c2);
end;
/
--lob只读
declare
c1 clob :='1111';
c2 clob :='222';
begin
gms_lob.open(c1, gms_lob.LOB_READONLY);
gms_lob.append(c1, c2);
end;
/
declare
b1 blob :=cast_to_raw('ABC123');
amount INTEGER :=3;
off_set INTEGER :=100;
b2 blob :=cast_to_raw('abc');
c1 int;
BEGIN
gms_lob.write(b1,amount,off_set,b2);
gms_output.put_line(b1::text);
c1:=gms_lob.getlength(b1);
gms_output.put_line(c1);
end;
/
declare
c1 clob :='ABC123';
amount INTEGER :=3;
off_set INTEGER :=100;
c2 clob :='abc';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
b1 blob :=null;
b2 blob :=cast_to_raw('abc');
BEGIN
gms_lob.append(b1,b2);
gms_output.put_line(b1::text);
end;
/
drop table if exists lob_mvcc;
create table lob_mvcc(id int, c_lob clob, b_lob blob);
insert into lob_mvcc values(1, 'clob', cast_to_raw('blob'));
insert into lob_mvcc values(2, '中文clobobject测试', cast_to_raw('中文blobobject测试'));
select * from lob_mvcc order by id;
declare
c1 clob;
c2 clob :='222test';
begin
select c_lob into c1 from lob_mvcc where id=1 for update;
gms_lob.append(c1, c2);
end;
/
select * from lob_mvcc order by id;
drop table lob_mvcc;
create or replace procedure proc_1034970
as
b1 clob :='测试';
b2 clob :='测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试';
begin
gms_lob.open(b1,gms_lob.lob_readwrite);
for i in 1..100 loop
gms_lob.append(b1,b2);
end loop;
end;
/
call proc_1034970();
drop procedure proc_1034970;
\c contrib_regression
drop database if exists testlob;

View File

@ -0,0 +1,21 @@
#This is the main CMAKE for build all gms_sql.
# gms_sql
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} TGT_gms_sql_SRC)
set(TGT_gms_sql_INC
${PROJECT_OPENGS_DIR}/contrib/gms_sql
${PROJECT_OPENGS_DIR}/contrib
)
set(gms_sql_DEF_OPTIONS ${MACRO_OPTIONS})
set(gms_sql_COMPILE_OPTIONS ${OPTIMIZE_OPTIONS} ${OS_OPTIONS} ${PROTECT_OPTIONS} ${WARNING_OPTIONS} ${LIB_SECURE_OPTIONS} ${CHECK_OPTIONS})
set(gms_sql_LINK_OPTIONS ${LIB_LINK_OPTIONS})
add_shared_libtarget(gms_sql TGT_gms_sql_SRC TGT_gms_sql_INC "${gms_sql_DEF_OPTIONS}" "${gms_sql_COMPILE_OPTIONS}" "${gms_sql_LINK_OPTIONS}")
set_target_properties(gms_sql PROPERTIES PREFIX "")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_sql.control
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gms_sql--1.0.sql
DESTINATION share/postgresql/extension/
)
install(TARGETS gms_sql DESTINATION lib/postgresql)

28
contrib/gms_sql/Makefile Normal file
View File

@ -0,0 +1,28 @@
# contrib/gms_sql/Makefile
MODULE_big = gms_sql
OBJS = gms_sql.o
EXTENSION = gms_sql
DATA = gms_sql--1.0.sql
exclude_option = -fPIE
override CPPFLAGS := -fstack-protector-strong $(filter-out $(exclude_option),$(CPPFLAGS))
REGRESS = gms_sql
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/gms_sql
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
regress_home = $(top_builddir)/src/test/regress
REGRESS_OPTS = -c 0 -d 1 -r 1 -p 25632 --single_node -w --keep_last_data=false \
--regconf=$(regress_home)/regress.conf \
--temp-config=$(regress_home)/make_fastcheck_postgresql.conf
include $(top_srcdir)/contrib/contrib-global.mk
endif
gms_sql.o: gms_sql.cpp

View File

@ -0,0 +1 @@
The openGauss regression needs this file to run.

View File

@ -0,0 +1,753 @@
CREATE EXTENSION gms_sql;
set gms_sql_max_open_cursor_count = 501;
ERROR: 501 is outside the valid range for parameter "gms_sql_max_open_cursor_count" (10 .. 500)
reset gms_sql_max_open_cursor_count;
show gms_sql_max_open_cursor_count;
gms_sql_max_open_cursor_count
-------------------------------
100
(1 row)
do $$
declare
c int;
strval varchar;
intval int;
nrows int default 30;
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'select ''ahoj'' || i, i from generate_series(1, :nrows) g(i)', gms_sql.v6);
gms_sql.bind_variable(c, 'nrows', nrows);
gms_sql.define_column(c, 1, strval);
gms_sql.define_column(c, 2, intval);
perform gms_sql.execute(c);
while gms_sql.fetch_rows(c) > 0
loop
gms_sql.column_value(c, 1, strval);
gms_sql.column_value(c, 2, intval);
raise notice 'c1: %, c2: %', strval, intval;
end loop;
gms_sql.close_cursor(c);
end;
$$;
NOTICE: c1: ahoj1, c2: 1
NOTICE: c1: ahoj2, c2: 2
NOTICE: c1: ahoj3, c2: 3
NOTICE: c1: ahoj4, c2: 4
NOTICE: c1: ahoj5, c2: 5
NOTICE: c1: ahoj6, c2: 6
NOTICE: c1: ahoj7, c2: 7
NOTICE: c1: ahoj8, c2: 8
NOTICE: c1: ahoj9, c2: 9
NOTICE: c1: ahoj10, c2: 10
NOTICE: c1: ahoj11, c2: 11
NOTICE: c1: ahoj12, c2: 12
NOTICE: c1: ahoj13, c2: 13
NOTICE: c1: ahoj14, c2: 14
NOTICE: c1: ahoj15, c2: 15
NOTICE: c1: ahoj16, c2: 16
NOTICE: c1: ahoj17, c2: 17
NOTICE: c1: ahoj18, c2: 18
NOTICE: c1: ahoj19, c2: 19
NOTICE: c1: ahoj20, c2: 20
NOTICE: c1: ahoj21, c2: 21
NOTICE: c1: ahoj22, c2: 22
NOTICE: c1: ahoj23, c2: 23
NOTICE: c1: ahoj24, c2: 24
NOTICE: c1: ahoj25, c2: 25
NOTICE: c1: ahoj26, c2: 26
NOTICE: c1: ahoj27, c2: 27
NOTICE: c1: ahoj28, c2: 28
NOTICE: c1: ahoj29, c2: 29
NOTICE: c1: ahoj30, c2: 30
do $$
declare
c int;
strval varchar;
intval int;
nrows int default 30;
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'select ''ahoj'' || i, i from generate_series(1, :nrows) g(i)', gms_sql.v7);
gms_sql.bind_variable(c, 'nrows', nrows);
gms_sql.define_column(c, 1, strval);
gms_sql.define_column(c, 2, intval);
perform gms_sql.execute(c);
while gms_sql.fetch_rows(c) > 0
loop
strval := gms_sql.column_value_f(c, 1, strval);
intval := gms_sql.column_value_f(c, 2, intval);
raise notice 'c1: %, c2: %', strval, intval;
end loop;
gms_sql.close_cursor(c);
end;
$$;
NOTICE: c1: ahoj1, c2: 1
NOTICE: c1: ahoj2, c2: 2
NOTICE: c1: ahoj3, c2: 3
NOTICE: c1: ahoj4, c2: 4
NOTICE: c1: ahoj5, c2: 5
NOTICE: c1: ahoj6, c2: 6
NOTICE: c1: ahoj7, c2: 7
NOTICE: c1: ahoj8, c2: 8
NOTICE: c1: ahoj9, c2: 9
NOTICE: c1: ahoj10, c2: 10
NOTICE: c1: ahoj11, c2: 11
NOTICE: c1: ahoj12, c2: 12
NOTICE: c1: ahoj13, c2: 13
NOTICE: c1: ahoj14, c2: 14
NOTICE: c1: ahoj15, c2: 15
NOTICE: c1: ahoj16, c2: 16
NOTICE: c1: ahoj17, c2: 17
NOTICE: c1: ahoj18, c2: 18
NOTICE: c1: ahoj19, c2: 19
NOTICE: c1: ahoj20, c2: 20
NOTICE: c1: ahoj21, c2: 21
NOTICE: c1: ahoj22, c2: 22
NOTICE: c1: ahoj23, c2: 23
NOTICE: c1: ahoj24, c2: 24
NOTICE: c1: ahoj25, c2: 25
NOTICE: c1: ahoj26, c2: 26
NOTICE: c1: ahoj27, c2: 27
NOTICE: c1: ahoj28, c2: 28
NOTICE: c1: ahoj29, c2: 29
NOTICE: c1: ahoj30, c2: 30
drop table if exists foo;
NOTICE: table "foo" does not exist, skipping
create table foo(a int, b varchar, c numeric);
do $$
declare c int;
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'insert into foo values(:a, :b, :c)', gms_sql.native);
for i in 1..100
loop
gms_sql.bind_variable(c, 'a', i);
gms_sql.bind_variable(c, 'b', 'Ahoj ' || i);
gms_sql.bind_variable(c, 'c', i + 0.033);
perform gms_sql.execute(c);
end loop;
gms_sql.close_cursor(c);
end;
$$;
select * from foo;
a | b | c
-----+----------+---------
1 | Ahoj 1 | 1.033
2 | Ahoj 2 | 2.033
3 | Ahoj 3 | 3.033
4 | Ahoj 4 | 4.033
5 | Ahoj 5 | 5.033
6 | Ahoj 6 | 6.033
7 | Ahoj 7 | 7.033
8 | Ahoj 8 | 8.033
9 | Ahoj 9 | 9.033
10 | Ahoj 10 | 10.033
11 | Ahoj 11 | 11.033
12 | Ahoj 12 | 12.033
13 | Ahoj 13 | 13.033
14 | Ahoj 14 | 14.033
15 | Ahoj 15 | 15.033
16 | Ahoj 16 | 16.033
17 | Ahoj 17 | 17.033
18 | Ahoj 18 | 18.033
19 | Ahoj 19 | 19.033
20 | Ahoj 20 | 20.033
21 | Ahoj 21 | 21.033
22 | Ahoj 22 | 22.033
23 | Ahoj 23 | 23.033
24 | Ahoj 24 | 24.033
25 | Ahoj 25 | 25.033
26 | Ahoj 26 | 26.033
27 | Ahoj 27 | 27.033
28 | Ahoj 28 | 28.033
29 | Ahoj 29 | 29.033
30 | Ahoj 30 | 30.033
31 | Ahoj 31 | 31.033
32 | Ahoj 32 | 32.033
33 | Ahoj 33 | 33.033
34 | Ahoj 34 | 34.033
35 | Ahoj 35 | 35.033
36 | Ahoj 36 | 36.033
37 | Ahoj 37 | 37.033
38 | Ahoj 38 | 38.033
39 | Ahoj 39 | 39.033
40 | Ahoj 40 | 40.033
41 | Ahoj 41 | 41.033
42 | Ahoj 42 | 42.033
43 | Ahoj 43 | 43.033
44 | Ahoj 44 | 44.033
45 | Ahoj 45 | 45.033
46 | Ahoj 46 | 46.033
47 | Ahoj 47 | 47.033
48 | Ahoj 48 | 48.033
49 | Ahoj 49 | 49.033
50 | Ahoj 50 | 50.033
51 | Ahoj 51 | 51.033
52 | Ahoj 52 | 52.033
53 | Ahoj 53 | 53.033
54 | Ahoj 54 | 54.033
55 | Ahoj 55 | 55.033
56 | Ahoj 56 | 56.033
57 | Ahoj 57 | 57.033
58 | Ahoj 58 | 58.033
59 | Ahoj 59 | 59.033
60 | Ahoj 60 | 60.033
61 | Ahoj 61 | 61.033
62 | Ahoj 62 | 62.033
63 | Ahoj 63 | 63.033
64 | Ahoj 64 | 64.033
65 | Ahoj 65 | 65.033
66 | Ahoj 66 | 66.033
67 | Ahoj 67 | 67.033
68 | Ahoj 68 | 68.033
69 | Ahoj 69 | 69.033
70 | Ahoj 70 | 70.033
71 | Ahoj 71 | 71.033
72 | Ahoj 72 | 72.033
73 | Ahoj 73 | 73.033
74 | Ahoj 74 | 74.033
75 | Ahoj 75 | 75.033
76 | Ahoj 76 | 76.033
77 | Ahoj 77 | 77.033
78 | Ahoj 78 | 78.033
79 | Ahoj 79 | 79.033
80 | Ahoj 80 | 80.033
81 | Ahoj 81 | 81.033
82 | Ahoj 82 | 82.033
83 | Ahoj 83 | 83.033
84 | Ahoj 84 | 84.033
85 | Ahoj 85 | 85.033
86 | Ahoj 86 | 86.033
87 | Ahoj 87 | 87.033
88 | Ahoj 88 | 88.033
89 | Ahoj 89 | 89.033
90 | Ahoj 90 | 90.033
91 | Ahoj 91 | 91.033
92 | Ahoj 92 | 92.033
93 | Ahoj 93 | 93.033
94 | Ahoj 94 | 94.033
95 | Ahoj 95 | 95.033
96 | Ahoj 96 | 96.033
97 | Ahoj 97 | 97.033
98 | Ahoj 98 | 98.033
99 | Ahoj 99 | 99.033
100 | Ahoj 100 | 100.033
(100 rows)
truncate foo;
do $$
declare c int;
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'insert into foo values(:a, :b, :c)', gms_sql.native);
for i in 1..100
loop
gms_sql.bind_variable_f(c, 'a', i);
gms_sql.bind_variable_f(c, 'b', 'Ahoj ' || i);
gms_sql.bind_variable_f(c, 'c', i + 0.033);
perform gms_sql.execute(c);
end loop;
gms_sql.close_cursor(c);
end;
$$;
select * from foo;
a | b | c
-----+----------+---------
1 | Ahoj 1 | 1.033
2 | Ahoj 2 | 2.033
3 | Ahoj 3 | 3.033
4 | Ahoj 4 | 4.033
5 | Ahoj 5 | 5.033
6 | Ahoj 6 | 6.033
7 | Ahoj 7 | 7.033
8 | Ahoj 8 | 8.033
9 | Ahoj 9 | 9.033
10 | Ahoj 10 | 10.033
11 | Ahoj 11 | 11.033
12 | Ahoj 12 | 12.033
13 | Ahoj 13 | 13.033
14 | Ahoj 14 | 14.033
15 | Ahoj 15 | 15.033
16 | Ahoj 16 | 16.033
17 | Ahoj 17 | 17.033
18 | Ahoj 18 | 18.033
19 | Ahoj 19 | 19.033
20 | Ahoj 20 | 20.033
21 | Ahoj 21 | 21.033
22 | Ahoj 22 | 22.033
23 | Ahoj 23 | 23.033
24 | Ahoj 24 | 24.033
25 | Ahoj 25 | 25.033
26 | Ahoj 26 | 26.033
27 | Ahoj 27 | 27.033
28 | Ahoj 28 | 28.033
29 | Ahoj 29 | 29.033
30 | Ahoj 30 | 30.033
31 | Ahoj 31 | 31.033
32 | Ahoj 32 | 32.033
33 | Ahoj 33 | 33.033
34 | Ahoj 34 | 34.033
35 | Ahoj 35 | 35.033
36 | Ahoj 36 | 36.033
37 | Ahoj 37 | 37.033
38 | Ahoj 38 | 38.033
39 | Ahoj 39 | 39.033
40 | Ahoj 40 | 40.033
41 | Ahoj 41 | 41.033
42 | Ahoj 42 | 42.033
43 | Ahoj 43 | 43.033
44 | Ahoj 44 | 44.033
45 | Ahoj 45 | 45.033
46 | Ahoj 46 | 46.033
47 | Ahoj 47 | 47.033
48 | Ahoj 48 | 48.033
49 | Ahoj 49 | 49.033
50 | Ahoj 50 | 50.033
51 | Ahoj 51 | 51.033
52 | Ahoj 52 | 52.033
53 | Ahoj 53 | 53.033
54 | Ahoj 54 | 54.033
55 | Ahoj 55 | 55.033
56 | Ahoj 56 | 56.033
57 | Ahoj 57 | 57.033
58 | Ahoj 58 | 58.033
59 | Ahoj 59 | 59.033
60 | Ahoj 60 | 60.033
61 | Ahoj 61 | 61.033
62 | Ahoj 62 | 62.033
63 | Ahoj 63 | 63.033
64 | Ahoj 64 | 64.033
65 | Ahoj 65 | 65.033
66 | Ahoj 66 | 66.033
67 | Ahoj 67 | 67.033
68 | Ahoj 68 | 68.033
69 | Ahoj 69 | 69.033
70 | Ahoj 70 | 70.033
71 | Ahoj 71 | 71.033
72 | Ahoj 72 | 72.033
73 | Ahoj 73 | 73.033
74 | Ahoj 74 | 74.033
75 | Ahoj 75 | 75.033
76 | Ahoj 76 | 76.033
77 | Ahoj 77 | 77.033
78 | Ahoj 78 | 78.033
79 | Ahoj 79 | 79.033
80 | Ahoj 80 | 80.033
81 | Ahoj 81 | 81.033
82 | Ahoj 82 | 82.033
83 | Ahoj 83 | 83.033
84 | Ahoj 84 | 84.033
85 | Ahoj 85 | 85.033
86 | Ahoj 86 | 86.033
87 | Ahoj 87 | 87.033
88 | Ahoj 88 | 88.033
89 | Ahoj 89 | 89.033
90 | Ahoj 90 | 90.033
91 | Ahoj 91 | 91.033
92 | Ahoj 92 | 92.033
93 | Ahoj 93 | 93.033
94 | Ahoj 94 | 94.033
95 | Ahoj 95 | 95.033
96 | Ahoj 96 | 96.033
97 | Ahoj 97 | 97.033
98 | Ahoj 98 | 98.033
99 | Ahoj 99 | 99.033
100 | Ahoj 100 | 100.033
(100 rows)
truncate foo;
do $$
declare
c int;
a int[];
b varchar[];
ca numeric[];
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'insert into foo values(:a, :b, :c)', gms_sql.v6);
a := ARRAY[1, 2, 3, 4, 5];
b := ARRAY['Ahoj', 'Nazdar', 'Bazar'];
ca := ARRAY[3.14, 2.22, 3.8, 4];
perform gms_sql.bind_array(c, 'a', a);
perform gms_sql.bind_array(c, 'b', b);
perform gms_sql.bind_array(c, 'c', ca);
raise notice 'inserted rows %d', gms_sql.execute(c);
gms_sql.close_cursor(c);
end;
$$;
NOTICE: inserted rows 3d
select * from foo;
a | b | c
---+--------+------
1 | Ahoj | 3.14
2 | Nazdar | 2.22
3 | Bazar | 3.8
(3 rows)
truncate foo;
do $$
declare
c int;
a int[];
b varchar[];
ca numeric[];
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'insert into foo values(:a, :b, :c)', gms_sql.v7);
a := ARRAY[1, 2, 3, 4, 5];
b := ARRAY['Ahoj', 'Nazdar', 'Bazar'];
ca := ARRAY[3.14, 2.22, 3.8, 4];
perform gms_sql.bind_array(c, 'a', a, 2, 3);
perform gms_sql.bind_array(c, 'b', b, 3, 4);
perform gms_sql.bind_array(c, 'c', ca);
raise notice 'inserted rows %d', gms_sql.execute(c);
gms_sql.close_cursor(c);
end;
$$;
NOTICE: inserted rows 1d
select * from foo;
a | b | c
---+-------+-----
3 | Bazar | 3.8
(1 row)
truncate foo;
do $$
declare
c int;
a int[];
b varchar[];
ca numeric[];
begin
c := gms_sql.open_cursor();
gms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0.003 from generate_series(1, 35) g(i)', 0);
gms_sql.define_array(c, 1, a, 10, 1);
gms_sql.define_array(c, 2, b, 10, 1);
gms_sql.define_array(c, 3, ca, 10, 1);
perform gms_sql.execute(c);
while gms_sql.fetch_rows(c) > 0
loop
gms_sql.column_value(c, 1, a);
gms_sql.column_value(c, 2, b);
gms_sql.column_value(c, 3, ca);
raise notice 'a = %', a;
raise notice 'b = %', b;
raise notice 'c = %', ca;
end loop;
gms_sql.close_cursor(c);
end;
$$;
NOTICE: a = {1,2,3,4,5,6,7,8,9,10}
NOTICE: b = {Ahoj1,Ahoj2,Ahoj3,Ahoj4,Ahoj5,Ahoj6,Ahoj7,Ahoj8,Ahoj9,Ahoj10}
NOTICE: c = {1.003,2.003,3.003,4.003,5.003,6.003,7.003,8.003,9.003,10.003}
NOTICE: a = {11,12,13,14,15,16,17,18,19,20}
NOTICE: b = {Ahoj11,Ahoj12,Ahoj13,Ahoj14,Ahoj15,Ahoj16,Ahoj17,Ahoj18,Ahoj19,Ahoj20}
NOTICE: c = {11.003,12.003,13.003,14.003,15.003,16.003,17.003,18.003,19.003,20.003}
NOTICE: a = {21,22,23,24,25,26,27,28,29,30}
NOTICE: b = {Ahoj21,Ahoj22,Ahoj23,Ahoj24,Ahoj25,Ahoj26,Ahoj27,Ahoj28,Ahoj29,Ahoj30}
NOTICE: c = {21.003,22.003,23.003,24.003,25.003,26.003,27.003,28.003,29.003,30.003}
NOTICE: a = {31,32,33,34,35}
NOTICE: b = {Ahoj31,Ahoj32,Ahoj33,Ahoj34,Ahoj35}
NOTICE: c = {31.003,32.003,33.003,34.003,35.003}
drop table foo;
do $$
declare
l_curid int;
l_cnt int;
l_desctab gms_sql.desc_tab;
l_sqltext varchar(2000);
begin
l_sqltext='select * from pg_object;';
l_curid := gms_sql.open_cursor();
gms_sql.parse(l_curid, l_sqltext, 0);
gms_sql.describe_columns(l_curid, l_cnt, l_desctab);
for i in 1 .. l_desctab.count loop
raise notice '%,% ', l_desctab(i).col_name,l_desctab(i).col_type;
end loop;
gms_sql.close_cursor(l_curid);
end;
$$;
NOTICE: object_oid,109
NOTICE: object_type,96
NOTICE: creator,109
NOTICE: ctime,181
NOTICE: mtime,181
NOTICE: createcsn,2
NOTICE: changecsn,2
NOTICE: valid,109
create table t1(id int, name varchar(20));
insert into t1 select generate_series(1,3), 'abcddd';
create table t2(a int, b date);
insert into t2 values(1, '2022-12-11 10:00:01.123');
insert into t2 values(3, '2022-12-12 12:00:11.13');
do $$
declare
c1 refcursor;
c2 refcursor;
begin
open c1 for select * from t1;
gms_sql.return_result(c1);
open c2 for select * from t2;
gms_sql.return_result(c2);
end;
$$;
ResultSet #1
id | name
----+--------
1 | abcddd
2 | abcddd
3 | abcddd
(3 rows)
ResultSet #2
a | b
---+--------------------------
1 | Sun Dec 11 10:00:01 2022
3 | Mon Dec 12 12:00:11 2022
(2 rows)
create procedure test_result() as
declare
c1 refcursor;
c2 refcursor;
begin
open c1 for select * from t1;
gms_sql.return_result(c1);
open c2 for select * from t2;
gms_sql.return_result(c2);
end;
/
call test_result();
ResultSet #1
id | name
----+--------
1 | abcddd
2 | abcddd
3 | abcddd
(3 rows)
ResultSet #2
a | b
---+--------------------------
1 | Sun Dec 11 10:00:01 2022
3 | Mon Dec 12 12:00:11 2022
(2 rows)
test_result
-------------
(1 row)
drop procedure test_result;
create procedure aam() as
declare
id1 int;
id2 int;
begin
id1 :=gms_sql.open_cursor();
gms_sql.parse(id1,'select * from t1', 1);
perform gms_sql.execute(id1);
gms_sql.return_result(id1);
gms_sql.close_cursor(id1);
id2 :=gms_sql.open_cursor();
gms_sql.parse(id2,'select * from t2', 2);
perform gms_sql.execute(id2);
gms_sql.return_result(id2);
gms_sql.close_cursor(id2);
end;
/
call aam();
ResultSet #1
id | name
----+--------
1 | abcddd
2 | abcddd
3 | abcddd
(3 rows)
ResultSet #2
a | b
---+--------------------------
1 | Sun Dec 11 10:00:01 2022
3 | Mon Dec 12 12:00:11 2022
(2 rows)
aam
-----
(1 row)
drop procedure aam;
create table col_name_too_long(aaaaabbbbbcccccdddddeeeeefffffggg int, col2 text);
do $$
declare
l_curid int;
l_cnt int;
l_desctab gms_sql.desc_tab;
l_desctab2 gms_sql.desc_tab2;
l_sqltext varchar(2000);
begin
l_sqltext='select * from t1;';
l_curid := gms_sql.open_cursor();
gms_sql.parse(l_curid, l_sqltext, 1);
gms_sql.describe_columns(l_curid, l_cnt, l_desctab);
for i in 1 .. l_desctab.count loop
raise notice '%', l_desctab(i).col_name;
end loop;
-- output col_name
l_sqltext='select * from col_name_too_long;';
gms_sql.parse(l_curid, l_sqltext, 1);
gms_sql.describe_columns2(l_curid, l_cnt, l_desctab2);
for i in 1 .. l_desctab2.count loop
raise notice '%', l_desctab2(i).col_name;
end loop;
-- error
l_sqltext='select * from col_name_too_long;';
gms_sql.parse(l_curid, l_sqltext, 1);
gms_sql.describe_columns(l_curid, l_cnt, l_desctab);
for i in 1 .. l_desctab.count loop
raise notice '%', l_desctab(i).col_name;
end loop;
end;
$$;
NOTICE: id
NOTICE: name
NOTICE: aaaaabbbbbcccccdddddeeeeefffffggg
NOTICE: col2
ERROR: desc_rec.col_name(33) is more than 32
CONTEXT: SQL statement "CALL gms_sql.describe_columns(l_curid,l_cnt,l_desctab)"
PL/pgSQL function inline_code_block line 26 at SQL statement
select gms_sql.is_open(0);
is_open
---------
t
(1 row)
select gms_sql.close_cursor(0);
close_cursor
--------------
(1 row)
do $$
declare
l_curid int;
l_cnt int;
l_desctab3 gms_sql.desc_tab3;
l_desctab4 gms_sql.desc_tab4;
l_sqltext varchar(2000);
begin
l_sqltext='select * from col_name_too_long;';
l_curid := gms_sql.open_cursor();
gms_sql.parse(l_curid, l_sqltext, 1);
gms_sql.describe_columns3(l_curid, l_cnt, l_desctab3);
for i in 1 .. l_desctab3.count loop
raise notice '%,%,%', l_desctab3(i).col_type,l_desctab3(i).col_type_name,l_desctab3(i).col_name;
end loop;
gms_sql.parse(l_curid, l_sqltext, 1);
gms_sql.describe_columns3(l_curid, l_cnt, l_desctab4);
for i in 1 .. l_desctab4.count loop
raise notice '%,%,%,%', l_desctab3(i).col_type,l_desctab4(i).col_type_name,l_desctab4(i).col_type_name_len,l_desctab4(i).col_name_len;
end loop;
gms_sql.close_cursor(l_curid);
end;
$$;
NOTICE: 2,<NULL>,aaaaabbbbbcccccdddddeeeeefffffggg
NOTICE: 109,text,col2
NOTICE: 2,<NULL>,<NULL>,33
NOTICE: 109,text,4,4
drop table t1,t2, col_name_too_long;
select gms_sql.open_cursor();
open_cursor
-------------
0
(1 row)
select gms_sql.is_open(0);
is_open
---------
t
(1 row)
select gms_sql.open_cursor();
open_cursor
-------------
1
(1 row)
select gms_sql.is_open(1);
is_open
---------
t
(1 row)
select gms_sql.open_cursor();
open_cursor
-------------
2
(1 row)
select gms_sql.is_open(2);
is_open
---------
t
(1 row)
select gms_sql.open_cursor();
open_cursor
-------------
3
(1 row)
select gms_sql.is_open(3);
is_open
---------
t
(1 row)
select gms_sql.close_cursor(0);
close_cursor
--------------
(1 row)
select gms_sql.close_cursor(1);
close_cursor
--------------
(1 row)
select gms_sql.close_cursor(2);
close_cursor
--------------
(1 row)
select gms_sql.close_cursor(3);
close_cursor
--------------
(1 row)
select gms_sql.is_open(3);
is_open
---------
f
(1 row)
select gms_sql.close_cursor(10000);
ERROR: cursor 10000 value of cursor id is out of range
CONTEXT: referenced column: close_cursor
select gms_sql.close_cursor(-1);
ERROR: cursor -1 value of cursor id is out of range
CONTEXT: referenced column: close_cursor

View File

@ -0,0 +1,117 @@
/* contrib/gms_sql/gms_sql--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION gms_sql" to load this file. \quit
-- gms_sql package begin
-- gms_sql schema
CREATE SCHEMA gms_sql;
GRANT USAGE ON SCHEMA gms_sql TO PUBLIC;
CREATE FUNCTION gms_sql.is_open(c int) RETURNS bool AS 'MODULE_PATHNAME', 'gms_sql_is_open' LANGUAGE c STABLE NOT FENCED;
CREATE FUNCTION gms_sql.open_cursor() RETURNS int AS 'MODULE_PATHNAME', 'gms_sql_open_cursor' LANGUAGE c STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.close_cursor(c int) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_close_cursor' STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.debug_cursor(c int) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_debug_cursor' STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.parse(c int, stmt varchar2, ver int) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_parse' STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.bind_variable(c int, name varchar2, value "any") LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_bind_variable' STABLE NOT FENCED;
CREATE FUNCTION gms_sql.bind_variable_f(c int, name varchar2, value "any") RETURNS void AS 'MODULE_PATHNAME', 'gms_sql_bind_variable_f' LANGUAGE c STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.bind_array(c int, name varchar2, value anyarray) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_bind_array_3' package STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.bind_array(c int, name varchar2, value anyarray, index1 int, index2 int) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_bind_array_5' package STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.define_column(c int, col int, value "any", column_size int DEFAULT -1) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_define_column' STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.define_array(c int, col int, value "anyarray", cnt int, lower_bnd int) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_define_array' STABLE NOT FENCED;
CREATE FUNCTION gms_sql.execute(c int) RETURNS bigint AS 'MODULE_PATHNAME', 'gms_sql_execute' LANGUAGE c STABLE NOT FENCED;
CREATE FUNCTION gms_sql.fetch_rows(c int) RETURNS int AS 'MODULE_PATHNAME', 'gms_sql_fetch_rows' LANGUAGE c STABLE NOT FENCED;
CREATE FUNCTION gms_sql.execute_and_fetch(c int, exact bool DEFAULT false) RETURNS int AS 'MODULE_PATHNAME', 'gms_sql_execute_and_fetch' LANGUAGE c STABLE NOT FENCED;
CREATE FUNCTION gms_sql.last_row_count() RETURNS int AS 'MODULE_PATHNAME', 'gms_sql_last_row_count' LANGUAGE c STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.column_value(c int, pos int, INOUT value anyelement) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_column_value' STABLE NOT FENCED;
CREATE FUNCTION gms_sql.column_value_f(c int, pos int, value anyelement) RETURNS anyelement AS 'MODULE_PATHNAME', 'gms_sql_column_value_f' LANGUAGE c STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.return_result(c refcursor, to_client bool DEFAULT false) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_return_result' PACKAGE STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.return_result(c int, to_client bool DEFAULT false) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_return_result_i' PACKAGE STABLE NOT FENCED;
CREATE FUNCTION gms_sql.v6() RETURNS int AS $$
BEGIN
return 0;
END;
$$ language plpgsql;
CREATE FUNCTION gms_sql.native() RETURNS int AS $$
BEGIN
return 1;
END;
$$ language plpgsql;
CREATE FUNCTION gms_sql.v7() RETURNS int AS $$
BEGIN
return 2;
END;
$$ language plpgsql;
CREATE TYPE gms_sql.desc_rec AS (
col_type int,
col_max_len int,
col_name varchar2(32),
col_name_len int,
col_schema_name text,
col_schema_name_len int,
col_precision int,
col_scale int,
col_charsetid int,
col_charsetform int,
col_null_ok boolean);
CREATE TYPE gms_sql.desc_rec2 AS (
col_type int,
col_max_len int,
col_name text,
col_name_len int,
col_schema_name text,
col_schema_name_len int,
col_precision int,
col_scale int,
col_charsetid int,
col_charsetform int,
col_null_ok boolean);
CREATE TYPE gms_sql.desc_rec3 AS (
col_type int,
col_max_len int,
col_name text,
col_name_len int,
col_schema_name text,
col_schema_name_len int,
col_precision int,
col_scale int,
col_charsetid int,
col_charsetform int,
col_null_ok boolean,
col_type_name text,
col_type_name_len int);
CREATE TYPE gms_sql.desc_rec4 AS (
col_type int,
col_max_len int,
col_name text,
col_name_len int,
col_schema_name text,
col_schema_name_len int,
col_precision int,
col_scale int,
col_charsetid int,
col_charsetform int,
col_null_ok boolean,
col_type_name text,
col_type_name_len int);
CREATE TYPE gms_sql.desc_tab IS TABLE OF gms_sql.desc_rec;
CREATE TYPE gms_sql.desc_tab2 IS TABLE OF gms_sql.desc_rec2;
CREATE TYPE gms_sql.desc_tab3 IS TABLE OF gms_sql.desc_rec3;
CREATE TYPE gms_sql.desc_tab4 IS TABLE OF gms_sql.desc_rec4;
CREATE TYPE gms_sql.number_table IS TABLE OF number;
CREATE TYPE gms_sql.varchar2_table IS TABLE OF varchar2;
CREATE TYPE gms_sql.date_table IS TABLE OF date;
CREATE TYPE gms_sql.blob_table IS TABLE OF blob;
CREATE TYPE gms_sql.clob_table IS TABLE OF clob;
CREATE TYPE gms_sql.binary_double_table IS TABLE OF number;
CREATE FUNCTION gms_sql.describe_columns_f(c int, OUT col_cnt int, OUT desc_t gms_sql.desc_rec3[]) AS 'MODULE_PATHNAME', 'gms_sql_describe_columns_f' LANGUAGE c STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.describe_columns(c int, INOUT col_cnt int, INOUT desc_t gms_sql.desc_rec[]) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_describe_columns_f' STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.describe_columns2(c int, INOUT col_cnt int, INOUT desc_t gms_sql.desc_rec2[]) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_describe_columns_f' STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.describe_columns3(c int, INOUT col_cnt int, INOUT desc_t gms_sql.desc_rec3[]) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_describe_columns_f' PACKAGE STABLE NOT FENCED;
CREATE PROCEDURE gms_sql.describe_columns3(c int, INOUT col_cnt int, INOUT desc_t gms_sql.desc_rec4[]) LANGUAGE c AS 'MODULE_PATHNAME', 'gms_sql_describe_columns_f' PACKAGE STABLE NOT FENCED;
-- gms_sql package end

Some files were not shown because too many files have changed in this diff Show More