1126 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
79fee294d7 修复enable_security_policy=off时删除标签,系统表中数据未按预期更新问题 2024-08-16 10:49:28 +08: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
c93f5e203a 1、fix move partitions
2、optimit vacuum full
2024-08-13 15:12:47 +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
4fa2725d22 禁止无权限用户打开大对象 2024-08-12 09:29:20 +00:00
91b65112e6 【bugfix】修复按需回放redo阶段执行create procedure报错的问题 2024-08-12 16:59:28 +08:00
8af10b32e4 删除冗余的server_support_trace,直接使用enable_record_nettime替代 2024-08-12 16:26:34 +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
a36694a29f 更新server包名后缀格式 2024-08-10 09:12:47 +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
965eb4d545 !5973 修改RTO性能优化pr引入的创建表空间失败的bug
Merge pull request !5973 from 景涛/rto_issue
2024-08-09 06:21:55 +00:00
d66fc9d182 clean code by zhaosen 2024-08-09 14:20:19 +08:00
47ded454a1 !5980 修复jdbc insert 空值的问题
Merge pull request !5980 from wangfeihuo/sizelen
2024-08-09 06:10:26 +00: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
3ba3500bf2 !5950 更新社区包名称,明确区分各个系统和架构
Merge pull request !5950 from zhangxubo/fixver
2024-08-09 03:46:46 +00:00
b7c056bd95 修复jdbc insert 空值的问题 2024-08-09 11:16:28 +08:00
bcd9741d83 !5711 逻辑复制支持Alter table的DDL语句
Merge pull request !5711 from Hemny/repl_ddl_alter
2024-08-09 02:54:05 +00:00
cd0d5ae1b1 !5970 gs_dump导出时设置GUC参数 behavior_compat_options
Merge pull request !5970 from zhubin79/dump-fasn
2024-08-09 02:12:31 +00:00
cdb8f4d277 解决timescaledb插件,时序表查看指定的SQL执行计划不准确 2024-08-08 21:32:49 +08:00
71e3b71d1e !5974 增加嵌套数组插入表时报错处理
Merge pull request !5974 from chenxiaobin/fixNestTable
2024-08-08 12:28:48 +00:00
6be0300ff5 !5969 修复show behavior_compat_options显示重复设置的参数
Merge pull request !5969 from 梅程/show_guc
2024-08-08 12:27:57 +00:00
52174b8ad1 !5962 修复greatest作为表函数的core问题
Merge pull request !5962 from chenxiaobin/fixGreatestCore
2024-08-08 12:26:46 +00:00
53b349d849 逻辑复制支持Alter table的DDL语句 2024-08-08 17:45:00 +08:00
a075baeb0c 更新打包名称 2024-08-08 16:36:31 +08:00
1367a8985d !5277 处理issue:部分类型之间不支持GREATEST/LEAST函数
Merge pull request !5277 from lukeman/delete_issue
2024-08-08 08:07:39 +00:00
5ed68aae43 导出时设置GUC参数 behavior_compat_options 2024-08-08 15:00:07 +08:00
7e3ce74814 处理issue:部分类型之间不支持GREATEST/LEAST函数,补充内核结构体字段 2024-08-08 14:12:42 +08:00
5de9c36e0f 增加嵌套数组插入表时报错处理 2024-08-08 11:58:27 +08:00
9299bbc799 修复show behavior_compat_options显示重复设置的参数 2024-08-08 10:46:39 +08:00
9789bb2300 修改RTO性能优化pr引入的创建表空间失败的bug 2024-08-08 10:07:02 +08:00
88cce35ea0 !5972 uzone释放buffer
Merge pull request !5972 from Mijamind/0728
2024-08-08 01:22:10 +00:00
5fb4738b59 uzone release buf 2024-08-07 18:53:01 +08:00
be584a2d26 !5953 default填充参数bugfix
Merge pull request !5953 from Mijamind/0728
2024-08-07 07:09:23 +00:00
380496b7f7 !5968 修复备机读组获取快照死锁问题
Merge pull request !5968 from 杨皓/master
2024-08-07 03:39:26 +00:00
878e53c066 修复rotate/not rotate不支持with子句及not rotate不支持存储过程中使用自定义变量问题 2024-08-07 11:34:03 +08:00
f5d45bdf68 修复备机读组获取快照死锁问题Offering: openGaussDevMore detail: standby read
Match-id-06894f7e495d72c5763653105cbd2c8eee989c81
2024-08-07 10:24:55 +08:00
6e0b5399d1 fix libpgtypes打包版本问题 2024-08-07 09:52:04 +08:00
f9b5322111 !5964 修复deserialization_to_tuple方法数组越界
Merge pull request !5964 from Hemny/IAI8V1
2024-08-06 13:31:46 +00:00
cfaf50b1ba !5959 修改依赖的三方库版本
Merge pull request !5959 from zzh/master
2024-08-06 12:21:49 +00:00
705b9473ff 1.修复指针初始化bug
2.删除无用分支
2024-08-06 20:06:57 +08:00
ade37ec73e 修复greatest作为表函数的core问题 2024-08-06 19:46:29 +08:00
963166f472 !5932 修复游标表达式+并行游标的若干问题
Merge pull request !5932 from chenxiaobin/fixSmpNotReset
2024-08-06 11:18:42 +00:00
eb4932d233 修复deserialization_to_tuple方法的内存泄露问题 2024-08-06 17:22:09 +08:00
a2ac50def4 !5938 修复A兼容模式下,通过libpq绑定空字符串变量,传入数据库为空字符串,而不是null的问题
Merge pull request !5938 from yuchao/master
2024-08-06 09:20:02 +00:00
d07bd9c5e5 !5961 优化GSC的淘汰内存回收和内存统计
Merge pull request !5961 from 杨皓/master
2024-08-06 09:13:01 +00:00
e7d4feff54 !5318 处理issue:ThreadPoolListener readySession泄露问题
Merge pull request !5318 from lukeman/core_issue
2024-08-06 08:39:43 +00:00
b77b6b371f optimize GSC memory state
Offering: openGaussDev
More detail: optimize GSC memory state
2024-08-06 15:28:04 +08:00
e0c5233f55 !5942 M兼容性 gsql 输出转义字符格式化修改
Merge pull request !5942 from zhubin79/escape
2024-08-06 07:06:49 +00:00
1883f5f929 修复A兼容模式下,通过libpq绑定空字符串变量,传入数据库为空字符串,而不是null的问题 2024-08-06 14:36:41 +08:00
340b9830c2 禁止无权限用户打开大对象 2024-08-06 02:52:22 +00:00
df1af9527e !5952 修复view删除依赖分区表、enum、set issue
Merge pull request !5952 from 梅程/viewDepend
2024-08-06 02:49:19 +00:00
58bc6f307d !5918 【回合6.0.0】解决测试用例hw_audit_full随机挂库导致后续所有用例失败,audit版块存在段错误
Merge pull request !5918 from 梅程/master
2024-08-06 02:37:06 +00:00
d00d4b7aa4 !5957 修复dolphin因DBE_PERF.statement重建而升级失败的问题
Merge pull request !5957 from chenxiaobin/fixdolphinupgrade
2024-08-06 02:34:47 +00:00
zzh
20770e00a2 修改依赖的三方库版本 2024-08-06 09:20:35 +08:00
ee8eaacc04 !5958 【处理8.0 core问题】blob字符序断言导致core, 添加IsBinaryType的hook函数,处理tinyblob类型
Merge pull request !5958 from lukeman/master
2024-08-05 12:43:18 +00:00
d2178433da !5948 处理issue:gs_probackup --help中无s3_options说明
Merge pull request !5948 from lukeman/help_issue
2024-08-05 12:41:41 +00:00
a7bf91b237 !5945 处理issue:执行层次查询,告警后挂库,产生core
Merge pull request !5945 from lukeman/core_pr
2024-08-05 12:41:14 +00:00
20a69e1003 !5946 修复双集群问题
Merge pull request !5946 from Carl/test111
2024-08-05 11:22:46 +00:00
22ec600191 【处理8.0 core问题】blob字符序断言导致core, 添加IsBinaryType的hook函数,处理tinyblob类型 2024-08-05 17:44:08 +08:00
8c022e409b !5956 修复5.0.2容器化升级至6.0.0报错duplicate key问题
Merge pull request !5956 from zhangxubo/master
2024-08-05 09:42:02 +00:00
0200edd35f !5940 修复多个session间隔执行select for update wait X sec,等待的预期时间不一致的问题
Merge pull request !5940 from cchen676/240710master
2024-08-05 09:11:11 +00:00
cfdb4ba761 !5939 【资源池化】【同步DMS点】8.2同步
Merge pull request !5939 from 董宁/sync19
2024-08-05 08:36:31 +00:00
5a1d3d8510 修复容器升级失败问题 2024-08-05 16:35:05 +08:00
d16b0aab69 修复view删除依赖分区表、enum、set issue 2024-08-05 16:06:58 +08:00
a6c9cd0eb4 !5954 调整debugger func 空指针校验位置
Merge pull request !5954 from jemappellehc/debugger
2024-08-05 06:10:35 +00:00
a498e1a80b 处理issue:执行层次查询,告警后挂库,产生core 2024-08-05 12:02:36 +08:00
081ef521bc 修复dolphin因DBE_PERF.statement重建而升级失败的问题 2024-08-05 11:32:22 +08:00
d088408dfa !5931 【处理8.0 core问题】blob字符序断言导致core
Merge pull request !5931 from lukeman/master
2024-08-05 02:18:56 +00:00
bfc6192f31 M兼容性 gsql 输出转义字符格式化修改 2024-08-05 10:02:27 +08:00
8431361f52 【资源池化】【同步DMS点】8.2同步 2024-08-05 09:34:29 +08:00
c137df4a1b fix debugger function core 2024-08-05 09:28:25 +08:00
a80f25da1e !5913 【资源池化】推进DMS/CBB commit点
Merge pull request !5913 from 刘博文/0716trace
2024-08-05 01:14:47 +00:00
c08130d05f !5951 修改debug triggger function 导致数据库core
Merge pull request !5951 from jemappellehc/bugfix
2024-08-05 01:06:02 +00:00
b38e88881b !5941 修复undo file找不到的问题
Merge pull request !5941 from Mijamind/0728
2024-08-04 06:34:17 +00:00
23ebfe050a 1.修复undofile找不到的问题
2.UndoScanDescData
3.修复memcheck模式memory leak
2024-08-04 11:34:57 +08:00
100935170c !5947 解决继承表不支持select FOR UPDATE SKIP LOCKED 的问题
Merge pull request !5947 from laishenghao/inherits-skiplocked
2024-08-03 09:40:08 +00:00
a4db38c9b7 fix debugger function core 2024-08-03 17:16:11 +08:00
34353a2bcd 处理issue:gs_probackup --help中无s3_options说明 2024-08-03 16:31:48 +08:00
dcf2fe4f48 解决继承表不支持select FOR UPDATE SKIP LOCKED 的问题 2024-08-03 16:27:58 +08:00
884982cf5b 修复双集群问题 2024-08-03 16:03:16 +08:00
522dd3fe11 !5765 trc_gen.py生成脚本改为python3执行
Merge pull request !5765 from zhangxubo/master
2024-08-03 03:09:27 +00:00
77d964c85c 修复多个session间隔执行select for update wait X sec,等待的预期时间不一致的问题 2024-08-02 19:31:11 +08:00
f2d094470e 检测字符串长度 2024-08-02 10:13:37 +00:00
2400949a78 push dms commit 2024-08-02 16:02:28 +08:00
6aca609103 !5919 增加GUC参数控制预创建xlog的功能开闭与阈值
Merge pull request !5919 from laishenghao/pre-init-xlogs
2024-08-02 07:54:32 +00:00
738240a729 增加GUC参数控制预创建xlog的功能开闭与阈值 2024-08-02 15:29:53 +08:00
9d51b9a167 !5909 toast表支持扩充事务槽
Merge pull request !5909 from Mijamind/0728
2024-08-02 06:56:41 +00:00
7b4c3f1c0c !5935 【bugfix】修复switchover升主完成前更新控制文件的问题
Merge pull request !5935 from 周聪/bugfix_switchover_update_control_2
2024-08-02 06:49:57 +00:00
ea1180629a 1.toast表支持扩充事务槽
2.get_max_offsetnumber统一使用am接口
2024-08-02 13:26:43 +08:00
fe9b5d971e 修复并行游标的若干问题 2024-08-02 11:38:21 +08:00
763c7dc6d0 【bugfix】修复switchover升主完成前更新控制文的问题 2024-08-02 10:33:52 +08:00
96971374f8 !5848 A兼容模式下,修改float列类型时添加验证
Merge pull request !5848 from zhubin79/alter-float
2024-08-02 01:57:49 +00:00
51623ea917 !5915 【bugfix】补充按需回放redo节点适配ddl,reindex database场景的适配
Merge pull request !5915 from 周聪/bugfix_redo_phase_enable_ddl_reindex_database
2024-08-02 01:41:56 +00:00
53ff4ffa7c !5906 新增适配dss aio post pwrite接口
Merge pull request !5906 from cchen676/240710master
2024-08-02 01:32:50 +00:00
3809d9261c 【处理8.0 core问题】blob字符序断言导致core 2024-08-01 19:59:48 +08:00
c71c3d044b 修改列numeric、float数据类型时,添加验证 2024-08-01 18:40:58 +08: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
e6150b6e89 !5899 支持mysql中的select @@IDENTITY 语法
Merge pull request !5899 from lukeman/master
2024-08-01 02:39:28 +00:00
688254832c !5912 default默认值添加以f/d结尾的浮点数支持
Merge pull request !5912 from 王平云/master
2024-08-01 02:26:31 +00:00
0a179f7f76 新增适配dss aio post pwrite接口 2024-08-01 10:19:44 +08:00
eecf4e10cc !5867 审计日志,支持完整性验证。
Merge pull request !5867 from 邮储-王建达/feature_audit_6.0
2024-07-31 09:24:40 +00:00
58c4878c4f 【回合6.0.0】解决测试用例hw_audit_full随机挂库导致后续所有用例失败,audit版块存在段错误 2024-07-31 17:18:59 +08:00
6c6fd1d83b !5917 修复mysql jdbc连接openGauss失败的问题
Merge pull request !5917 from 蒋宏博/master
2024-07-31 08:56:18 +00:00
f9b28194eb 【bugfix】修复按需回放不支持reindex database的问题 2024-07-31 16:11:34 +08:00
826fa98ecd 修复mysql jdbc连接openGauss失败的问题 2024-07-31 16:10:15 +08:00
b7c907fcac !5914 修复jdbc增加与内核交互报文后,jdbc逻辑复制用例报错的问题
Merge pull request !5914 from 蒋宏博/master
2024-07-31 08:06:18 +00:00
89703f802f 修复jdbc增加报文后,逻辑复制报错的问题 2024-07-31 15:15:47 +08:00
4d2cfad94d pg_audit 6.0 2024-07-31 14:23:20 +08:00
68db8a7947 default添加以f/d结尾的浮点数支持 2024-07-31 09:49:25 +08:00
a734eb2718 !5884 【feature】按需回放redo阶段适配执行DDL
Merge pull request !5884 from 周聪/dev_redo_phase_enable_ddl_20240727
2024-07-30 13:35:08 +00:00
c39c52d575 !5911 bugfix: fix error code
Merge pull request !5911 from zhubin79/fix-expr-column
2024-07-30 12:07:52 +00:00
2e02f74c3a 【feature】按需回放redo阶段适配ddl 2024-07-30 19:51:43 +08:00
0a32e3913b 支持mysql中的select @@IDENTITY 语法 2024-07-30 19:48:14 +08:00
f503dfa1da bugfix: error code 2024-07-30 19:27:38 +08:00
d95499c25a !5886 修改TO_BINARY_FLOAT函数默认参数为列引用时处理逻辑
Merge pull request !5886 from zhubin79/expr-column
2024-07-30 10:55:18 +00:00
3336585570 !5910 回退repl_scanner.l词法解析的修改
Merge pull request !5910 from cchen676/240730master
2024-07-30 10:12:44 +00:00
b753ac26c4 修改第二个参数为列引用时的处理逻辑 2024-07-30 18:07:30 +08:00
5b4fbf4c95 !5841 修改to_binary_float函数入参为0和负数边界值时的返回值
Merge pull request !5841 from zhubin79/tbf-inf
2024-07-30 09:51:40 +00:00
ab44cdeea8 回退repl_scanner.l的修改,因为驱动中在建立连接时会发sql 2024-07-30 17:24:02 +08:00
d4603ba725 !5898 修复B库并行逻辑解码的core问题
Merge pull request !5898 from chenxiaobin/fixbparalleldecode
2024-07-30 08:15:45 +00:00
ac619a3466 !5862 feature_备份与恢复工具审计日志
Merge pull request !5862 from 邮储-王建达/feature_备份与恢复工具审计日志
2024-07-30 06:13:35 +00:00
aa98836587 修复B库并行逻辑解码的core问题 2024-07-30 12:00:11 +08:00
6d9f0684f2 fix backup timeout 2024-07-30 02:12:06 +00:00
7eeaf87eeb !5853 jdbc支持全链路跟踪
Merge pull request !5853 from 蒋宏博/master
2024-07-30 02:01:32 +00:00
8fd58f779f !5812 DSS推点
Merge pull request !5812 from 徐鑫鑫/xxx
2024-07-30 01:51:49 +00:00
6f7cd7ade9 !5892 修复undo urecptr与xlog记录中的urecptr不一致的情况
Merge pull request !5892 from Mijamind/0728
2024-07-29 13:58:34 +00:00
a3cb9993a4 !5894 修改存储引擎回放类型相关描述
Merge pull request !5894 from wofanzheng/master
2024-07-29 12:42:06 +00:00
edb57606dc 备份与恢复工具审计日志 2024-07-29 20:33:29 +08:00
8eeec8f530 1.修复bug_undo页面复用场景下,当checkpoint点晚于undo页面复用且此时发生redo后出现urecptr与xlog记录中的urecptr不一致的情况
2.astore表在enable_recyclebin=on场景下不支持创建段页式表
3.修复gs_undo_dump_xid视图xid校验问题
2024-07-29 20:23:09 +08:00
1019d31b14 jdbc支持全链路追踪 2024-07-29 18:59:54 +08:00
6a06f39a13 !5854 新增内置函数 gs_get_hba_conf ()
Merge pull request !5854 from james/hba9
2024-07-29 09:44:48 +00:00
22f89ae621 DSS推点 2024-07-29 17:29:45 +08: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
5ce788c88c !5800 慢SQL默认记录执行计划
Merge pull request !5800 from 申正/L0_record_query_plan
2024-07-29 04:09:45 +00:00
c9f247afd7 add hba conf again 2024-07-29 10:38:27 +08:00
744d4212b8 !5768 处理issue:视图列为基表列的表达式计算结果,修改基表列的变量类型后,查询视图宕机
Merge pull request !5768 from lukeman/core_pr
2024-07-29 02:21:21 +00:00
3a368c977f !5872 【资源池化】Dynamic Trace、DMS推点
Merge pull request !5872 from 刘博文/0716trace
2024-07-29 01:11:52 +00:00
0b3e1ca990 !5846 笔误
Merge pull request !5846 from 姜岩/master
2024-07-29 01:10:47 +00:00
0b32d68ceb !5891 修复事务并发场景Bug
Merge pull request !5891 from Mijamind/0728
2024-07-28 06:36:04 +00:00
4ad7ea0cc3 修复事务并发bug 2024-07-28 11:30:22 +08:00
34978f83c2 L0_record_query_plan 2024-07-27 20:02:18 +08:00
e0bd743d8f 处理issue:视图列为基表列的表达式计算结果,修改基表列的变量类型后,查询视图宕机 2024-07-27 17:03:34 +08:00
6cd2c376bf !5809 资源池化支持memcheck
Merge pull request !5809 from 胡正超/memcheck
2024-07-27 03:49:01 +00:00
3ff56d5dec !5840 修复游标表达式作targetlist的coredump问题
Merge pull request !5840 from chenxiaobin/fixCursor
2024-07-27 03:44:50 +00:00
edd49ba180 大括号笔误 2024-07-27 11:00:21 +08:00
c25093577e 修复游标表达式做targetlist的coredump问题 2024-07-27 10:23:50 +08:00
3e34295926 !5871 B库支持创建分区表时指定不小于MAXVALUE的值
Merge pull request !5871 from chenxiaobin/fixBpartition
2024-07-27 02:16:36 +00:00
fd6219e480 !5770 使用GMS_OUTPUT.PUT_LINE 报错异常 加上插件后core了
Merge pull request !5770 from 雷紫薇/bug133237
2024-07-27 02:09:33 +00:00
e96cd23a29 0716dmstrace 2024-07-27 09:55:42 +08:00
046166180d !5842 资源池化扩容节点初始化不更新控制文件
Merge pull request !5842 from 张悦萌/exp_dss
2024-07-26 09:09:46 +00:00
dc45f86493 !5878 【内核】fix dealock
Merge pull request !5878 from yaoxin/bugfix2
2024-07-26 08:37:52 +00:00
ec3210b733 !5870 修复IAEZOR所示的大数据量下执行游标表达报错的问题
Merge pull request !5870 from wangfeihuo/master
2024-07-26 08:37:05 +00:00
f5d43484eb !5864 支持向量数据库并行创建索引
Merge pull request !5864 from wangjingyuan8/datavec
2024-07-26 08:15:36 +00:00
7b978ac042 !5782 【Ustore】seq scan支持并行SMP
Merge pull request !5782 from 赵森/ustore_seqscan_smp
2024-07-26 08:04:23 +00:00
3abc3d8da1 !5788 给游标rowtype赋空值,挂库
Merge pull request !5788 from 雷紫薇/bug132557
2024-07-26 07:34:04 +00:00
a50aa3fc6f fix deadlock 2024-07-26 15:10:15 +08:00
01d4c96ad4 reuse function in astore 2024-07-26 14:49:59 +08:00
f918d211ec !5863 O兼容性:增加浮点数特殊值显示GUC控制
Merge pull request !5863 from 王平云/master
2024-07-26 06:49:13 +00:00
621008d477 支持向量数据库datavec并行创建索引 2024-07-26 14:19:31 +08:00
966c5103c2 Correct the name of functions 2024-07-26 13:58:31 +08:00
fab43c996a !5813 修复主机服务启动审计日志
Merge pull request !5813 from 邮储-王建达/bugfix_修复主机服务启动审计日志丢失
2024-07-26 03:16:56 +00:00
0e9673de81 !5868 shrink语句操作不存在的表时需要报错
Merge pull request !5868 from 胡正超/shrink
2024-07-26 03:05:00 +00:00
fdd455fc59 修改函数判断输入为0的逻辑;
修改入参为float4的负边界值时不应返回负无穷大
2024-07-26 10:31:06 +08:00
b372df81e4 fix shrink bug and misspelling 2024-07-26 10:15:58 +08:00
7d80255ab2 !5850 修复B库通过spi执行abort异常的问题
Merge pull request !5850 from chenxiaobin/fixAbort
2024-07-26 02:11:18 +00:00
ffd64175d3 【标题】: 修复IAEZOR所示的大数据量下执行游标表达报错的问题
【实现内容】: 修复IAEZOR所示的大数据量下执行游标表达报错的问题。
【根因分析】: 对于sql select a, cursor (xx) from table1, table1的每一行都要创建一个protal,prota需要推带session的hash表中存放,大数据量的时候直接撑破内存。
【实现方案】: 对于select a, cursor (xx) from table1此种场景,其实游标是没有意义的,因此没必要创建protal,可以直接返回。
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IAEZOR
2024-07-25 22:28:27 +08:00
b7cd8b830a B库支持创建分区表时指定大于MAXVALUE 2024-07-25 21:46:54 +08:00
dbd6d13ce3 !5824 解决创建function堆栈太深,解析时候报资源不足的问题
Merge pull request !5824 from shijuzheng1997/master
2024-07-25 11:24:17 +00:00
ac79778ae6 !5769 bugfix:tuplestore写入file时,memcount不会增加。导致获取memcount小于元组数量,出现踩内存错误
Merge pull request !5769 from 吴岳川/pipelined_core
2024-07-25 09:16:42 +00:00
fa92d98544 !5851 修改dms profile对inst_id的赋值
Merge pull request !5851 from 张悦萌/drop_dss
2024-07-25 08:54:09 +00:00
b5c04bb6dd 增加浮点数特殊值显示GUC控制 2024-07-25 16:00:22 +08:00
2c6ec0bc34 !5852 修复repl_scanner.l中的报错被删除后导致CI用例没过的问题
Merge pull request !5852 from cchen676/240710master
2024-07-25 06:09:11 +00:00
e7cbdfbe90 修复模式权限校验 2024-07-25 11:07:14 +08:00
21f718c3ba !5731 【需求】gs_ctl日志按照个数轮转
Merge pull request !5731 from blig/new_master
2024-07-25 02:21:26 +00:00
364cad1dd2 修复repl_scanner.l中的报错被删除后导致CI用例没过的问题 2024-07-25 09:38:02 +08:00
f251ec976e !5706 添加参数支持在外层使用cmake编译
Merge pull request !5706 from yuu/cmake4master
2024-07-25 01:05:32 +00:00
74f5335e45 修复B库通过spi执行abort异常的问题 2024-07-24 20:07:21 +08:00
700753a805 !5831 新增Generic WAL接口(为实现自定义访问方法的扩展供访问WAL的接口)
Merge pull request !5831 from 吉文克/datavec-0.7.2
2024-07-24 10:55:01 +00:00
e7fb56830d 新增支持Generic WAL接口 2024-07-24 17:37:46 +08:00
86fbc6a2b8 !5688 解决timescaledb插件, 普通表修改列字段属性后转化为超表插入数据失败
Merge pull request !5688 from 叶某人/I9VP6U
2024-07-24 09:23:41 +00:00
487ff48bae !5836 处理issue:基表关联视图后,把基表列类型由int改为numeric后,查询视图和基表时,报错说ERROR:compressed data is corrupt
Merge pull request !5836 from lukeman/master
2024-07-24 09:03:25 +00:00
0204df7dda !5847 修复逻辑复制场景下极致RTO回放过程中字段没有对齐的问题
Merge pull request !5847 from wofanzheng/master
2024-07-24 08:47:53 +00:00
12431a5920 On branch drop_dss
Your branch is up to date with 'origin/drop_dss'.
 Changes to be committed:
	modified:   src/gausskernel/ddes/adapter/ss_init.cpp
2024-07-24 16:30:20 +08:00
04a1cd9b67 !5838 【资源池化】【同步DMS】【同步CBB】7.23同步
Merge pull request !5838 from 董宁/sync18
2024-07-24 06:44:52 +00:00
ad968de0f0 !5832 按需回放RTO性能优化
Merge pull request !5832 from 陈栋/bugfix
2024-07-24 04:36:58 +00:00
c87f090f0b !5843 CMlock1锁还是要求回放
Merge pull request !5843 from 姜岩/master
2024-07-24 04:07:45 +00:00
896013619e !5837 修复预分配XLog文件问题
Merge pull request !5837 from JulianZhang/fix_init_xlog_files
2024-07-24 03:58:27 +00:00
0528470e1b 按需回放RTO性能优化
1. 按需回放跳过PreallocXlogFiles
2. failover阶段不打开全部的段页式文件
3. 实时构建升主阶段,HashMap线程裁剪日志不需要等待段页式日志回放完毕
2024-07-24 11:15:27 +08:00
4add8c33ec !5833 UWAL适配HCCS
Merge pull request !5833 from luqichao/adaptor_hccs
2024-07-24 03:05:35 +00:00
74059eaf88 lock1恢复要求回放功能 2024-07-24 10:43:50 +08:00
1438051a34 On branch exp_dss
Your branch is up to date with 'origin/exp_dss'.
 Changes to be committed:
	modified:   src/gausskernel/ddes/adapter/ss_dms_recovery.cpp
2024-07-24 09:04:22 +08:00
2f96703af2 !5724 【内核】闪回purge recyclebin操作权限修改
Merge pull request !5724 from 孙德超/bugfix4
2024-07-23 11:46:15 +00:00
ba9c9022a9 !5826 修复pg_proc_ext未指定rowtypeid和用例不稳定问题
Merge pull request !5826 from chenxiaobin/fixPgProcExt
2024-07-23 09:33:13 +00:00
626740a5de !5766 修复unusable分区索引后的core问题
Merge pull request !5766 from chenxiaobin/fixUpdateUnusable
2024-07-23 09:31:48 +00:00
9cd9208cb7 !5822 函数gs_get_preparse_location()实现
Merge pull request !5822 from 姜岩/master
2024-07-23 09:17:18 +00:00
56de8154bf !5830 修复sequence大小写忽略问题
Merge pull request !5830 from 梅程/sequenceCase
2024-07-23 08:59:15 +00:00
3d4670158d !5820 修复guc参数behavior_compat_options重复设置问题
Merge pull request !5820 from 梅程/behavior_compat_options
2024-07-23 08:57:34 +00:00
386b379ad2 【资源池化】【同步DMS】【同步CBB】7.23同步 2024-07-23 16:54:43 +08:00
fa1b926b82 preparse 2024-07-23 15:13:22 +08:00
31a61c7d03 !5825 支持gs_probackup使用对象存储备份备节点时可以跨集群恢复
Merge pull request !5825 from lukeman/oss_pr
2024-07-23 07:04:19 +00:00
6024672af7 fix: more xlog files are initialized when available xlogs are deleted manully 2024-07-23 14:48:41 +08:00
7ad99d704a 处理issue:基表关联视图后,把基表列类型由int改为numeric后,查询视图和基表时,报错说ERROR:compressed data is corrupt 2024-07-23 14:46:41 +08:00
fc295bc491 解决timescaledb插件, 普通表修改列字段属性后转化为超表插入数据失败 2024-07-22 20:36:22 +08:00
0b75fed17b Merge remote-tracking branch 'upstream/master' into adaptor_hccs 2024-07-22 17:24:31 +08:00
6d1a4a8c98 !5827 【bugfixed】解决分区表下并发执行 insert 和 reindex concurrently时coredump的问题
Merge pull request !5827 from laishenghao/reindex-insert
2024-07-22 07:48:00 +00:00
7e7446b8fd 【需求】gs_ctl日志按照个数轮转 2024-07-22 15:37:38 +08:00
ba1cb5036d !5791 guc参数disable_keyword_options适配插件
Merge pull request !5791 from 梅程/630-1
2024-07-22 07:14:03 +00:00
f55e86591b adaptor hccs 2024-07-22 15:09:08 +08:00
f27f8a7bc3 修复sequence大小写忽略问题 2024-07-22 13:19:00 +08:00
4902676db6 !5816 修复资源池化主备长稳死锁卡死的问题。
Merge pull request !5816 from 胡正超/deadlog
2024-07-22 03:27:43 +00:00
yuu
045dfc05c5 use cmake to build 2024-07-22 09:41:30 +08:00
ba0c0dce13 !5823 解决实时构建关闭阶段重置hashmap内存耗时过长导致的性能及SSWaitStartupExit问题
Merge pull request !5823 from 陈栋/bugfix
2024-07-21 01:28:14 +00:00
07e73f012f 修复pg_proc_ext未指定rowtypeid和用例不稳定问题 2024-07-21 09:04:28 +08:00
8919fa77c6 解决分区表下并发执行 insert 和 reindex concurrently时coredump的问题 2024-07-20 19:24:21 +08:00
917e617df8 支持gs_probackup使用对象存储备份备节点时可以跨集群恢复 2024-07-20 17:45:20 +08:00
409dc8bd6a !5821 节点状态未恢复run修复和日志格式规范补充
Merge pull request !5821 from zhengxue/zx_server_issue
2024-07-20 09:35:27 +00:00
550d1dfeb2 解决实时构建关闭阶段重置hashmap内存耗时过长导致的性能及SSWaitStartupExit退出问题 2024-07-20 17:24:55 +08:00
c3677de646 解决创建function堆栈太深,解析时候报资源不足问题 2024-07-20 16:27:26 +08:00
d09727fca3 !5817 DSS推点
Merge pull request !5817 from 王旭东/master
2024-07-20 06:16:27 +00:00
636fd721c7 fix reform stay PM_WAIT_BACKENDS and log style 2024-07-20 11:39:53 +08:00
2255a36d38 DSS推点 2024-07-20 11:01:09 +08:00
0c915621d2 修复guc参数behavior_compat_options重复设置问题 2024-07-19 19:04:54 +08:00
c82d9e72ac guc参数disable_keyword_options适配插件 2024-07-19 18:15:26 +08:00
f91a7b041f !5771 修复B兼容性create index include非键列
Merge pull request !5771 from 梅程/nullsfirst
2024-07-19 09:48:20 +00:00
15ef549386 !5778 【资源池化】【DMS推点】dms推点
Merge pull request !5778 from 陈超/zy
2024-07-19 09:01:24 +00:00
315df77d06 修复index include非键列 2024-07-19 15:39:14 +08:00
f3b82066f6 !5712 xlog vg name guc(资源池化性能优化)
Merge pull request !5712 from Carl/master
2024-07-19 06:19:25 +00:00
5c49a0559f 备机读页面时如果失败则改为本地加X锁dms加S锁请求,防止同时主机请求写页面时拿不到锁 2024-07-19 10:59:09 +08:00
0091668625 xlog vg name guc 2024-07-19 09:37:59 +08:00
59cd03e5d8 !5603 解决《asan回归测试用例发现pagehack工具有内存越界》问题
Merge pull request !5603 from lexin184383/pagehack
2024-07-19 01:34:48 +00:00
31219c0fa3 !5810 modify error message when create global partition index
Merge pull request !5810 from 徐达标/0718
2024-07-18 11:55:15 +00:00
6fa297b2c4 modify error message when create global partition index 2024-07-18 08:56:20 +00:00
50eef0ac3a 修复主机服务启动审计日志丢失
在 startup 线程启动前, 初始化 pgaudit 线程.

Signed-off-by: 邮储-王建达 <rjyf_wjd@163.com>
2024-07-18 08:14:53 +00:00
30e7e0b864 !5806 修复tableAM接口入参tupledesc携带表类型为uheap时导致的断言失败问题
Merge pull request !5806 from wofanzheng/master
2024-07-18 07:54:35 +00:00
da517259e9 add version mode into version.cfg 2024-07-18 15:54:30 +08:00
e427efb2ed !5802 修复B库下gs_dump的core问题
Merge pull request !5802 from chenxiaobin/parallel_enable_rel2
2024-07-17 13:33:08 +00:00
a32719b4cd 修复gs_dump的core问题 2024-07-17 20:48:31 +08:00
9e0d0e63ae !5801 修复三方库新增aws组件时对应so文件未拷入安装目录lib
Merge pull request !5801 from lukeman/oss_pr
2024-07-17 10:32:21 +00:00
1d393ac845 !5728 函数/PACKAGE支持并行相关参数特性
Merge pull request !5728 from chenxiaobin/parallel_enable_rel2
2024-07-17 10:23:26 +00:00
c436544b52 拷贝so文件 2024-07-17 16:32:22 +08:00
45a52830dd 处理检视意见 2024-07-17 16:29:06 +08:00
584d420639 add testcase smp_cursor&&parallel_enable_function 2024-07-17 16:29:06 +08:00
2afbe6fb56 support smp for functionscan with cursor arg 2024-07-17 16:29:05 +08:00
65da7e14f4 support smp cursor 2024-07-17 16:27:53 +08:00
3a3e54a07a !5786 处理issue: 两个package body都有初始化匿名块,package嵌套调用,编译时会死循环导致爆栈
Merge pull request !5786 from lukeman/plsql_pr
2024-07-17 06:47:10 +00:00
3be6482fc3 !5773 concat、concat_ws函数支持simplify;字段引用表达式兼容
Merge pull request !5773 from laishenghao/concat
2024-07-17 06:24:46 +00:00
2e7732d72d !5750 修复6.0.0资源池化gs_probackup vgname如果只配置数据目录,不配置日志目录,还原后,日志目录会丢失原有的软连接
Merge pull request !5750 from hejiahuan11/vgname-log
2024-07-17 06:11:16 +00:00
80263d9aa7 concat、concat_ws函数支持simplify;字段引用表达式兼容 2024-07-17 11:46:00 +08:00
aef5305f8d !5761 修复copy使用参数when_expr空语句后core问题
Merge pull request !5761 from zhubin79/copy_whenexpr
2024-07-17 02:09:46 +00:00
440f849f08 处理issue: 两个package body都有初始化匿名块,package嵌套调用,编译时会死循环导致爆栈 2024-07-16 22:29:22 +08:00
a2e87ca11c !4778 IUDS优化batchcmd_insert相关用例
Merge pull request !4778 from yuu/iud4master_heap_multi_insert
2024-07-16 11:58:00 +00:00
yuu
19991dda62 Merge branch 'master' of gitee.com:opengauss/openGauss-server into iud4master_heap_multi_insert
Signed-off-by: yuu <chenyw1@vastdata.com.cn>
2024-07-16 11:00:58 +00:00
1466895187 !5602 解决《select 'a'@@ repeat('3@n',96000);语句执行时间较长》问题
Merge pull request !5602 from lexin184383/select_repeat
2024-07-16 10:50:33 +00:00
4abafc6b22 ustore support seq scan smp 2024-07-16 17:41:45 +08:00
5b58057d4b !5714 支持TO_BINARY_FLOAT函数;支持IS [NOT] INFINITE和IS [NOT] NAN条件表达式
Merge pull request !5714 from zhubin79/to1
2024-07-16 08:58:21 +00:00
4655a6406b !5762 解决timescaledb插件,时序表查看指定的SQL执行计划时,数据库失去连接
Merge pull request !5762 from 叶某人/IA9PSF
2024-07-16 07:55:51 +00:00
6e54a64ee1 !5772 修复双集群switchover
Merge pull request !5772 from Carl/page
2024-07-16 07:22:14 +00:00
66f7864d35 !5774 逻辑复制并行解码时在BEGIN消息添加xid信息
Merge pull request !5774 from blig/new_master2
2024-07-16 06:52:42 +00:00
6d272d3abd !5730 支持以f,d作为浮点数,支持浮点数特殊值
Merge pull request !5730 from 王平云/master
2024-07-16 06:31:12 +00:00
c59d0861dc TO_BINARY_FLOAT 函数实现、IS [NOT] NAN与IS [NOT] INFINITE表达式实现 2024-07-16 14:15:35 +08:00
4008365f91 !5779 【资源池化】【bugfix】指针变量未取内容,导致打印信息错误
Merge pull request !5779 from 王子维/ziwei_fix
2024-07-16 06:14:29 +00:00
3ba8092476 !5780 【资源池化】【bugfix】修正混淆的日志报错信息
Merge pull request !5780 from 王子维/ziweifix-2
2024-07-16 06:12:41 +00:00
2315f699fe 修复赋空值挂库问题 2024-07-16 05:21:10 +00:00
d1d7815379 支持以f,d作为浮点数,支持浮点数特殊值 2024-07-16 11:35:36 +08:00
4fb1c4b9f6 !5785 修复SPI场景执行子事务执行release savepoint时候core的问题 & 删除无用assert
Merge pull request !5785 from yaoxin/bugfix
2024-07-16 03:32:22 +00:00
d3e15c15e8 !5684 MySql兼容性增强
Merge pull request !5684 from 梅程/630
2024-07-16 03:03:57 +00:00
688f292c9f [VACUUM] Use tidstore & implement bypass index vacuum 2024-07-16 10:22:03 +08:00
147691ea9c 修复双集群switchover 2024-07-16 10:11:26 +08:00
0b1a2bd4d3 修复SPI场景执行子事务执行release savepoint时候core的问题 2024-07-16 09:48:17 +08:00
891c47ff72 删除无用assert 2024-07-16 09:43:48 +08:00
318977c1e2 !5784 Uwal 性能优化
Merge pull request !5784 from luqichao/uwal_truncate_optimize
2024-07-15 13:20:42 +00:00
5852422880 fix typo 2024-07-15 19:30:00 +08:00
0ab0395743 【资源池化】【bugfix】修正混淆的日志报错信息 2024-07-15 17:35:32 +08:00
661f29ce9d optimize truncate 2024-07-15 17:25:46 +08:00
6f391b0d1c 【资源池化】【bugfix】指针变量未取内容,导致打印信息错误 2024-07-15 17:05:58 +08:00
yuu
5896a05da4 use heap_multi_insert for the insert into xxx select yyy query.
fix comment from committer

add test
2024-07-15 16:38:59 +08:00
bcf34f0cde dms推点 2024-07-15 16:30:24 +08:00
1e4505e3d4 逻辑复制并行解码的begin中添加xid 2024-07-15 08:46:20 +08:00
6f25f4b4a7 cursor不带sql语句时在打开cursor时初始化rowtype 2024-07-12 11:29:51 +00:00
bb837af928 bugfix:tuplestore写入file时,memcount不会增加。导致获取memcount小于元组数量,出现踩内存错误 2024-07-12 16:32:05 +08:00
9c4a57af94 修复copy语句WHEN被when_expr字符串注入问题 2024-07-12 15:49:55 +08:00
38de12c76b !5573 根据阈值预分配xlog文件
Merge pull request !5573 from JulianZhang/pre_init_xlog_files
2024-07-12 06:39:24 +00:00
e628f4c1c5 MySql兼容性增强 2024-07-12 14:27:46 +08:00
9c10504c97 !5200 alter trigger方式启用/禁用单个触发器
Merge pull request !5200 from ljy/alter_trigger
2024-07-12 03:03:26 +00:00
47da2846ad !5756 【资源池化】【DMS推点】适配修改故障注入框架trigger新增point参数
Merge pull request !5756 from 陈超/zy
2024-07-12 02:48:38 +00:00
6b2e0b8786 vgname-log 2024-07-11 20:38:12 +08:00
276b9636f9 trc_gen.py生成脚本改为python3执行 2024-07-11 20:22:39 +08:00
95747aeef4 修复unusable分区索引后的core问题 2024-07-11 20:18:09 +08:00
8d33e9eb67 !5760 【资源池化】【bugfix】修复主机drop db后,备机查询gsc_dbstat_info中还有已删除的db信息的问题
Merge pull request !5760 from cchen676/240710master
2024-07-11 09:22:30 +00:00
3638bbc01f !5764 回退扩页写0
Merge pull request !5764 from Carl/page
2024-07-11 09:16:12 +00:00
11c15e382e 回退扩页写0 2024-07-11 16:08:53 +08:00
211dba76b8 修复资源池化下主机drop db,备机gsc缓存未清理的问题 2024-07-11 11:23:12 +08:00
1241891e7d advance xlog files, remove test case 2024-07-11 11:15:31 +08:00
f8ae33478f !5755 修复发布订阅dump用例失败问题
Merge pull request !5755 from chenxiaobin/fixSubDump
2024-07-11 02:16:46 +00:00
59e22b540e 修复发布订阅dump用例失败问题 2024-07-10 21:12:47 +08:00
694208a4e8 解决timescaledb插件,时序表查看指定的SQL执行计划时,数据库失去连接 2024-07-10 21:09:50 +08:00
a13df28aac !5759 部分日志优化调整
Merge pull request !5759 from 徐达标/0709
2024-07-10 11:04:09 +00:00
008fb65d25 日志优化 2024-07-10 17:20:13 +08:00
c492c5aea0 故障注入框架trigger新增point参数 2024-07-10 15:23:53 +08:00
7c7b30fc8a !5746 修复pipelined func调用core问题
Merge pull request !5746 from 吴岳川/pipelined_core
2024-07-10 06:51:06 +00:00
96f2db7f85 !5539 添加外键约束时的锁降级
Merge pull request !5539 from chenxiaobin/fixAlterTableLock
2024-07-10 06:44:35 +00:00
f9a385fa76 修复pipelined func调用core问题 2024-07-09 21:58:38 +08:00
e5297cc252 解决timescaledb插件,根据btree索引对时序表进行聚簇排序报错 2024-07-09 20:16:20 +08:00
1ef8515ff9 !5715 增加创表时对列存储的创建方式的限制
Merge pull request !5715 from 王明轩/20240702wmx
2024-07-09 11:17:38 +00:00
1add77c4a5 !5743 双集群备集群不做disk lsn检验
Merge pull request !5743 from zhengxue/zx_server_issue
2024-07-09 11:03:11 +00:00
627d9b634a 添加外键约束时的锁降级 2024-07-09 17:36:07 +08:00
99ee1b435c !5661 需求:内核数据备份需支持OSS
Merge pull request !5661 from lukeman/oss_pr
2024-07-09 09:04:43 +00:00
1d7ee817a6 forbid standby cluster to check disk lsn 2024-07-09 16:48:22 +08:00
2bc1b621c3 修复xheap使用两种方式创表结果不同的问题 2024-07-09 15:36:54 +08:00
d525824a3e !5732 do not reduce sort of subquery when query contains limit etc
Merge pull request !5732 from 吴岳川/sort_reduce
2024-07-09 06:36:35 +00:00
d60f8c5991 !5727 Pipelined函数bugfix
Merge pull request !5727 from 吴岳川/pipelined_bugfix
2024-07-09 03:49:25 +00:00
9ec3eba6e0 数据备份支持oss 2024-07-09 11:10:40 +08:00
16864a20d0 !5718 修复IA92ZU所示的正则表达式为[[:digit:]]时core的问题
Merge pull request !5718 from wangfeihuo/master
2024-07-08 14:51:16 +00:00
91ba2b5e05 !5171 IUDS优化,调整热点函数调用顺序
Merge pull request !5171 from npczwh1/iuds_opt1
2024-07-08 11:49:35 +00:00
e3b9dad440 !5672 float精度支持范围调整为(1~126)以及支持numeric的scale为负数
Merge pull request !5672 from huangjiajun/float_support
2024-07-08 09:47:11 +00:00
8010629390 !5700 修复on update场景在sqlbypass下的问题
Merge pull request !5700 from chenxiaobin/fixOnUpdateSqlbypass
2024-07-08 08:57:48 +00:00
547d2cf0d5 do not reduce sort of subquery when query contains limit etc 2024-07-08 15:25:23 +08:00
142c3e3ad9 advance xlog files 2024-07-08 11:08:01 +08:00
378db1c754 bugfix: owner nullptr 2024-07-08 10:02:19 +08:00
ce46eac262 pipelined非自治事务调用DML语句报错 2024-07-08 09:57:11 +08:00
43664fcb68 修改purge recyclebin权限 2024-07-05 15:18:55 +08:00
edeaefd559 modify code 2024-07-05 14:55:16 +08:00
33ab272a10 !5721 support vacuum full
Merge pull request !5721 from yaoxin/vacuum
2024-07-05 06:06:19 +00:00
7dad3afbbd !5717 【内核】修复select for update/share过程中行级锁被清理导致并发执行异常问题
Merge pull request !5717 from yaoxin/master
2024-07-05 05:58:42 +00:00
d0020da14d support vacuum full 2024-07-05 11:06:53 +08:00
1fcc514c95 !5689 解决timescaledb插件,创建超表时使用了非plpgsql类型的触发器的问题
Merge pull request !5689 from 叶某人/IA5DSZ
2024-07-05 02:11:30 +00:00
15a4df15c3 !5686 解决timescaledb插件,时间间隔为week,使用time_bucket分组聚合报错超范围
Merge pull request !5686 from 叶某人/IA527B
2024-07-05 02:10:46 +00:00
52668cbc9f 复select for update/share过程中行级锁被清理导致并发执行异常问题 2024-07-04 15:38:23 +08:00
46956673c4 support float & numeric with negative scale 2024-07-04 09:15:58 +08:00
a0fbf45eb5 【标题】: 修复IA92ZU所示的正则表达式为[[:digit:]]时core的问题
【实现内容】: 修复IA92ZU所示的正则表达式为[[:digit:]]时core的问题。
【根因分析】: 访问空指针了。
【实现方案】: 访问前增加指针判断。
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IA92ZU
2024-07-03 19:08:20 +08:00
b4246adfad !5698 tsdb适配opengauss
Merge pull request !5698 from 李锦波/ssjss
2024-07-03 10:02:35 +00:00
c98a8dabde !5710 修复一个多层嵌套且访问多个外表列的时候发生了core的问题
Merge pull request !5710 from wangfeihuo/master
2024-07-03 08:32:04 +00:00
3bdceb6f40 修复一个cursor expression的问题 2024-07-02 19:36:36 +08:00
cb0359b981 select 'a'@@ repeat('3@n',96000);语句执行时间较长 2024-07-02 11:24:28 +08:00
66948ff5ba asan回归测试用例发现pagehack工具有内存越界 2024-07-02 11:21:09 +08:00
6049731c6f 创表之后,gs_dump导出的时候上报告警,提示WARNING:archive items not in correct section order cursection 2024-07-02 11:16:04 +08:00
ee4fc88688 tsdb适配 2024-07-02 10:13:43 +08:00
f8ca1af762 修复on update场景在sqlbypass下的问题 2024-07-01 15:42:48 +08:00
4b51be8e3b iuds opt 2024-07-01 10:26:04 +08:00
11c41c967b 处理issue:ThreadPoolListener readySession泄露问题 2024-06-29 16:44:50 +08:00
89691977b5 解决timescaledb插件,创建超表时使用了非plpgsql类型的触发器的问题 2024-06-28 12:14:28 +08:00
0a84716f30 解决timescaledb插件,时间间隔为week,使用time_bucket分组聚合报错超范围 2024-06-28 11:46:03 +08:00
523351dce1 alter trigger方式启用(禁用)单个触发器 2024-06-28 10:53:29 +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
1643 changed files with 191937 additions and 10657 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
docker/dockerfiles/create_master_slave.sh text=auto

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,12 +147,24 @@ 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/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--2.0.1--2.0.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--4.0--4.0.1.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/dolphin--4.0.1--4.0.sql
DESTINATION share/postgresql/extension/
)
install(FILES ${CMAKE_SOURCE_DIR}/contrib/dolphin/openGauss_expr_dolphin.ir
DESTINATION share/postgresql/extension/
)

View File

@ -63,6 +63,7 @@ install:
$(MAKE) -C $(root_builddir)/distribute/kernel/extension/dimsearch $@
$(MAKE) -C contrib/security_plugin $@
$(MAKE) -C $(root_builddir)/distribute/kernel/extension/tsdb $@
$(MAKE) -C contrib/common_cipher $@
+@echo "openGauss installation complete."
else
ifeq ($(enable_privategauss), yes)
@ -75,6 +76,7 @@ install:
$(MAKE) -C contrib/hstore $@
$(MAKE) -C $(root_builddir)/privategauss/kernel/extension/packages $@
$(MAKE) -C $(root_builddir)/contrib/gsredistribute $@
$(MAKE) -C contrib/common_cipher $@
+@echo "openGauss installation complete."
else
install:
@ -84,6 +86,7 @@ install:
$(MAKE) -C contrib/postgres_fdw $@
$(MAKE) -C contrib/hstore $@
$(MAKE) -C $(root_builddir)/privategauss/kernel/extension/packages $@
$(MAKE) -C contrib/common_cipher $@
+@echo "openGauss installation complete."
endif
else
@ -95,13 +98,32 @@ install:
$(MAKE) -C contrib/hstore $@
$(MAKE) -C contrib/dblink $@
$(MAKE) -C contrib/ndpplugin $@
$(MAKE) -C contrib/common_cipher $@
@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,17 +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>gcc7.3</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/latest/binarylibs/gcc7.3/openGauss-third_party_binarylibs_openEuler_arm.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc7.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/latest/binarylibs/gcc7.3/openGauss-third_party_binarylibs_openEuler_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc7.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/latest/binarylibs/gcc7.3/openGauss-third_party_binarylibs_Centos7.6_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc7.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/latest/binarylibs/gcc7.3/openGauss-third_party_binarylibs_openEuler_arm.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc7.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/latest/binarylibs/gcc7.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz">https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc7.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz</a></td>
<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/>
@ -520,6 +525,7 @@ https://opengauss.org/zh/
</tr>
</table>
注:6.0.0及以后的版本请使用gcc10.3的三方库进行编译
现在我们已经拥有完整的openGauss代码,把它存储在以下目录中(以sda为例)。
@ -609,9 +615,6 @@ openGauss-server中的build.sh是编译过程中的重要脚本工具。该工
**debug**版本:
```
# gcc7.3.0版本
./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib
# gcc10.3.1版本(一般用于openEuler + ARM架构)
./configure --gcc-version=10.3.1 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib
@ -623,9 +626,6 @@ openGauss-server中的build.sh是编译过程中的重要脚本工具。该工
**release**版本:
```
# gcc7.3.0版本
./configure --gcc-version=7.3.0 CC=g++ CFLAGS="-O2 -g3" --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-thread-safety --with-readline --without-zlib
# gcc10.3.1版本(一般用于openEuler + ARM架构)
./configure --gcc-version=10.3.1 CC=g++ CFLAGS="-O2 -g3" --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-thread-safety --with-readline --without-zlib
@ -637,9 +637,6 @@ openGauss-server中的build.sh是编译过程中的重要脚本工具。该工
**memcheck**版本:
```
# gcc7.3.0版本
./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib --enable-memory-check
# gcc10.3.1版本(一般用于openEuler + ARM架构)
./configure --gcc-version=10.3.1 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib --enable-memory-check

File diff suppressed because it is too large Load Diff

View File

@ -32,6 +32,7 @@ function print_help()
-pm|--product_mode this values of paramenter is opengauss or lite or finance, the default value is opengauss.
-nls|--enable_nls enable Native Language Support
--relocation generate gaussdb.map with relocation(GCC >=10.3).
--cmake use cmake to build openGauss, which is faster than traditional configure/autoconf
"
}
@ -90,6 +91,10 @@ while [ $# -gt 0 ]; do
extra_config_opt="$extra_config_opt --config_opt --enable-relocation "
shift 1
;;
-C|--cmake)
build_by_cmake='--cmake'
shift 1
;;
*)
echo "Internal Error: option processing error: $1" 1>&2
echo "please input right paramtenter, the following command may help you"
@ -103,7 +108,7 @@ ROOT_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
echo "ROOT_DIR : $ROOT_DIR"
cd build/script
chmod a+x build_opengauss.sh
./build_opengauss.sh -m ${build_version_mode} -3rd ${build_binarylib_dir} ${not_optimized} -pkg server ${build_with_tassl} -pm ${product_mode} ${extra_config_opt}
./build_opengauss.sh -m ${build_version_mode} -3rd ${build_binarylib_dir} ${not_optimized} -pkg server ${build_with_tassl} -pm ${product_mode} ${extra_config_opt} ${build_by_cmake}
if [ $? -ne 0 ]; then
echo "build_opengauss.sh failed, aborting."
exit 1

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
@ -47,6 +48,7 @@
./bin/gs_plan_simulator.sh
./bin/pg_xlogdump
./bin/pagehack
./bin/pg_archivecleanup
./bin/gs_assessment
./bin/gs_retrieve
./etc/kerberos/kadm5.acl
@ -75,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
@ -84,8 +86,12 @@
./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/whale.control
./share/postgresql/extension/whale--1.0.sql
./share/postgresql/extension/openGauss_expr_dolphin.ir

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,8 +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
@ -57,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
@ -701,6 +725,8 @@
./lib/libdcf.so
./lib/libzstd.so*
./lib/libcurl.so*
./lib/libaws-cpp-sdk-core.so
./lib/libaws-cpp-sdk-s3.so
./lib/libxgboost.so
./lib/libpagecompression.so*
./lib/postgresql/latin2_and_win1250.so
@ -739,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
@ -919,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
@ -48,6 +49,7 @@
./bin/gs_plan_simulator.sh
./bin/pg_xlogdump
./bin/pagehack
./bin/pg_archivecleanup
./bin/gs_assessment
./bin/gs_retrieve
./etc/kerberos/kadm5.acl
@ -75,8 +77,10 @@
./share/postgresql/extension/ndpplugin--1.0.sql
./share/postgresql/extension/spqplugin.control
./share/postgresql/extension/spqplugin--1.0.sql
./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
@ -85,13 +89,19 @@
./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/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
@ -112,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
@ -730,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
@ -803,18 +832,31 @@
./lib/postgresql/pg_plugin
./lib/postgresql/proc_srclib
./lib/postgresql/security_plugin.so
./lib/postgresql/timescaledb-1.7.4.so
./lib/postgresql/timescaledb.so
./lib/postgresql/timescaledb-tsl-1.7.4.so
./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
@ -832,9 +874,7 @@
./lib/libecpg.a
./lib/libecpg_compat.a
./lib/libpgtypes.a
./lib/libpgtypes.so
./lib/libpgtypes.so.3
./lib/libpgtypes.so.3.4
./lib/libpgtypes.so*
./lib/libgauss_cl_jni.so
./lib/libnuma.so
./lib/libnuma.so.1
@ -871,6 +911,8 @@
./lib/krb5/plugins/kdb/db2.so
./lib/libverto.so*
./lib/libcurl.so*
./lib/libaws-cpp-sdk-core.so
./lib/libaws-cpp-sdk-s3.so
./lib/libcrypto.so*
./lib/libssl.so*
./lib/libgcc_s.so.1

View File

@ -29,6 +29,7 @@ function print_help()
-s|--symbol_mode whether separate symbol in debug mode, the default value is on.
-co|--cmake_opt more cmake options
-T|--tassl build with tassl
--cmake build by cmake
"
}
@ -124,6 +125,10 @@ while [ $# -gt 0 ]; do
build_with_tassl="YES"
shift 1
;;
--cmake)
CMAKE_PKG="Y"
shift 1
;;
*)
echo "Internal Error: option processing error: $1" 1>&2
echo "please input right paramtenter, the following command may help you"

View File

@ -43,7 +43,7 @@ else
fi
if [ X"$kernel" == X"euleros" ]; then
dist_version="EULER"
dist_version="EulerOS"
elif [ X"$kernel" == X"centos" ]; then
dist_version="CentOS"
elif [ X"$kernel" == X"openeuler" ]; then
@ -54,6 +54,8 @@ else
dist_version="Platform"
fi
os_version=$(cat /etc/os-release | grep -w VERSION_ID | awk -F '"' '{print $2}')
show_package=false
gcc_version="10.3.1"
@ -290,12 +292,11 @@ fi
#######################################################################
## declare all package name
#######################################################################
declare version_string="${mppdb_name_for_package}-${version_number}"
declare package_pre_name="${version_string}-${dist_version}-${PLATFORM_ARCH}"
declare server_package_name="${package_pre_name}.${install_package_format}.gz"
declare package_version_name="${version_number}-${dist_version}${os_version}-${PLATFORM_ARCH}"
declare server_package_name="${mppdb_name_for_package}-${package_version_name}.${install_package_format}.gz"
declare libpq_package_name="${package_pre_name}-Libpq.${install_package_format}.gz"
declare symbol_package_name="${package_pre_name}-symbol.${install_package_format}.gz"
declare libpq_package_name="${mppdb_name_for_package}-Libpq-${package_version_name}.${install_package_format}.gz"
declare symbol_package_name="${mppdb_name_for_package}-symbol-${package_version_name}.${install_package_format}.gz"
echo "[makemppdb] $(date +%y-%m-%d' '%T): script dir : ${SCRIPT_DIR}"
ROOT_DIR=$(dirname "$SCRIPT_DIR")
@ -349,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
@ -472,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
@ -529,6 +527,10 @@ function install_gaussdb()
commitid=$(LD_PRELOAD='' ${BUILD_DIR}/bin/gaussdb -V | cut -d ")" -f 1 | awk '{print $NF}')
echo "${commitid}" >>${SCRIPT_DIR}/version.cfg
echo "End insert commitid into version.cfg" >> "$LOG_FILE" 2>&1
#insert the version mode to version.cfg
echo "$version_mode" >> ${SCRIPT_DIR}/version.cfg
echo "End insert version mode into version cfg" >> "$LOG_FILE" 2>&1
}
#######################################################################
@ -587,7 +589,7 @@ function target_file_copy_for_non_server()
done
}
declare bin_name="${package_pre_name}.bin"
declare bin_name="${mppdb_name_for_package}-${package_version_name}.bin"
declare sha256_name=''
declare script_dir="${ROOT_DIR}/script"
@ -639,7 +641,7 @@ function target_file_copy()
echo "End generate ${bin_name} bin file" >> "$LOG_FILE" 2>&1
#generate sha256 file
sha256_name="${package_pre_name}.sha256"
sha256_name="${mppdb_name_for_package}-${package_version_name}.sha256"
echo "Begin generate ${sha256_name} sha256 file..." >> "$LOG_FILE" 2>&1
sha256sum "${bin_name}" | awk -F" " '{print $1}' > "$sha256_name"
if [ $? -ne 0 ]; then
@ -811,4 +813,4 @@ mkdir ${ROOT_DIR}/output
mv ${ROOT_DIR}/build/script/*.tar.gz ${ROOT_DIR}/output/
test -e ${ROOT_DIR}/build/script/gaussdb.map && mv ${ROOT_DIR}/build/script/gaussdb.map ${ROOT_DIR}/output/
echo "now, all packages has finished!"
exit 0
exit 0

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

@ -61,8 +61,10 @@
./share/postgresql/extension/hstore.control
./share/postgresql/extension/security_plugin.control
./share/postgresql/extension/security_plugin--1.0.sql
./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
@ -71,13 +73,19 @@
./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/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
@ -101,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
@ -718,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
@ -776,16 +803,29 @@
./lib/postgresql/pg_plugin
./lib/postgresql/proc_srclib
./lib/postgresql/security_plugin.so
./lib/postgresql/timescaledb-1.7.4.so
./lib/postgresql/timescaledb.so
./lib/postgresql/timescaledb-tsl-1.7.4.so
./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
@ -864,6 +904,8 @@
./lib/libcurl.so
./lib/libcurl.so.4
./lib/libcurl.so.4.6.0
./lib/libaws-cpp-sdk-core.so
./lib/libaws-cpp-sdk-s3.so
./lib/libcrypto.so
./lib/libcrypto.so.1.1
./lib/libssl.so

View File

@ -21,7 +21,7 @@ function gaussdb_pkg_pre_clean()
function read_gaussdb_version()
{
cd ${SCRIPT_DIR}
echo "${product_name}-${version_number}" > version.cfg
echo "${product_name}-Server-${version_number}" > version.cfg
#auto read the number from kernal globals.cpp, no need to change it here
}
@ -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
}
#######################################################################
@ -63,6 +56,15 @@ function get_kernel_commitid()
echo "End insert commitid into version.cfg" >> "$LOG_FILE" 2>&1
}
#######################################################################
##insert the version mode to version.cfg
#######################################################################
function get_version_mode()
{
echo "$version_mode" >> ${SCRIPT_DIR}/version.cfg
echo "End insert version mode into version cfg" >> "$LOG_FILE" 2>&1
}
#######################################################################
## generate the version file.
#######################################################################
@ -157,6 +159,9 @@ function install_gaussdb()
#insert the commitid to version.cfg as the upgrade app path specification
get_kernel_commitid
#insert the version mode to version.cfg
get_version_mode
}
#######################################################################
@ -177,4 +182,4 @@ function gaussdb_build()
echo "please input right paramenter values server or libpq "
exit 1
esac
}
}

View File

@ -59,14 +59,13 @@ select_package_command
#######################################################################
##get os dist version
#######################################################################
os_name=$(cat /etc/os-release | grep -w NAME | awk -F '"' '{print $2}')
if [[ -f "/etc/openEuler-release" ]]; then
os_name="openEuler"
elif [[ -f "/etc/euleros-release" ]]; then
os_name="EulerOS"
elif [[ -f "/etc/centos-release" ]]; then
os_name="CentOS"
elif [[ -f "/etc/openEuler-release" ]]; then
os_name="openEuler"
elif [[ -f "/etc/FusionOS-release" ]]; then
os_name="FusionOS"
elif [[ -f "/etc/kylin-release" ]]; then
@ -78,13 +77,15 @@ elif [[ -f "/etc/CSIOS-release" ]]; then
else
os_name=$(lsb_release -d | awk -F ' ' '{print $2}'| tr A-Z a-z | sed 's/.*/\L&/; s/[a-z]*/\u&/g')
fi
os_version=$(cat /etc/os-release | grep -w VERSION_ID | awk -F '"' '{print $2}')
if [ "$os_name"X == ""X ]; then
echo "os name is empty"
exit 1
fi
##add platform architecture information
if [ "$PLATFORM_ARCH"X == "aarch64"X ] ; then
if [ "$os_name" != "openEuler" ] && [ "$os_name" != "EulerOS" ] && [ "$os_name" != "FusionOS" ] && [ "$os_name" != "Kylin" ] && [ "$dist_version" != "Asianux" ] && [ "$os_name" != "CSIOS" ]; then
echo "We only support NUMA on openEuler(aarch64), EulerOS(aarch64), FusionOS(aarch64), Kylin(aarch64), Asianux, CSIOS(aarch64) platform."
exit 1
fi
GAUSSDB_EXTRA_FLAGS=" -D__USE_NUMA"
fi
@ -144,10 +145,9 @@ declare release_file_list="${PLATFORM_ARCH}_${product_mode}_list"
#######################################################################
## declare all package name
#######################################################################
declare version_string="${product_name}-${version_number}"
declare package_pre_name="${version_string}-${os_name}-${PLATFORM}bit"
declare libpq_package_name="${package_pre_name}-Libpq.tar.gz"
declare tools_package_name="${package_pre_name}-tools.tar.gz"
declare kernel_package_name="${package_pre_name}.tar.bz2"
declare symbol_package_name="${package_pre_name}-symbol.tar.gz"
declare sha256_name="${package_pre_name}.sha256"
declare package_version_name="${version_number}-${os_name}${os_version}-${PLATFORM_ARCH}"
declare libpq_package_name="${product_name}-Libpq-${package_version_name}.tar.gz"
declare tools_package_name="${product_name}-Tools-${package_version_name}.tar.gz"
declare kernel_package_name="${product_name}-Server-${package_version_name}.tar.bz2"
declare symbol_package_name="${product_name}-Symbol-${package_version_name}.tar.gz"
declare sha256_name="${product_name}-Server-${package_version_name}.sha256"

View File

@ -71,7 +71,6 @@ function target_file_copy()
echo "End generate ${kernel_package_name} tar file" >> "$LOG_FILE" 2>&1
#generate sha256 file
sha256_name="${package_pre_name}.sha256"
echo "Begin generate ${sha256_name} sha256 file..." >> "$LOG_FILE" 2>&1
sha256sum "${kernel_package_name}" | awk -F" " '{print $1}' > "$sha256_name"
if [ $? -ne 0 ]; then

View File

@ -21,7 +21,7 @@ function gaussdb_pkg_pre_clean()
function read_gaussdb_version()
{
cd ${SCRIPT_DIR}
echo "${product_name}-${version_number}" > version.cfg
echo "${product_name}-Server-${version_number}" > version.cfg
#auto read the number from kernal globals.cpp, no need to change it here
}
@ -30,6 +30,7 @@ ROACH_DIR="${ROOT_DIR}/distribute/bin/roach"
MPPDB_DECODING_DIR="${ROOT_DIR}/contrib/mppdb_decoding"
XLOG_DUMP_DIR="${ROOT_DIR}/contrib/pg_xlogdump"
PAGE_HACK_DIR="${ROOT_DIR}/contrib/pagehack"
ARCH_CLEAN_DIR="${ROOT_DIR}/contrib/pg_archivecleanup"
###################################
@ -46,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
}
#######################################################################
@ -70,6 +64,15 @@ function get_kernel_commitid()
echo "End insert commitid into version.cfg" >> "$LOG_FILE" 2>&1
}
#######################################################################
##insert the version mode to version.cfg
#######################################################################
function get_version_mode()
{
echo "$version_mode" >> ${SCRIPT_DIR}/version.cfg
echo "End insert version mode into version cfg" >> "$LOG_FILE" 2>&1
}
#######################################################################
## generate the version file.
#######################################################################
@ -161,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
@ -237,7 +240,7 @@ function install_gaussdb()
fi
fi
fi
cd "$ROOT_DIR/contrib/pg_upgrade_support"
make clean >> "$LOG_FILE" 2>&1
make -sj >> "$LOG_FILE" 2>&1
@ -312,9 +315,16 @@ function install_gaussdb()
make install -sj >> "$LOG_FILE" 2>&1
echo "End make install pagehack" >> "$LOG_FILE" 2>&1
cd "$ARCH_CLEAN_DIR"
make clean >> "$LOG_FILE" 2>&1
make -sj >> "$LOG_FILE" 2>&1
make install -sj >> "$LOG_FILE" 2>&1
echo "End make install archivecleanup" >> "$LOG_FILE" 2>&1
chmod 444 ${BUILD_DIR}/bin/cluster_guc.conf
dos2unix ${BUILD_DIR}/bin/cluster_guc.conf > /dev/null 2>&1
get_kernel_commitid
get_version_mode
}
#######################################################################

View File

@ -1,6 +1,7 @@
[server]
./bin/dsscmd
./bin/dssserver
./bin/dsstbox
./bin/perctrl
./bin/dms_contrl.sh
./bin/dss_clear.sh
@ -47,6 +48,7 @@
./bin/gs_plan_simulator.sh
./bin/pg_xlogdump
./bin/pagehack
./bin/pg_archivecleanup
./bin/gs_assessment
./bin/gs_retrieve
./etc/kerberos/kadm5.acl
@ -75,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
@ -84,8 +86,12 @@
./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/whale.control
./share/postgresql/extension/whale--1.0.sql
./share/postgresql/extension/openGauss_expr_dolphin.ir

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,8 +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
@ -57,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
@ -700,6 +724,8 @@
./lib/libdcf.so
./lib/libzstd.so*
./lib/libcurl.so*
./lib/libaws-cpp-sdk-core.so
./lib/libaws-cpp-sdk-s3.so
./lib/libxgboost.so
./lib/libpagecompression.so*
./lib/postgresql/latin2_and_win1250.so
@ -738,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
@ -918,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
@ -48,6 +49,7 @@
./bin/gs_plan_simulator.sh
./bin/pg_xlogdump
./bin/pagehack
./bin/pg_archivecleanup
./bin/gs_assessment
./bin/gs_retrieve
./etc/kerberos/kadm5.acl
@ -76,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
@ -85,13 +87,21 @@
./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/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/timescaledb.control
./share/postgresql/extension/timescaledb--1.7.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
@ -112,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
@ -730,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
@ -803,18 +832,31 @@
./lib/postgresql/pg_plugin
./lib/postgresql/proc_srclib
./lib/postgresql/security_plugin.so
./lib/postgresql/timescaledb-1.7.4.so
./lib/postgresql/timescaledb.so
./lib/postgresql/timescaledb-tsl-1.7.4.so
./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
@ -832,9 +874,7 @@
./lib/libecpg.a
./lib/libecpg_compat.a
./lib/libpgtypes.a
./lib/libpgtypes.so
./lib/libpgtypes.so.3
./lib/libpgtypes.so.3.4
./lib/libpgtypes.so*
./lib/libgauss_cl_jni.so
./lib/libcgroup.so*
./lib/libcom_err_gauss.so*
@ -868,6 +908,8 @@
./lib/krb5/plugins/kdb/db2.so
./lib/libverto.so*
./lib/libcurl.so*
./lib/libaws-cpp-sdk-core.so
./lib/libaws-cpp-sdk-s3.so
./lib/libcrypto.so*
./lib/libssl.so*
./lib/libgcc_s.so.1

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)
@ -176,7 +177,7 @@ else()
endif()
# libraries need secure options during compling
set(LIB_SECURE_OPTIONS -fPIC -fno-common -fstack-protector)
set(LIB_SECURE_OPTIONS -fPIC -fno-common -fstack-protector-strong)
# libraries need link options during linking
set(LIB_LINK_OPTIONS -pthread -std=c++14 -Wl,-z,noexecstack -Wl,-z,relro,-z,now)
if(NOT "${ENABLE_UT}" STREQUAL "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"

View File

@ -61,6 +61,7 @@ set(LLVM_HOME ${DEPENDENCY_PATH}/llvm/${LIB_UNIFIED_SUPPORT})
set(LZ4_HOME ${DEPENDENCY_PATH}/lz4/${SUPPORT_LLT})
set(NANOMSG_HOME ${DEPENDENCY_PATH}/nng/${LIB_UNIFIED_SUPPORT})
set(NCURSES_HOME ${DEPENDENCY_PATH}/ncurses/${SUPPORT_LLT})
set(AWSSDK_HOME ${DEPENDENCY_PATH}/aws-sdk-cpp/${SUPPORT_LLT})
if(($ENV{WITH_TASSL}) STREQUAL "YES")
set(OPENSSL_HOME ${DEPENDENCY_PATH}/tassl/${LIB_UNIFIED_SUPPORT})
else()
@ -193,6 +194,12 @@ set(LIBCGROUP_LIB_PATH ${CGROUP_HOME}/lib)
set(LIBCURL_INCLUDE_PATH ${CURL_HOME}/include)
set(LIBCURL_LIB_PATH ${CURL_HOME}/lib)
#############################################################################
# awssdk component
#############################################################################
set(AWSSDK_INCLUDE_PATH ${AWSSDK_HOME}/include)
set(AWSSDK_LIB_PATH ${AWSSDK_HOME}/lib)
#############################################################################
# edit component
#############################################################################

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
@ -25,10 +26,33 @@ set(CMAKE_MODULE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/gc_fdw
${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)
@ -39,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()
@ -53,4 +82,12 @@ add_subdirectory(ndpplugin)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/spq_plugin)
add_subdirectory(spq_plugin)
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)

14
contrib/common_cipher/Makefile Executable file
View File

@ -0,0 +1,14 @@
# contrib/common_cipher/Makefile
SRCS = common_err.cpp common_utils.cpp common_algo.cpp common_internal_interfaces.cpp common_cipher.cpp
MODULE_big = common_cipher
OBJS = $(SRCS:.cpp=.o)
subdir = contrib/common_cipher
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
override CPPFLAGS := -fPIC -shared
override CFLAGS := -fPIC -shared

View File

@ -0,0 +1,18 @@
动态库使用说明:
a.硬件动态库中目前适配的三种硬件信息如下:
三未信安密钥管理系统,型号SYT1306
江南天安密钥管理系统,型号SJJ1988
光电安辰PCI-E密码卡,型号TOEC-GMPCIE01
b.硬件动态库使用需要配置的入参
指定所使用的硬件,必须项,取值范围["GDACCARD" "JNTAKMS" "SWXAKMS"]。
指定具体硬件提供so所在路径,必须项。
硬件配置文件所在路径:密钥管理系统需要配置此变量,指定kms的配置文件路径,可选项。
江南天安配置文件只需要传入路径,三未信安需要带配置文件名称。
配置示例:
MODULE_TYPE=GDACCARD,MODULE_LIB_PATH=/home/lib/libsdf.so
MODULE_TYPE=JNTAKMS,MODULE_LIB_PATH=/home/lib/libsdf.so,MODULE_CONFIG_FILE_PATH=/home/etc/
MODULE_TYPE=SWXAKMS,MODULE_LIB_PATH=/home/lib/libsdf.so,MODULE_CONFIG_FILE_PATH=/home/etc/xxx.ini
使用具体的接口详见:common_cipher.h

View File

@ -0,0 +1,300 @@
#include "common_algo.h"
#include "common_cipher.h"
#include "common_err.h"
#include "common_utils.h"
#define SUPPORTED 1
#define UNSUPPORTED 0
static void set_gdac_supported_feature(SupportedFeature *supported_feature)
{
memcpy(supported_feature->provider_name, MODULE_GDAC_CARD_STR, strlen(MODULE_GDAC_CARD_STR));
/*光电安辰提供了扩展的生成内部KEK接口,可以支持索引*/
supported_feature->key_type = KEY_TYPE_NAMEORIDX;
supported_feature->supported_symm[MODULE_AES_128_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_AES_256_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_SM4_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_HMAC_SHA256] = SUPPORTED;
supported_feature->supported_symm[MODULE_HMAC_SM3] = SUPPORTED;
supported_feature->supported_symm[MODULE_DETERMINISTIC_KEY] = SUPPORTED;
supported_feature->supported_digest[MODULE_SHA256] = SUPPORTED;
supported_feature->supported_digest[MODULE_SM3] = SUPPORTED;
}
static void set_swxa_supported_feature(SupportedFeature *supported_feature)
{
memcpy(supported_feature->provider_name, MODULE_SWXA_KMS_STR, strlen(MODULE_SWXA_KMS_STR));
/*三未信安提供了生成密钥密文的接口,可以支持密钥密文。*/
supported_feature->key_type = KEY_TYPE_CIPHERTEXT;
supported_feature->supported_symm[MODULE_AES_128_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_AES_256_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_SM4_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_AES_128_CTR] = SUPPORTED;
supported_feature->supported_symm[MODULE_AES_256_CTR] = SUPPORTED;
supported_feature->supported_symm[MODULE_SM4_CTR] = SUPPORTED;
supported_feature->supported_symm[MODULE_HMAC_SHA256] = SUPPORTED;
supported_feature->supported_symm[MODULE_HMAC_SM3] = SUPPORTED;
supported_feature->supported_symm[MODULE_DETERMINISTIC_KEY] = SUPPORTED;
supported_feature->supported_digest[MODULE_SHA256] = SUPPORTED;
supported_feature->supported_digest[MODULE_SM3] = SUPPORTED;
}
static void set_jnta_supported_feature(SupportedFeature *supported_feature)
{
memcpy(supported_feature->provider_name, MODULE_JNTA_KMS_STR, strlen(MODULE_JNTA_KMS_STR));
/*江南天安提供了生成密钥密文和导入密钥密文到指定索引的接口,可以支持密钥索引。*/
supported_feature->key_type = KEY_TYPE_NAMEORIDX;
supported_feature->supported_symm[MODULE_AES_128_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_AES_256_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_SM4_CBC] = SUPPORTED;
supported_feature->supported_symm[MODULE_HMAC_SHA256] = SUPPORTED;
supported_feature->supported_symm[MODULE_HMAC_SM3] = SUPPORTED;
supported_feature->supported_symm[MODULE_DETERMINISTIC_KEY] = SUPPORTED;
supported_feature->supported_digest[MODULE_SHA256] = SUPPORTED;
supported_feature->supported_digest[MODULE_SM3] = SUPPORTED;
}
int get_supported_feature(ModuleType type, SupportedFeature *supported_feature)
{
if (supported_feature == NULL) {
return CRYPTO_MOD_PARAM_INVALID_ERR;
}
memset(supported_feature->provider_name, 0x0, MAX_PROVIDER_NAME_LEN);
memset(supported_feature->supported_symm, UNSUPPORTED, sizeof(supported_feature->supported_symm));
memset(supported_feature->supported_digest, UNSUPPORTED, sizeof(supported_feature->supported_digest));
supported_feature->key_type = KEY_TYPE_INVALID;
switch (type) {
case MODULE_GDAC_CARD_TYPE:
set_gdac_supported_feature(supported_feature);
break;
case MODULE_JNTA_KMS_TYPE:
set_jnta_supported_feature(supported_feature);
break;
case MODULE_SWXA_KMS_TYPE:
set_swxa_supported_feature(supported_feature);
break;
default:
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
return CRYPT_MOD_OK;
}
static int get_gdac_symm_algo_type(ModuleSymmKeyAlgo symmalgotype, unsigned int* realtype)
{
switch (symmalgotype) {
case MODULE_AES_128_CBC:
*realtype = GDAC_AES128_CBC;
break;
case MODULE_AES_256_CBC:
*realtype = GDAC_AES256_CBC;
break;
case MODULE_SM4_CBC:
*realtype = GDAC_SM4_CBC;
break;
case MODULE_HMAC_SHA256:
*realtype = GDAC_HMAC_SHA256;
break;
case MODULE_HMAC_SM3:
*realtype = GDAC_HMAC_SM3;
break;
default:
return CRYPTO_MOD_UNSUPPORTED_SYMM_TYPE_ERR;
}
return CRYPT_MOD_OK;
}
static int get_swxa_symm_algo_type(ModuleSymmKeyAlgo symmalgotype, unsigned int* realtype)
{
switch (symmalgotype) {
case MODULE_AES_128_CBC:
case MODULE_AES_256_CBC:
*realtype = SWXA_AES_CBC;
break;
case MODULE_AES_128_CTR:
case MODULE_AES_256_CTR:
*realtype = SWXA_AES_CTR;
break;
case MODULE_SM4_CBC:
*realtype = SWXA_SMS4_CBC;
break;
case MODULE_SM4_CTR:
*realtype = SWXA_SMS4_CTR;
break;
case MODULE_HMAC_SHA256:
*realtype = SWXA_SHA256;
break;
case MODULE_HMAC_SM3:
*realtype = SWXA_SM3;
break;
default:
return CRYPTO_MOD_UNSUPPORTED_SYMM_TYPE_ERR;
}
return CRYPT_MOD_OK;
}
static int get_jnta_symm_algo_type(ModuleSymmKeyAlgo symmalgotype, unsigned int* realtype, unsigned int* realmode)
{
switch (symmalgotype) {
case MODULE_AES_128_CBC:
*realtype = TA_AES128;
*realmode = TA_CBC;
break;
case MODULE_AES_256_CBC:
*realtype = TA_AES256;
*realmode = TA_CBC;
break;
case MODULE_SM4_CBC:
*realtype = TA_SM4;
*realmode = TA_CBC;
break;
case MODULE_HMAC_SHA256:
*realtype = TA_HMAC_SHA256;
break;
case MODULE_HMAC_SM3:
*realtype = TA_HMAC_SM3;
break;
default:
return CRYPTO_MOD_UNSUPPORTED_SYMM_TYPE_ERR;
}
return CRYPT_MOD_OK;
}
int get_real_symm_algo_type(ModuleType moduletype, ModuleSymmKeyAlgo symmalgotype, unsigned int* realtype, unsigned int* realmode)
{
/*严格加解密,不属于硬件密码模块内部算法类型,在库中直接自行处理*/
if (symmalgotype == MODULE_DETERMINISTIC_KEY) {
*realtype = MODULE_DETERMINISTIC_KEY;
return CRYPT_MOD_OK;
}
switch (moduletype) {
case MODULE_GDAC_CARD_TYPE:
return get_gdac_symm_algo_type(symmalgotype, realtype);
case MODULE_JNTA_KMS_TYPE:
return get_jnta_symm_algo_type(symmalgotype, realtype, realmode);
case MODULE_SWXA_KMS_TYPE:
return get_swxa_symm_algo_type(symmalgotype, realtype);
default:
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
return CRYPT_MOD_OK;
}
void transform_jnta_algo_type(unsigned int type, unsigned int mode, unsigned int *standardtype)
{
switch (type) {
case TA_AES128:
case TA_AES256:
if (mode == TA_CBC) {
*standardtype = TA_AES_CBC;
}
break;
case TA_SM4:
if (mode == TA_CBC) {
*standardtype = TA_SM4_CBC;
}
break;
default:
break;
}
}
static int get_gdac_digest_algo_type(ModuleDigestAlgo type, unsigned int* realtype)
{
switch (type) {
case MODULE_SHA256:
*realtype = GDAC_SHA256;
break;
case MODULE_SM3:
*realtype = GDAC_SM3;
break;
default:
return CRYPTO_MOD_UNSUPPORTED_DIGEST_TYPE_ERR;
}
return CRYPT_MOD_OK;
}
static int get_swxa_digest_algo_type(ModuleDigestAlgo type, unsigned int* realtype)
{
switch (type) {
case MODULE_SHA256:
*realtype = SWXA_SHA256;
break;
case MODULE_SM3:
*realtype = SWXA_SM3;
break;
default:
return CRYPTO_MOD_UNSUPPORTED_DIGEST_TYPE_ERR;
}
return CRYPT_MOD_OK;
}
static int get_jnta_digest_algo_type(ModuleDigestAlgo type, unsigned int* realtype)
{
switch (type) {
case MODULE_SHA256:
*realtype = TA_SHA256;
break;
case MODULE_SM3:
*realtype = TA_SM3;
break;
default:
return CRYPTO_MOD_UNSUPPORTED_DIGEST_TYPE_ERR;
}
return CRYPT_MOD_OK;
}
int get_real_digest_algo_type(ModuleType moduletype, ModuleDigestAlgo type, unsigned int* realtype)
{
switch (moduletype) {
case MODULE_GDAC_CARD_TYPE:
return get_gdac_digest_algo_type(type, realtype);
case MODULE_JNTA_KMS_TYPE:
return get_jnta_digest_algo_type(type, realtype);
case MODULE_SWXA_KMS_TYPE:
return get_swxa_digest_algo_type(type, realtype);
default:
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
return CRYPT_MOD_OK;
}
int get_key_len_by_algo_type(ModuleSymmKeyAlgo type)
{
switch (type) {
case MODULE_AES_128_CBC:
case MODULE_AES_128_CTR:
case MODULE_SM4_CBC:
case MODULE_SM4_CTR:
return INTERNAL_KEY_128_BITS;
case MODULE_AES_256_CBC:
case MODULE_AES_256_CTR:
return INTERNAL_KEY_256_BITS;
default:
return INTERNAL_KEY_128_BITS;
}
}

View File

@ -0,0 +1,124 @@
#ifndef COMMON_ALGO_H
#define COMMON_ALGO_H
#include "common_cipher.h"
#include "common_utils.h"
#ifdef __cplusplus
extern "C" {
#endif
/*密钥索引最大值1024,最小值1*/
#define INTERNAL_MIN_INDEX_NUM 1
#define INTERNAL_MAX_INDEX_NUM 1024
/*光电安辰相关宏定义*/
/*光电安辰卡内密钥类型*/
#define GDAC_KEK_TYPE 9
/*光电安辰卡内密钥状态*/
#define GDAC_KEY_EXIST 0x100000
#define GDAC_KEY_NOT_EXIST 0
/*对称算法模式*/
#define GDAC_MODE_CBC 0x00000002
/*对称算法类型*/
#define GDAC_SM4 0x00000400
#define GDAC_AES128 0x00004000
#define GDAC_AES256 0x00008000
/*对称算法及模式*/
#define GDAC_SM4_CBC (GDAC_SM4|GDAC_MODE_CBC)
#define GDAC_AES128_CBC (GDAC_AES128|GDAC_MODE_CBC)
#define GDAC_AES256_CBC (GDAC_AES256|GDAC_MODE_CBC)
/*摘要算法*/
#define GDAC_SM3 0x00000001
#define GDAC_SHA256 0x00000004
/*HMAC算法*/
#define GDAC_HMAC_SM3 0x00100001
#define GDAC_HMAC_SHA256 0x00100004
/*三未信安相关宏定义*/
/*对称算法及模式*/
#define SWXA_SMS4_CBC 0x00000402
#define SWXA_SMS4_CTR 0x00000420
#define SWXA_AES_CBC 0x00002002
#define SWXA_AES_CTR 0x00002020
/*摘要算法,三未的hmac指定算法和摘要算法相同即可*/
#define SWXA_SM3 0x00000001
#define SWXA_SHA256 0x00000004
/*江南天安相关*/
typedef enum {
TA_HMAC_SHA256 = 6,
TA_HMAC_SM3 = 20,
}TA_HMAC_ALG;
typedef enum {
TA_AES128 = 3,
TA_AES256 = 5,
TA_SM4 = 7,
}TA_SYMM_ALG;
typedef enum {
TA_CBC = 1,
}TA_SYMM_MODE;
typedef enum {
TA_SM3 = 1,
TA_SHA256 = 4,
}TA_HASH_ALG;
#define TA_SM4_CBC 0X00000402
#define TA_AES_CBC 0x80000202
/*内部通用宏定义*/
#define INTERNAL_DO_ENC 1
#define INTERNAL_DO_DEC 0
#define INTERNAL_MAX_KEY_LEN 32
#define INTERNAL_BLOCK_LEN 16
#define INTERNAL_IV_LEN 16
#define INTERNAL_HMAC_LEN 32
#define INTERNAL_MSG_BLOCK_LEN 8192
#define INTERNAL_KEY_128_BITS 128
#define INTERNAL_KEY_256_BITS 256
typedef struct {
void *session; /*和硬件建立的会话*/
unsigned int algotype; /*算法类型*/
unsigned int algomode; /*算法模式,江南天安使用;光电安辰和三未信安algotype已包含模式*/
int enc; /*0表示解密,1表示加密*/
unsigned int keysize; /*key的长度*/
unsigned char key[INTERNAL_MAX_KEY_LEN]; /*存储密钥id/密钥密文值/密钥明文值,AES256密钥长度32*/
}InternalKeyCtx;
extern int get_supported_feature(ModuleType type, SupportedFeature *supported_feature);
extern int get_real_symm_algo_type(ModuleType moduletype, ModuleSymmKeyAlgo symmalgotype, unsigned int* realtype, unsigned int* realmode);
extern int get_real_digest_algo_type(ModuleType moduletype, ModuleDigestAlgo type, unsigned int* realtype);
extern int get_key_len_by_algo_type(ModuleSymmKeyAlgo type);
extern void transform_jnta_algo_type(unsigned int type, unsigned int mode, unsigned int *standardtype);
#ifdef __cplusplus
}
#endif
#endif /* COMMON_ALGO_H */

View File

@ -0,0 +1,538 @@
#include "common_cipher.h"
#include "common_err.h"
#include "common_utils.h"
#include "common_internal_interfaces.h"
/** 初始化密码模块
*
* @param[in]
* load_info 密码模块相关信息(硬件设备口令,硬件设备、硬件库路径等),通过kv方式传入
*
* @param[out]
* supported_feature 返回当前密码模块支持的加密方式,参考上述结构体
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
* 示例:
* 用户设置GUC参数crypto_module_info = 'enable_crypto_module=on,module_third_msg=aaa'
* 传入接口时load_info = 'aaa'
*/
int crypto_module_init(char *load_info, SupportedFeature *supported_feature)
{
int ret = CRYPT_MOD_OK;
ModuleParams moduleparams;
memset(&moduleparams, 0x0, sizeof(ModuleParams));
/* 1.解析load_info获取加载密码模块的参数*/
ret = parse_module_params(load_info, &moduleparams);
if (ret != CRYPT_MOD_OK) {
goto err;
}
/* 2.根据密码模块类型填充supported_feature*/
ret = get_supported_feature(moduleparams.moduletype, supported_feature);
if (ret != CRYPT_MOD_OK) {
goto err;
}
/* 3.dlopen打开密码模块驱动库,并加载接口函数*/
ret = load_module_driver(moduleparams);
if (ret != CRYPT_MOD_OK) {
goto err;
}
/* 4.打开设备*/
ret = internal_open_device(moduleparams.cfgfilepath);
if (ret != CRYPT_MOD_OK) {
goto err;
}
return CRYPT_MOD_OK;
err:
/*可能已经打开/加载,尝试释放*/
(void)internal_close_device();
(void)unload_module_driver();
set_thread_errno(ret);
return ret;
}
/** 会话中连接密码模块
*
* @param[in]
* key_info 密码相关信息(用户口令等信息),通过kv方式传入
*
* @param[out]
* sess 会话信息
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
* 示例:
* 用户设置GUC参数tde_key_info = 'keyType=third_kms, keyThirdMsg =bbb'
* 传入接口时key_info = 'bbb'
*/
int crypto_module_sess_init(char *key_info, void **sess)
{
int ret = CRYPT_MOD_OK;
ret = internal_open_session(sess);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
}
return ret;
}
/** 会话中断开连接密码模块
*
* @param[in]
* sess 会话信息
*
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_module_sess_exit(void *sess)
{
int ret = CRYPT_MOD_OK;
ret = internal_close_session(sess);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
}
}
/** 创建密钥
*
* @param[in]
* sess 会话信息
* algo 密钥使用场景的算法
*
* @param[out]
* key_id 返回生成密钥/密钥ID/密钥密文
* key_id_size 返回生成内容长度
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_create_symm_key(void *sess, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t *key_id_size)
{
int ret = CRYPT_MOD_OK;
ret = internal_generate_symm_key(sess, algo, key_id, (unsigned int*)key_id_size);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
}
return ret;
}
/** 密钥上下文初始化,后续进行加解密可直接使用上下文
*
* @param[in]
* sess 会话信息
* algo 加密算法
* enc 加密1、解密0
* key_id 密码信息
* key_id_size 密码信息长度
* @param[out]
* ctx 返回使用密钥信息
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_ctx_init(void *sess, void **ctx, ModuleSymmKeyAlgo algo, int enc, unsigned char *key_id, size_t key_id_size)
{
InternalKeyCtx *keyctx = NULL;
int ret = CRYPT_MOD_OK;
if (sess == NULL) {
return CRYPTO_MOD_NOT_OPENSESSION_ERR;
}
if (enc != INTERNAL_DO_DEC && enc != INTERNAL_DO_ENC) {
return CRYPTO_MOD_INVALID_CRYPTO_TYPE_ERR;
}
if (key_id == NULL || key_id[0] == '\0' || key_id_size <= 0 || key_id_size > INTERNAL_MAX_KEY_LEN) {
return CRYPTO_MOD_INVALID_KEY_ERR;
}
keyctx = (InternalKeyCtx*)malloc(sizeof(InternalKeyCtx));
keyctx->session = sess;
ret = get_real_symm_algo_type(get_current_module_type(), algo, &(keyctx->algotype), &(keyctx->algomode));
if (ret != CRYPT_MOD_OK) {
free(keyctx);
return ret;
}
keyctx->enc = enc;
memset(keyctx->key, 0x0, sizeof(keyctx->key));
memcpy(keyctx->key, key_id, key_id_size);
keyctx->keysize = key_id_size;
*ctx = keyctx;
return CRYPT_MOD_OK;
}
/** 获取数据加解密后的数据长度
*
* @param[in]
* ctx 加解密上下文信息
* enc 加密1、解密0
* data_size 返回加解密结果长度
* @return 返回数据长度
*
*/
int crypto_result_size(void *ctx, int enc, size_t data_size)
{
if (ctx == NULL) {
return CRYPTO_MOD_INVALID_KEY_CTX_ERR;
}
if (enc == INTERNAL_DO_DEC) {
return data_size;
} else if (enc == INTERNAL_DO_ENC) {
return (data_size + INTERNAL_BLOCK_LEN);
} else
return CRYPTO_MOD_INVALID_CRYPTO_TYPE_ERR;
}
/** 密钥上下文清理
*
* @param[in]
* ctx 加解密上下文信息
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_ctx_clean(void *ctx)
{
if (ctx) {
free(ctx);
ctx = NULL;
}
}
/** 执行加解密
*
* @param[in]
* ctx 加解密上下文信息
* enc 加密1、解密0
* data 原数据信息
* data_size 原数据长度
* iv iv信息
* iv_size iv信息长度
* tag GCM模式的校验值
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_encrypt_decrypt(void *ctx, int enc, unsigned char *data, size_t data_size, unsigned char *iv, size_t iv_size, unsigned char *result, size_t *result_size, unsigned char *tag)
{
int ret = CRYPT_MOD_OK;
if ((enc == INTERNAL_DO_ENC && *result_size < (data_size + INTERNAL_BLOCK_LEN))
|| (enc == INTERNAL_DO_DEC && *result_size < data_size)) {
set_thread_errno(CRYPTO_MOD_NOT_ENOUGH_SPACE_ERR);
return CRYPTO_MOD_NOT_ENOUGH_SPACE_ERR;
}
if (enc == INTERNAL_DO_ENC) {
ret = internal_symm_encrypt(ctx, data, data_size, iv, iv_size, result, (unsigned int*)result_size, tag);
} else if (enc == INTERNAL_DO_DEC) {
ret = internal_symm_decrypt(ctx, data, data_size, iv, iv_size, result, (unsigned int*)result_size, tag);
}
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
}
return ret;
}
/** 计算摘要
*
* @param[in]
* sess 会话信息
* algo 摘要算法
* data 原数据信息
* data_size 原数据长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_digest(void *sess, ModuleDigestAlgo algo, unsigned char * data, size_t data_size,unsigned char *result, size_t *result_size)
{
int ret = CRYPT_MOD_OK;
ret = internal_digest(sess, algo, data, data_size, result, (unsigned int*)result_size);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
}
return ret;
}
/** hmac初始化
*
* @param[in]
* sess 会话信息
* algo 摘要算法
* key_id 密码信息
* key_id_size 密码信息长度
* @param[out]
* ctx 返回密钥上下文
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_hmac_init(void *sess, void **ctx, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t key_id_size)
{
InternalKeyCtx *keyctx = NULL;
int ret = CRYPT_MOD_OK;
if (sess == NULL) {
return CRYPTO_MOD_NOT_OPENSESSION_ERR;
}
if (key_id == NULL || key_id[0] == '\0' || key_id_size <= 0 || key_id_size > INTERNAL_MAX_KEY_LEN) {
return CRYPTO_MOD_INVALID_KEY_ERR;
}
keyctx = (InternalKeyCtx*)malloc(sizeof(InternalKeyCtx));
keyctx->session = sess;
ret = get_real_symm_algo_type(get_current_module_type(), algo, &(keyctx->algotype), &(keyctx->algomode));
if (ret != CRYPT_MOD_OK) {
free(keyctx);
return ret;
}
memcpy(keyctx->key, key_id, key_id_size);
keyctx->keysize = key_id_size;
*ctx = keyctx;
return ret;
}
/** hmac清理
*
* @param[in]
* ctx 密钥上下文信息
*
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_hmac_clean(void *ctx)
{
if (ctx) {
free(ctx);
ctx = NULL;
}
}
/** 执行hmac计算
*
* @param[in]
* ctx 密钥上下文信息
* data 原数据信息
* data_size 原数据长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_hmac(void *ctx, unsigned char * data, size_t data_size, unsigned char *result, size_t *result_size)
{
int ret = CRYPT_MOD_OK;
ret = internal_hmac(ctx, data, data_size, result, result_size);
if (ret != CRYPT_MOD_OK)
set_thread_errno(ret);
return ret;
}
/** 生成随机数
*
* @param[in]
* sess 会话信息
* size 申请的随机信息长度
*
* @param[out]
* buffer 返回随机信息
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_gen_random(void *sess, char *buffer, size_t size)
{
int ret = CRYPT_MOD_OK;
ret = internal_generate_random(sess, buffer, size);
if (ret != CRYPT_MOD_OK)
set_thread_errno(ret);
return ret;
}
/** 执行确定性加解密
*
* @param[in]
* sess 会话信息
* enc 加密1、解密0
* data 原数据信息
* data_size 原数据长度
* key_id 密钥信息
* key_id_size 密钥信息长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_deterministic_enc_dec(void *sess, int enc, unsigned char *data, unsigned char *key_id, size_t key_id_size, size_t data_size, unsigned char *result, size_t *result_size)
{
int ret = CRYPT_MOD_OK;
void *tmpkeyctx = NULL;
unsigned char tmpiv[INTERNAL_IV_LEN + 1] = {0};
ret = crypto_ctx_init(sess, &tmpkeyctx, MODULE_SM4_CBC, enc, key_id, key_id_size);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
return ret;
}
/*加密:对明文计算hmac作为iv,并将hmac放到密文串头;
*解密:从密文头获取iv和hmac,并对解密出的明文计算hmac进行校验*/
if (enc == INTERNAL_DO_ENC) {
void *tmphmacctx = NULL;
unsigned char tmphmac[INTERNAL_HMAC_LEN] = {0};
long unsigned int hmaclen = 0;
/*计算iv */
ret = crypto_hmac_init(sess, &tmphmacctx, MODULE_HMAC_SM3, key_id, key_id_size);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
crypto_ctx_clean(tmpkeyctx);
return ret;
}
ret = crypto_hmac(tmphmacctx, data, data_size, tmphmac, &hmaclen);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
crypto_ctx_clean(tmphmacctx);
crypto_ctx_clean(tmpkeyctx);
return ret;
}
memcpy(tmpiv, tmphmac, INTERNAL_IV_LEN);
/*把hmac放到密文头 */
memcpy(result, tmphmac, INTERNAL_HMAC_LEN);
crypto_hmac_clean(tmphmacctx);
ret = internal_symm_encrypt(tmpkeyctx, data, data_size, tmpiv, INTERNAL_IV_LEN, result + INTERNAL_HMAC_LEN, (unsigned int*)result_size, NULL);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
}
crypto_ctx_clean(tmpkeyctx);
*result_size += INTERNAL_HMAC_LEN;
return ret;
} else if (enc == INTERNAL_DO_DEC){
void *tmphmacctx = NULL;
unsigned char tmphmac[INTERNAL_HMAC_LEN] = {0};
long unsigned int hmaclen = 0;
unsigned char verifyhmac[INTERNAL_HMAC_LEN] = {0};
/*获取iv */
memcpy(tmpiv, data, INTERNAL_IV_LEN);
/*获取hmac*/
memcpy(verifyhmac, data, INTERNAL_HMAC_LEN);
ret = internal_symm_decrypt(tmpkeyctx, data + INTERNAL_HMAC_LEN, data_size - INTERNAL_HMAC_LEN, tmpiv, INTERNAL_IV_LEN, result, (unsigned int*)result_size, NULL);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
crypto_ctx_clean(tmpkeyctx);
return ret;
}
crypto_ctx_clean(tmpkeyctx);
/*计算明文hmac */
ret = crypto_hmac_init(sess, &tmphmacctx, MODULE_HMAC_SM3, key_id, key_id_size);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
return ret;
}
ret = crypto_hmac(tmphmacctx, result, *result_size, tmphmac, &hmaclen);
if (ret != CRYPT_MOD_OK) {
set_thread_errno(ret);
crypto_ctx_clean(tmphmacctx);
return ret;
}
crypto_hmac_clean(tmphmacctx);
/*校验明文hmac值 */
if (strncmp((char*)tmphmac, (char*)verifyhmac, INTERNAL_HMAC_LEN)) {
set_thread_errno(CRYPTO_MOD_DETERMINISTIC_DEC_VERIFY_ERR);
return CRYPTO_MOD_DETERMINISTIC_DEC_VERIFY_ERR;
}
return ret;
}
return ret;
}
/** 获取报错信息
*
* @param[in]
* sess 会话信息
* @param[out]
* errmsg 返回结果信息,最长256字节
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_get_errmsg(void *sess, char *errmsg)
{
strcpy(errmsg, common_get_errmsg());
return CRYPT_MOD_OK;
}

View File

@ -0,0 +1,275 @@
#ifndef COMMON_CIPHER_H
#define COMMON_CIPHER_H
#include <pthread.h>
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_PROVIDER_NAME_LEN 128
#define MAX_ERRMSG_LEN 256
typedef enum {
MODULE_AES_128_CBC = 0,
MODULE_AES_128_CTR,
MODULE_AES_128_GCM,
MODULE_AES_256_CBC,
MODULE_AES_256_CTR,
MODULE_AES_256_GCM,
MODULE_SM4_CBC,
MODULE_SM4_CTR,
MODULE_HMAC_SHA256,
MODULE_HMAC_SM3,
MODULE_DETERMINISTIC_KEY,
MODULE_ALGO_MAX = 1024
} ModuleSymmKeyAlgo;
typedef enum {
MODULE_SHA256 = 0,
MODULE_SM3,
MODULE_DIGEST_MAX = 1024
} ModuleDigestAlgo;
typedef enum {
KEY_TYPE_INVALID,
KEY_TYPE_PLAINTEXT,
KEY_TYPE_CIPHERTEXT,
KEY_TYPE_NAMEORIDX,
KEY_TYPE_MAX
} KeyType;
typedef struct {
char provider_name[MAX_PROVIDER_NAME_LEN];
KeyType key_type;
int supported_symm[MODULE_ALGO_MAX]; // 不支持算法填入0或者支持算法填入1
int supported_digest[MODULE_DIGEST_MAX]; // 不支持算法填入0或者支持算法填入1
} SupportedFeature;
/** 初始化密码模块
*
* @param[in]
* load_info 密码模块相关信息(硬件设备口令,硬件设备、硬件库路径等),通过kv方式传入
*
* @param[out]
* supported_feature 返回当前密码模块支持的加密方式,参考上述结构体
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
* 示例:
* 用户设置GUC参数crypto_module_info = 'enable_crypto_module=on,module_third_msg=aaa'
* 传入接口时load_info = 'aaa'
*/
int crypto_module_init(char *load_info, SupportedFeature *supported_feature);
/** 会话中连接密码模块
*
* @param[in]
* key_info 密码相关信息(用户口令等信息),通过kv方式传入
*
* @param[out]
* sess 会话信息
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
* 示例:
* 用户设置GUC参数tde_key_info = 'keyType=third_kms, keyThirdMsg =bbb'
* 传入接口时key_info = 'bbb'
*/
int crypto_module_sess_init(char *key_info, void **sess);
/** 会话中断开连接密码模块
*
* @param[in]
* sess 会话信息
*
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_module_sess_exit(void *sess);
/** 创建密钥
*
* @param[in]
* sess 会话信息
* algo 密钥使用场景的算法
*
* @param[out]
* key_id 返回生成密钥/密钥ID/密钥密文
* key_id_size 返回生成内容长度
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_create_symm_key(void *sess, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t *key_id_size);
/** 密钥上下文初始化,后续进行加解密可直接使用上下文
*
* @param[in]
* sess 会话信息
* algo 加密算法
* enc 加密1、解密0
* key_id 密码信息
* key_id_size 密码信息长度
* @param[out]
* ctx 返回使用密钥信息
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_ctx_init(void *sess, void **ctx, ModuleSymmKeyAlgo algo, int enc, unsigned char *key_id, size_t key_id_size);
/** 获取数据加解密后的数据长度
*
* @param[in]
* ctx 加解密上下文信息
* enc 加密1、解密0
* data_size 返回加解密结果长度
* @return 返回数据长度
*
*/
int crypto_result_size(void *ctx, int enc, size_t data_size);
/** 密钥上下文清理
*
* @param[in]
* ctx 加解密上下文信息
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_ctx_clean(void *ctx);
/** 执行加解密
*
* @param[in]
* ctx 加解密上下文信息
* enc 加密1、解密0
* data 原数据信息
* data_size 原数据长度
* iv iv信息
* iv_size iv信息长度
* tag GCM模式的校验值
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_encrypt_decrypt(void *ctx, int enc, unsigned char *data, size_t data_size, unsigned char *iv, size_t iv_size, unsigned char *result, size_t *result_size, unsigned char *tag);
/** 计算摘要
*
* @param[in]
* sess 会话信息
* algo 摘要算法
* data 原数据信息
* data_size 原数据长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_digest(void *sess, ModuleDigestAlgo algo, unsigned char * data, size_t data_size,unsigned char *result, size_t *result_size);
/** hmac初始化
*
* @param[in]
* sess 会话信息
* algo 摘要算法
* key_id 密码信息
* key_id_size 密码信息长度
* @param[out]
* ctx 返回密钥上下文
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_hmac_init(void *sess, void **ctx, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t key_id_size);
/** hmac清理
*
* @param[in]
* ctx 密钥上下文信息
*
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_hmac_clean(void *ctx);
/** 执行hmac计算
*
* @param[in]
* ctx 密钥上下文信息
* data 原数据信息
* data_size 原数据长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_hmac(void *ctx, unsigned char * data, size_t data_size, unsigned char *result, size_t *result_size);
/** 生成随机数
*
* @param[in]
* sess 会话信息
* size 申请的随机信息长度
*
* @param[out]
* buffer 返回随机信息
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_gen_random(void *sess, char *buffer, size_t size);
/** 执行确定性加解密
*
* @param[in]
* sess 会话信息
* enc 加密1、解密0
* data 原数据信息
* data_size 原数据长度
* key_id 密钥信息
* key_id_size 密钥信息长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_deterministic_enc_dec(void *sess, int enc, unsigned char *data, unsigned char *key_id, size_t key_id_size, size_t data_size, unsigned char *result, size_t *result_size);
/** 获取报错信息
*
* @param[in]
* sess 会话信息
* @param[out]
* errmsg 返回结果信息,最长256字节
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_get_errmsg(void *sess, char *errmsg);
#ifdef __cplusplus
}
#endif
#endif /*COMMON_CIPHER_H*/

View File

@ -0,0 +1,126 @@
#include "common_err.h"
#define MAX_ERRMSG_LEN 256
#define lengthof(array) (sizeof(array) / sizeof(array[0]))
static thread_local int internalthreaderrno = 0;
static void reset_thread_errno();
typedef struct {
int errno;
char errmsg[MAX_ERRMSG_LEN];
}CommonErrInfo;
/*HSM:hardware security module,硬件安全模块。*/
static const CommonErrInfo internal_err_info[] = {
{INTERNAL_UNKNOWNERR, "HSM unknown error"},
{INTERNAL_NOTSUPPORT, "HSM not support"},
{INTERNAL_COMMFAIL, "HSM communication error"},
{INTERNAL_HARDFAIL, "HSM hard error"},
{INTERNAL_OPENDEVICE, "HSM open device error"},
{INTERNAL_OPENSESSION, "HSM open session error"},
{INTERNAL_PARDENY, "HSM permission error"},
{INTERNAL_KEYNOTEXIST, "HSM key not exist"},
{INTERNAL_ALGNOTSUPPORT, "HSM not support algorithm"},
{INTERNAL_ALGMODNOTSUPPORT, "HSM not support algorithm mode"},
{INTERNAL_PKOPERR, "HSM public key operation error"},
{INTERNAL_SKOPERR, "HSM private key operation error"},
{INTERNAL_SIGNERR, "HSM sign error"},
{INTERNAL_VERIFYERR, "HSM verify error"},
{INTERNAL_SYMOPERR, "HSM symmetry operation error"},
{INTERNAL_STEPERR, "HSM step error"},
{INTERNAL_FILESIZEERR, "HSM file size or data len error"},
{INTERNAL_FILENOEXIST, "HSM file not exist"},
{INTERNAL_FILEOFSERR, "HSM file offset operation error"},
{INTERNAL_KEYTYPEERR, "HSM key type error"},
{INTERNAL_KEYERR, "HSM key error"},
{INTERNAL_ENCDATAERR, "HSM encrypt data error"},
{INTERNAL_RANDERR, "HSM random error"},
{INTERNAL_PRKRERR, "HSM private access right error"},
{INTERNAL_MACERR, "HSM MAC error"},
{INTERNAL_FILEEXISTS, "HSM file exists"},
{INTERNAL_FILEWERR, "HSM write file error"},
{INTERNAL_NOBUFFER, "HSM not enough storage"},
{INTERNAL_INARGERR, "HSM input param error"},
{INTERNAL_OUTARGERR, "HSM output param error"},
{INTERNAL_UKEYERR, "HSM ukey error"},
{INTERNAL_GENKEYERR, "HSM generate key error"},
{INTERNAL_STATEERR, "HSM status error"},
{INTERNAL_RETRYERR, "HSM retry exceeded"},
{INTERNAL_DEVICE_BUSY, "HSM is busy"}
};
static int internal_err_number = lengthof(internal_err_info);
static const CommonErrInfo common_err_info[] = {
{CRYPTO_MOD_TYPE_REPEATED_ERR, "module type set repeated"},
{CRYPTO_MOD_TYPE_INVALID_ERR, "invalid module type"},
{CRYPTO_MOD_LIBPATH_REPEATED_ERR, "module lib path set repeated"},
{CRYPTO_MOD_LIBPATH_INVALID_ERR, "invalid module lib path"},
{CRYPTO_MOD_CFG_PATH_REPEATED_ERR, "module config file set repeated"},
{CRYPTO_MOD_CFG_PATH_INVALID_ERR, "invalid module config file"},
{CRYPTO_MOD_PARAM_TOO_MANY_ERR, "param is too many"},
{CRYPTO_MOD_PARAM_INVALID_ERR, "invalid param"},
{CRYPTO_MOD_UNSUPPORTED_SYMM_TYPE_ERR, "unsupported symm algo type"},
{CRYPTO_MOD_UNSUPPORTED_DIGEST_TYPE_ERR, "unsupported digest algo type"},
{CRYPTO_MOD_DLOPEN_ERR, "dlopen error"},
{CRYPTO_MOD_DLSYM_ERR, "dlsym error"},
{CRYPTO_MOD_UNLOAD_ERR, "unload error"},
{CRYPTO_MOD_NOT_LOADED_ERR, "module not loaded"},
{CRYPTO_MOD_NOT_OPENDEVICE_ERR, "device not opened"},
{CRYPTO_MOD_NOT_OPENSESSION_ERR, "session not opened"},
{CRYPTO_MOD_INVALID_KEY_ERR, "invalid key"},
{CRYPTO_MOD_INVALID_CRYPTO_TYPE_ERR, "invalid crypto type"},
{CRYPTO_MOD_INVALID_KEY_CTX_ERR, "invalid key ctx"},
{CRYPTO_MOD_UNPADDING_ERR, "unpadding err"},
{CRYPTO_MOD_NOT_ENOUGH_SPACE_ERR, "not enough space"},
{CRYPTO_MOD_DETERMINISTIC_DEC_VERIFY_ERR, "deterministic dec verify error"},
{CRYPTO_MOD_UNKNOWN_PARAM_ERR, "unknown module param"}
};
static int common_err_number = lengthof(common_err_info);
static const char* unknown_err = "unknown err";
const char* common_get_errmsg()
{
int i = 0;
if (internalthreaderrno & INTERNAL_BASE_ERR) {
for (i = 0; i < internal_err_number; i++) {
if (internalthreaderrno == internal_err_info[i].errno) {
reset_thread_errno();
return internal_err_info[i].errmsg;
}
}
} else if (internalthreaderrno & CRYPTO_MOD_BASE_ERR) {
for (i = 0; i < common_err_number; i++) {
if (internalthreaderrno == common_err_info[i].errno) {
reset_thread_errno();
return common_err_info[i].errmsg;
}
}
} else {
reset_thread_errno();
return unknown_err;
}
if (i != internal_err_number && i != common_err_number) {
reset_thread_errno();
return unknown_err;
}
return unknown_err;
}
void set_thread_errno(int errno)
{
internalthreaderrno = errno;
}
static void reset_thread_errno()
{
internalthreaderrno = 0;
}

View File

@ -0,0 +1,89 @@
#ifndef COMMON_ERR_H
#define COMMON_ERR_H
#ifdef __cplusplus
extern "C" {
#endif
/*硬件内部错误码*/
#define INTERNAL_OK 0
#define INTERNAL_BASE_ERR 0x01000000
#define INTERNAL_UNKNOWNERR (INTERNAL_BASE_ERR + 0x00000001) /* 未知错误 */
#define INTERNAL_NOTSUPPORT (INTERNAL_BASE_ERR + 0x00000002) /* 不支持 */
#define INTERNAL_COMMFAIL (INTERNAL_BASE_ERR + 0x00000003) /* 通信错误 */
#define INTERNAL_HARDFAIL (INTERNAL_BASE_ERR + 0x00000004) /* 硬件错误 */
#define INTERNAL_OPENDEVICE (INTERNAL_BASE_ERR + 0x00000005) /* 打开设备错误 */
#define INTERNAL_OPENSESSION (INTERNAL_BASE_ERR + 0x00000006) /* 打开会话句柄错误 */
#define INTERNAL_PARDENY (INTERNAL_BASE_ERR + 0x00000007) /* 权限不满足 */
#define INTERNAL_KEYNOTEXIST (INTERNAL_BASE_ERR + 0x00000008) /* 密钥不存在 */
#define INTERNAL_ALGNOTSUPPORT (INTERNAL_BASE_ERR + 0x00000009) /* 不支持的算法 */
#define INTERNAL_ALGMODNOTSUPPORT (INTERNAL_BASE_ERR + 0x0000000A) /* 不支持的算法模式 */
#define INTERNAL_PKOPERR (INTERNAL_BASE_ERR + 0x0000000B) /* 公钥运算错误 */
#define INTERNAL_SKOPERR (INTERNAL_BASE_ERR + 0x0000000C) /* 私钥运算错误 */
#define INTERNAL_SIGNERR (INTERNAL_BASE_ERR + 0x0000000D) /* 签名错误 */
#define INTERNAL_VERIFYERR (INTERNAL_BASE_ERR + 0x0000000E) /* 验证错误 */
#define INTERNAL_SYMOPERR (INTERNAL_BASE_ERR + 0x0000000F) /* 对称运算错误 */
#define INTERNAL_STEPERR (INTERNAL_BASE_ERR + 0x00000010) /* 步骤错误 */
#define INTERNAL_FILESIZEERR (INTERNAL_BASE_ERR + 0x00000011) /* 文件大小错误或输入数据长度非法 */
#define INTERNAL_FILENOEXIST (INTERNAL_BASE_ERR + 0x00000012) /* 文件不存在 */
#define INTERNAL_FILEOFSERR (INTERNAL_BASE_ERR + 0x00000013) /* 文件操作偏移量错误 */
#define INTERNAL_KEYTYPEERR (INTERNAL_BASE_ERR + 0x00000014) /* 密钥类型错误 */
#define INTERNAL_KEYERR (INTERNAL_BASE_ERR + 0x00000015) /* 密钥错误 */
#define INTERNAL_ENCDATAERR (INTERNAL_BASE_ERR + 0x00000016) /* 加密数据错误 */
#define INTERNAL_RANDERR (INTERNAL_BASE_ERR + 0x00000017) /* 随机数产生失败 */
#define INTERNAL_PRKRERR (INTERNAL_BASE_ERR + 0x00000018) /* 私钥使用权限获取失败 */
#define INTERNAL_MACERR (INTERNAL_BASE_ERR + 0x00000019) /* MAC 运算失败 */
#define INTERNAL_FILEEXISTS (INTERNAL_BASE_ERR + 0x0000001A) /* 指定文件已存在 */
#define INTERNAL_FILEWERR (INTERNAL_BASE_ERR + 0x0000001B) /* 文件写入失败 */
#define INTERNAL_NOBUFFER (INTERNAL_BASE_ERR + 0x0000001C) /* 存储空间不足 */
#define INTERNAL_INARGERR (INTERNAL_BASE_ERR + 0x0000001D) /* 输入参数错误 */
#define INTERNAL_OUTARGERR (INTERNAL_BASE_ERR + 0x0000001E) /* 输出参数错误 */
#define INTERNAL_UKEYERR (INTERNAL_BASE_ERR + 0x0000001F) /* Ukey错误 */
#define INTERNAL_GENKEYERR (INTERNAL_BASE_ERR + 0x00000020) /* 密钥生成错误 */
#define INTERNAL_STATEERR (INTERNAL_BASE_ERR + 0x00000021) /* 状态错误 */
#define INTERNAL_RETRYERR (INTERNAL_BASE_ERR + 0x00000022) /* 重试超过次数 */
#define INTERNAL_DEVICE_BUSY (INTERNAL_BASE_ERR + 0x00000023) /* 设备忙 */
/*库中自定义错误码*/
/*特别注意,硬件密码模块的返回值是0表示成功,非0表示失败(错误码),和库对外返回的不一样*/
#define CRYPT_MOD_OK 1
#define CRYPT_MOD_ERR 0
#define CRYPTO_MOD_BASE_ERR 0x01000
#define CRYPTO_MOD_TYPE_REPEATED_ERR (CRYPTO_MOD_BASE_ERR + 0x00001)/*密码模块类型重复设置*/
#define CRYPTO_MOD_TYPE_INVALID_ERR (CRYPTO_MOD_BASE_ERR + 0x00002)/*无效的密码模块类型*/
#define CRYPTO_MOD_LIBPATH_REPEATED_ERR (CRYPTO_MOD_BASE_ERR + 0x00003)/*密码模块库路径重复设置*/
#define CRYPTO_MOD_LIBPATH_INVALID_ERR (CRYPTO_MOD_BASE_ERR + 0x00004)/*无效的密码模块库路径*/
#define CRYPTO_MOD_CFG_PATH_REPEATED_ERR (CRYPTO_MOD_BASE_ERR + 0x00005)/*密码模块配置文件重复设置*/
#define CRYPTO_MOD_CFG_PATH_INVALID_ERR (CRYPTO_MOD_BASE_ERR + 0x00006)/*无效的密码模块配置文件*/
#define CRYPTO_MOD_PARAM_TOO_MANY_ERR (CRYPTO_MOD_BASE_ERR + 0x00007)/*密码卡参数配置过多*/
#define CRYPTO_MOD_PARAM_INVALID_ERR (CRYPTO_MOD_BASE_ERR + 0x00008)/*无效的参数*/
#define CRYPTO_MOD_UNSUPPORTED_SYMM_TYPE_ERR (CRYPTO_MOD_BASE_ERR + 0x00009)/*不支持的对称算法类型*/
#define CRYPTO_MOD_UNSUPPORTED_DIGEST_TYPE_ERR (CRYPTO_MOD_BASE_ERR + 0x0000A)/*不支持的摘要算法类型*/
#define CRYPTO_MOD_DLOPEN_ERR (CRYPTO_MOD_BASE_ERR + 0x0000B)/*dlopen失败*/
#define CRYPTO_MOD_DLSYM_ERR (CRYPTO_MOD_BASE_ERR + 0x0000C)/*dlsym失败*/
#define CRYPTO_MOD_UNLOAD_ERR (CRYPTO_MOD_BASE_ERR + 0x0000D)/*dlclose失败*/
#define CRYPTO_MOD_NOT_LOADED_ERR (CRYPTO_MOD_BASE_ERR + 0x0000E)/*还未加载驱动库*/
#define CRYPTO_MOD_NOT_OPENDEVICE_ERR (CRYPTO_MOD_BASE_ERR + 0x0000F)/*还未打开设备*/
#define CRYPTO_MOD_NOT_OPENSESSION_ERR (CRYPTO_MOD_BASE_ERR + 0x00010)/*还未建立会话*/
#define CRYPTO_MOD_INVALID_KEY_ERR (CRYPTO_MOD_BASE_ERR + 0x00011)/*无效的密钥*/
#define CRYPTO_MOD_INVALID_CRYPTO_TYPE_ERR (CRYPTO_MOD_BASE_ERR + 0x00012)/*无效的加解密类型*/
#define CRYPTO_MOD_INVALID_KEY_CTX_ERR (CRYPTO_MOD_BASE_ERR + 0x00013)/*无效密钥上下文*/
#define CRYPTO_MOD_UNPADDING_ERR (CRYPTO_MOD_BASE_ERR + 0x00014)/*去pad失败*/
#define CRYPTO_MOD_NOT_ENOUGH_SPACE_ERR (CRYPTO_MOD_BASE_ERR + 0x00015)/*分配的空间不足*/
#define CRYPTO_MOD_DETERMINISTIC_DEC_VERIFY_ERR (CRYPTO_MOD_BASE_ERR + 0x00016)/*确定性解密校验失败*/
#define CRYPTO_MOD_UNKNOWN_PARAM_ERR (CRYPTO_MOD_BASE_ERR + 0x00017)/*未知的参数*/
extern void set_thread_errno(int errno);
extern const char* common_get_errmsg();
#ifdef __cplusplus
}
#endif
#endif /* COMMON_ERR_H */

View File

@ -0,0 +1,796 @@
#include <pthread.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "common_internal_interfaces.h"
#include "common_err.h"
#include "common_utils.h"
#define INTERNAL_SHARED_LOCK 0
#define INTERNAL_EXCLUSIVE_LOCK 1
#define SET_JNTA_CFG_PATH(path) (setenv("TASS_GHVSM_CFG_PATH", path, 1))
#define INTERNAL_RETURN(ret) \
{ \
if (ret == INTERNAL_OK) \
return CRYPT_MOD_OK; \
else \
return ret; \
}while(0)
/*dlopen句柄*/
static void *driverhandle = NULL;
/*密码模块接口*/
static ModuleInterfaces *moduleinterfaces = NULL;
/*定义一个锁,对driverhandle和moduleinterfaces做读写保护*/
static pthread_rwlock_t drivermutex;
/*设备句柄*/
static void *devicehandle = NULL;
/*定义一个锁,对devicehandle做读写保护*/
static pthread_rwlock_t devicehandlemutex;
/*记录当前空闲的最小索引号,在第一次生成密钥时获取并设置。这个需要保证密钥都是从该接口库生成*/
static int currnetindex = 0;
/*定义一个锁,保证同一时刻只有一个线程在生成密钥*/
static pthread_mutex_t genkeymutex;
static int internal_padding(char *indata, int inlen, char *outdata, int *outlen);
static int internal_unpadding(char *indata, int *inlen);
static void internal_lock(int loketype, pthread_rwlock_t *lock)
{
if (loketype == INTERNAL_SHARED_LOCK) {
pthread_rwlock_rdlock(lock);
} else if (loketype == INTERNAL_EXCLUSIVE_LOCK){
pthread_rwlock_wrlock(lock);
} else {
/*do nothing*/
}
}
static void internal_unlock(pthread_rwlock_t *lock)
{
pthread_rwlock_unlock(lock);
}
ModuleType get_current_module_type()
{
internal_lock(INTERNAL_SHARED_LOCK, &drivermutex);
if (moduleinterfaces) {
internal_unlock(&drivermutex);
return moduleinterfaces->type;
}
internal_unlock(&drivermutex);
return MODULE_INVALID_TYPE;
}
static int load_standard_interfaces(ModuleStandardInterfaces *standardinterfaces)
{
standardinterfaces->InternalOpenDevice = (StandardOpenDevice_type)dlsym(driverhandle, "SDF_OpenDevice");
standardinterfaces->InternalCloseDevice = (StandardCloseDevice_type)dlsym(driverhandle, "SDF_CloseDevice");
standardinterfaces->InternalOpenSession = (StandardOpenSession_type)dlsym(driverhandle, "SDF_OpenSession");
standardinterfaces->InternalCloseSession = (StandardCloseSession_type)dlsym(driverhandle, "SDF_CloseSession");
standardinterfaces->InternalGenerateRandom = (StandardGenerateRandom_type)dlsym(driverhandle, "SDF_GenerateRandom");
standardinterfaces->InternalEncrypt = (StandardEncrypt_type)dlsym(driverhandle, "SDF_Encrypt");
standardinterfaces->InternalDecrypt = (StandardDecrypt_type)dlsym(driverhandle, "SDF_Decrypt");
standardinterfaces->InternalDestroyKey = (StandardDestroyKey_type)dlsym(driverhandle, "SDF_DestroyKey");
standardinterfaces->InternalHashInit = (StandardHashInit_type)dlsym(driverhandle, "SDF_HashInit");
standardinterfaces->InternalHashUpdate = (StandardHashUpdate_type)dlsym(driverhandle, "SDF_HashUpdate");
standardinterfaces->InternalHashFinal = (StandardHashFinal_type)dlsym(driverhandle, "SDF_HashFinal");
if (standardinterfaces->InternalOpenDevice == NULL
|| standardinterfaces->InternalCloseDevice == NULL
|| standardinterfaces->InternalOpenSession == NULL
|| standardinterfaces->InternalCloseSession == NULL
|| standardinterfaces->InternalGenerateRandom == NULL
|| standardinterfaces->InternalEncrypt == NULL
|| standardinterfaces->InternalDecrypt == NULL
|| standardinterfaces->InternalDestroyKey == NULL
|| standardinterfaces->InternalHashInit == NULL
|| standardinterfaces->InternalHashUpdate == NULL
|| standardinterfaces->InternalHashFinal == NULL) {
return CRYPTO_MOD_DLSYM_ERR;
}
return CRYPT_MOD_OK;
}
static int load_gdac_interfaces(ModuleGdacInterfaces* gdacinterfaces)
{
gdacinterfaces->GDACGenerateKEK = (GDACGenerateKEK_type)dlsym(driverhandle, "SDFE_GenerateKEK");
gdacinterfaces->GDACHMAC = (GDACHMAC_type)dlsym(driverhandle, "SDFE_Hmac");
gdacinterfaces->GDACEncryptWithIndex = (GDACEncryptWithIndex_type)dlsym(driverhandle, "SDFE_Encrypt");
gdacinterfaces->GDACDecryptWithIndex = (GDACDecryptWithIndex_type)dlsym(driverhandle, "SDFE_Decrypt");
gdacinterfaces->GDACExportKEK = (GDACExportKEK_type)dlsym(driverhandle, "SDFE_ExportKEK");
gdacinterfaces->GDACGetkeyState = (GDACGetkeyState_type)dlsym(driverhandle, "SDFE_GetkeyState");
if (gdacinterfaces->GDACGenerateKEK == NULL
|| gdacinterfaces->GDACHMAC == NULL
|| gdacinterfaces->GDACEncryptWithIndex == NULL
|| gdacinterfaces->GDACDecryptWithIndex == NULL
|| gdacinterfaces->GDACExportKEK == NULL
|| gdacinterfaces->GDACGetkeyState == NULL) {
return CRYPTO_MOD_DLSYM_ERR;
}
return CRYPT_MOD_OK;
}
static int load_jnta_interfaces(ModuleJntaInterfaces* jntainterfaces)
{
jntainterfaces->JNTACalculateHmac = (JNTACalculateHmac_type)dlsym(driverhandle, "Tass_CalculateHmac");
jntainterfaces->JNTAGenerateSymmKeyWithLMK = (JNTAGenerateSymmKeyWithLMK_type)dlsym(driverhandle, "Tass_GenerateSymmKeyWithLMK");
jntainterfaces->JNTAImportKeyCipherByLMK = (JNTAImportKeyCipherByLMK_type)dlsym(driverhandle, "Tass_ImportKeyCipherByLMK");
if (jntainterfaces->JNTACalculateHmac == NULL
|| jntainterfaces->JNTAGenerateSymmKeyWithLMK == NULL
|| jntainterfaces->JNTAImportKeyCipherByLMK == NULL) {
return CRYPTO_MOD_DLSYM_ERR;
}
return CRYPT_MOD_OK;
}
static int load_swxa_interfaces(ModuleSwxaInterfaces* swxainterfaces)
{
swxainterfaces->SWXAGenerateKeyCipher = (SWXAGenerateKeyCipher_type)dlsym(driverhandle, "SDF_GenerateKey_Cipher");
swxainterfaces->SWXAEncKeyEncrypt = (SWXAEncKeyEncrypt_type)dlsym(driverhandle, "SDF_EncKeyEncrypt");
swxainterfaces->SWXAEncKeyDecrypt = (SWXAEncKeyDecrypt_type)dlsym(driverhandle, "SDF_EncKeyDecrypt");
swxainterfaces->SWXAHMAC = (SWXAHMAC_type)dlsym(driverhandle, "SDF_EncKeyHMAC");
swxainterfaces->SWXAOpenDeviceWithPathAndName = (SWXAOpenDeviceWithPathAndName_type)dlsym(driverhandle, "SDF_OpenDeviceWithPathAndName");
if (swxainterfaces->SWXAGenerateKeyCipher == NULL
|| swxainterfaces->SWXAEncKeyEncrypt == NULL
|| swxainterfaces->SWXAEncKeyDecrypt == NULL
|| swxainterfaces->SWXAHMAC == NULL
|| swxainterfaces->SWXAOpenDeviceWithPathAndName == NULL) {
return CRYPTO_MOD_DLSYM_ERR;
}
return CRYPT_MOD_OK;
}
/*加载驱动库*/
int load_module_driver(ModuleParams moduleparams)
{
int ret = CRYPT_MOD_OK;
/*加写锁*/
internal_lock(INTERNAL_EXCLUSIVE_LOCK, &drivermutex);
/*检查是否已经加载,如果已经加载过,则直接返回*/
if (driverhandle && moduleinterfaces) {
internal_unlock(&drivermutex);
return CRYPT_MOD_OK;
}
/*dlopen动态库*/
driverhandle = dlopen(moduleparams.libpath, RTLD_LAZY);
if (driverhandle == NULL) {
internal_unlock(&drivermutex);
return CRYPTO_MOD_DLOPEN_ERR;
}
/*为接口分配空间*/
moduleinterfaces = (ModuleInterfaces*)malloc(sizeof(ModuleInterfaces));
moduleinterfaces->type = moduleparams.moduletype;
moduleinterfaces->standardInterfaces = (ModuleStandardInterfaces*)malloc(sizeof(ModuleStandardInterfaces));
/*加载标准接口*/
ret = load_standard_interfaces(moduleinterfaces->standardInterfaces);
if (ret != CRYPT_MOD_OK) {
free(moduleinterfaces->standardInterfaces);
free(moduleinterfaces);
internal_unlock(&drivermutex);
return ret;
}
/*加载扩展接口*/
switch (moduleparams.moduletype)
{
case MODULE_GDAC_CARD_TYPE:
moduleinterfaces->extendInterfaces.gdacInterfaces = (ModuleGdacInterfaces*)malloc(sizeof(ModuleGdacInterfaces));
ret = load_gdac_interfaces(moduleinterfaces->extendInterfaces.gdacInterfaces);
break;
case MODULE_JNTA_KMS_TYPE:
moduleinterfaces->extendInterfaces.jntaInterfaces = (ModuleJntaInterfaces*)malloc(sizeof(ModuleJntaInterfaces));
ret = load_jnta_interfaces(moduleinterfaces->extendInterfaces.jntaInterfaces);
break;
case MODULE_SWXA_KMS_TYPE:
moduleinterfaces->extendInterfaces.swxaInterfaces = (ModuleSwxaInterfaces*)malloc(sizeof(ModuleSwxaInterfaces));
ret = load_swxa_interfaces(moduleinterfaces->extendInterfaces.swxaInterfaces);
break;
default:
free(moduleinterfaces->standardInterfaces);
free(moduleinterfaces);
internal_unlock(&drivermutex);
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
if (ret != CRYPT_MOD_OK) {
if (moduleinterfaces->extendInterfaces.gdacInterfaces)
free(moduleinterfaces->extendInterfaces.gdacInterfaces);
if (moduleinterfaces->extendInterfaces.jntaInterfaces)
free(moduleinterfaces->extendInterfaces.jntaInterfaces);
if (moduleinterfaces->extendInterfaces.swxaInterfaces)
free(moduleinterfaces->extendInterfaces.swxaInterfaces);
free(moduleinterfaces->standardInterfaces);
free(moduleinterfaces);
moduleinterfaces = NULL;
internal_unlock(&drivermutex);
return ret;
}
internal_unlock(&drivermutex);
return CRYPT_MOD_OK;
}
int unload_module_driver()
{
/*加写锁*/
internal_lock(INTERNAL_EXCLUSIVE_LOCK, &drivermutex);
if (driverhandle == NULL || moduleinterfaces) {
internal_unlock(&drivermutex);
return CRYPTO_MOD_UNLOAD_ERR;
}
/*释放接口空间*/
if (moduleinterfaces->extendInterfaces.gdacInterfaces) {
free(moduleinterfaces->extendInterfaces.gdacInterfaces);
moduleinterfaces->extendInterfaces.gdacInterfaces = NULL;
}
if (moduleinterfaces->extendInterfaces.jntaInterfaces) {
free(moduleinterfaces->extendInterfaces.jntaInterfaces);
moduleinterfaces->extendInterfaces.jntaInterfaces = NULL;
}
if (moduleinterfaces->extendInterfaces.swxaInterfaces) {
free(moduleinterfaces->extendInterfaces.swxaInterfaces);
moduleinterfaces->extendInterfaces.swxaInterfaces = NULL;
}
free(moduleinterfaces->standardInterfaces);
moduleinterfaces->standardInterfaces = NULL;
free(moduleinterfaces);
moduleinterfaces = NULL;
dlclose(driverhandle);
driverhandle = NULL;
internal_unlock(&drivermutex);
return CRYPT_MOD_OK;
}
int internal_open_device(char* cfg_path)
{
/*这里调用密码硬件的接口,需要注意硬件接口返回0表示成功。*/
int ret = INTERNAL_OK;
/*判断是否已加载驱动并加载驱动接口*/
internal_lock(INTERNAL_SHARED_LOCK, &drivermutex);
if (driverhandle == NULL || moduleinterfaces == NULL) {
internal_unlock(&drivermutex);
return CRYPTO_MOD_NOT_LOADED_ERR;
}
/*大胆一些,在这里释放掉锁*/
internal_unlock(&drivermutex);
/*对设备句柄加写锁*/
internal_lock(INTERNAL_EXCLUSIVE_LOCK, &devicehandlemutex);
/*已经打开过,直接返回*/
if (devicehandle != NULL) {
internal_unlock(&devicehandlemutex);
return CRYPT_MOD_OK;
}
switch (moduleinterfaces->type)
{
case MODULE_GDAC_CARD_TYPE:
ret = moduleinterfaces->standardInterfaces->InternalOpenDevice(&devicehandle);
break;
case MODULE_SWXA_KMS_TYPE:
ret = moduleinterfaces->extendInterfaces.swxaInterfaces->SWXAOpenDeviceWithPathAndName((unsigned char*)cfg_path, &devicehandle);
break;
case MODULE_JNTA_KMS_TYPE:
/*江南天安从环境变量获取配置文件路径,这里设置一下*/
SET_JNTA_CFG_PATH(cfg_path);
ret = moduleinterfaces->standardInterfaces->InternalOpenDevice(&devicehandle);
break;
default:
internal_unlock(&devicehandlemutex);
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
internal_unlock(&devicehandlemutex);
INTERNAL_RETURN(ret);
}
int internal_close_device()
{
int ret = INTERNAL_OK;
internal_lock(INTERNAL_EXCLUSIVE_LOCK, &devicehandlemutex);
if (devicehandle != NULL) {
ret = moduleinterfaces->standardInterfaces->InternalCloseDevice(devicehandle);
devicehandle = NULL;
}
internal_unlock(&devicehandlemutex);
INTERNAL_RETURN(ret);
}
int internal_open_session(void **sess)
{
int ret = INTERNAL_OK;
internal_lock(INTERNAL_SHARED_LOCK, &devicehandlemutex);
if (devicehandle == NULL) {
internal_unlock(&devicehandlemutex);
return CRYPTO_MOD_NOT_OPENDEVICE_ERR;
}
ret = moduleinterfaces->standardInterfaces->InternalOpenSession(devicehandle, sess);
internal_unlock(&devicehandlemutex);
INTERNAL_RETURN(ret);
}
int internal_close_session(void *sess)
{
int ret = INTERNAL_OK;
if (sess == NULL) {
return CRYPTO_MOD_NOT_OPENSESSION_ERR;
}
internal_lock(INTERNAL_SHARED_LOCK, &devicehandlemutex);
if (devicehandle == NULL) {
internal_unlock(&devicehandlemutex);
return CRYPTO_MOD_NOT_OPENDEVICE_ERR;
}
ret = moduleinterfaces->standardInterfaces->InternalCloseSession(sess);
internal_unlock(&devicehandlemutex);
INTERNAL_RETURN(ret);
}
static bool use_key_index()
{
switch (moduleinterfaces->type) {
case MODULE_GDAC_CARD_TYPE:
case MODULE_JNTA_KMS_TYPE:
return true;
case MODULE_SWXA_KMS_TYPE:
return false;
default:
return false;
}
}
static int init_gdac_key_index(void* sess)
{
int keystatus = 0;
int i =0;
int ret = INTERNAL_OK;
/*需要获取当前存在密钥的最大索引值*/
for (i = INTERNAL_MIN_INDEX_NUM; i <= INTERNAL_MAX_INDEX_NUM; i++) {
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACGetkeyState(sess, GDAC_KEK_TYPE, (unsigned int)i, (unsigned int*)&keystatus);
if (ret != INTERNAL_OK) {
return ret;
}
if (keystatus == GDAC_KEY_NOT_EXIST) {
currnetindex = i;
break;
}
}
if (i == (INTERNAL_MAX_INDEX_NUM + 1)) {
return INTERNAL_NOBUFFER;
}
return INTERNAL_OK;
}
static int init_jnta_key_index(void* sess)
{
int ret = INTERNAL_OK;
int i = 0;
InternalKeyCtx *keyctx = NULL;
unsigned char tmpdata[] = {"12345678"};
int tmplen = 8;
unsigned char tmpiv[] = {"1234567812345678"};
int tmpivlen = 16;
unsigned char tmpout[32] = {0};
unsigned int tmpoutlen = 0;
keyctx = (InternalKeyCtx*)malloc(sizeof(InternalKeyCtx));
keyctx->session = sess;
keyctx->enc = INTERNAL_DO_ENC;
keyctx->algotype = TA_SM4;
keyctx->algomode = TA_CBC;
/*需要获取当前存在密钥的最大索引值*/
for (i = INTERNAL_MIN_INDEX_NUM; i <= INTERNAL_MAX_INDEX_NUM; i++) {
sprintf((char *)(keyctx->key), "%d",i);
keyctx->keysize = strlen((char*)(keyctx->key));
/*没有获取密钥状态接口,通过做加密判断错误发为密钥不存在*/
ret = internal_symm_encrypt(keyctx, tmpdata, tmplen, tmpiv, tmpivlen, tmpout, &tmpoutlen, NULL);
if (ret == INTERNAL_KEYNOTEXIST) {
currnetindex = i;
break;
}
memset(keyctx->key, 0x0, INTERNAL_MAX_KEY_LEN);
}
free(keyctx);
if (i == (INTERNAL_MAX_INDEX_NUM + 1)) {
return INTERNAL_NOBUFFER;
}
return INTERNAL_OK;
}
static int init_current_key_index(void* sess)
{
int ret = INTERNAL_OK;
switch (moduleinterfaces->type) {
case MODULE_GDAC_CARD_TYPE:
ret = init_gdac_key_index(sess);
break;
case MODULE_JNTA_KMS_TYPE:
ret = init_jnta_key_index(sess);
break;
case MODULE_SWXA_KMS_TYPE:
default:
break;
}
return ret;
}
int internal_generate_symm_key(void* sess, ModuleSymmKeyAlgo algo, unsigned char* key, unsigned int* keylen)
{
int ret = INTERNAL_OK;
bool useindex = use_key_index();
if (sess == NULL) {
return CRYPTO_MOD_NOT_OPENSESSION_ERR;
}
if (useindex) {
pthread_mutex_lock(&genkeymutex);
if (currnetindex == 0) {
ret = init_current_key_index(sess);
if (ret != INTERNAL_OK) {
pthread_mutex_unlock(&genkeymutex);
return ret;
}
} else if (currnetindex == (INTERNAL_MAX_INDEX_NUM + 1)) {
pthread_mutex_unlock(&genkeymutex);
return INTERNAL_NOBUFFER;
}
}
switch(moduleinterfaces->type) {
case MODULE_GDAC_CARD_TYPE:
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACGenerateKEK(sess, get_key_len_by_algo_type(algo), currnetindex);
break;
case MODULE_JNTA_KMS_TYPE: {
unsigned int realalgo;
unsigned int realmode;
unsigned char tmpcipher[INTERNAL_MAX_KEY_LEN + 1] = {0};
unsigned int tmpcipherlen = 0;
unsigned char kcv[8] = {0};
unsigned int kcvlen = 0;
ret = get_real_symm_algo_type(moduleinterfaces->type, algo, &realalgo, &realmode);
if (ret != CRYPT_MOD_OK)
break;
ret = moduleinterfaces->extendInterfaces.jntaInterfaces->JNTAGenerateSymmKeyWithLMK(sess, (TA_SYMM_ALG)realalgo, tmpcipher, &tmpcipherlen, kcv, &kcvlen);
if (ret != INTERNAL_OK)
break;
ret = moduleinterfaces->extendInterfaces.jntaInterfaces->JNTAImportKeyCipherByLMK(sess, currnetindex, 0, 0, (TA_SYMM_ALG)realalgo, 0, NULL, 0, NULL, 0, tmpcipher, tmpcipherlen, kcv, 0);
if (ret != INTERNAL_OK)
break;
break;
}
case MODULE_SWXA_KMS_TYPE:
ret = moduleinterfaces->extendInterfaces.swxaInterfaces->SWXAGenerateKeyCipher(sess, get_key_len_by_algo_type(algo), key, keylen);
break;
default:
ret = CRYPTO_MOD_TYPE_INVALID_ERR;
break;
}
if (useindex) {
if (ret != CRYPT_MOD_OK && ret != INTERNAL_OK) {
pthread_mutex_unlock(&genkeymutex);
return ret;
} else {
sprintf((char*)key, "%d",currnetindex);
*keylen = strlen((char*)key);
currnetindex++;
pthread_mutex_unlock(&genkeymutex);
return CRYPT_MOD_OK;
}
}
if (ret != CRYPT_MOD_OK && ret != INTERNAL_OK) {
return ret;
} else {
return CRYPT_MOD_OK;
}
}
int internal_symm_encrypt(void *keyctx, unsigned char *indata, unsigned int inlen, unsigned char *iv, unsigned int ivlen, unsigned char *outdata, unsigned int *outlen, unsigned char *tag)
{
int ret = INTERNAL_OK;
InternalKeyCtx *tmpctx = (InternalKeyCtx *)keyctx;
unsigned char *paddingdata = NULL;
int paddinglen = 0;
unsigned char tmpiv[INTERNAL_IV_LEN + 1] = {0};
memcpy(tmpiv, iv, ivlen);
paddinglen = inlen + INTERNAL_BLOCK_LEN + 1;
paddingdata = (unsigned char *)malloc(paddinglen);
memset(paddingdata, 0x0, paddinglen);
internal_padding((char*)indata, inlen, (char*)paddingdata, &paddinglen);
switch (moduleinterfaces->type) {
case MODULE_GDAC_CARD_TYPE: {
unsigned char tmpkey[INTERNAL_MAX_KEY_LEN] = {0};
unsigned int keylen = 0;
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACExportKEK(tmpctx->session, atoi((char*)tmpctx->key), tmpkey, &keylen);
if (ret != INTERNAL_OK)
return ret;
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACEncryptWithIndex(tmpctx->session, tmpkey, keylen, tmpctx->algotype, tmpiv, ivlen, paddingdata, paddinglen, outdata, outlen, NULL, 0, NULL);
break;
}
case MODULE_JNTA_KMS_TYPE: {
int tmpindex = atoi((char*)(tmpctx->key));
unsigned int standardtype = 0;
transform_jnta_algo_type(tmpctx->algotype, tmpctx->algomode, &standardtype);
ret = moduleinterfaces->standardInterfaces->InternalEncrypt(tmpctx->session, (void*)&tmpindex, standardtype, tmpiv, paddingdata, paddinglen, outdata, outlen);
break;
}
case MODULE_SWXA_KMS_TYPE:
ret = moduleinterfaces->extendInterfaces.swxaInterfaces->SWXAEncKeyEncrypt(tmpctx->session, tmpctx->key, tmpctx->keysize, tmpctx->algotype, tmpiv, paddingdata, paddinglen, outdata, outlen);
break;
default:
ret = CRYPTO_MOD_TYPE_INVALID_ERR;
break;;
}
free(paddingdata);
INTERNAL_RETURN(ret);
}
int internal_symm_decrypt(void *keyctx, unsigned char *indata, unsigned int inlen, unsigned char *iv, unsigned int ivlen, unsigned char *outdata, unsigned int *outlen, unsigned char *tag)
{
int ret = INTERNAL_OK;
InternalKeyCtx *tmpctx = (InternalKeyCtx *)keyctx;
unsigned char tmpiv[INTERNAL_IV_LEN + 1] = {0};
memcpy(tmpiv, iv, ivlen);
switch (moduleinterfaces->type) {
case MODULE_GDAC_CARD_TYPE: {
unsigned char tmpkey[INTERNAL_MAX_KEY_LEN] = {0};
unsigned int keylen = 0;
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACExportKEK(tmpctx->session, atoi((char*)tmpctx->key), tmpkey, &keylen);
if (ret != INTERNAL_OK)
return ret;
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACDecryptWithIndex(tmpctx->session, tmpkey, keylen, tmpctx->algotype, tmpiv, ivlen, indata, inlen, outdata, outlen, NULL, 0, NULL);
break;
}
case MODULE_JNTA_KMS_TYPE: {
int index = atoi((char *)(tmpctx->key));
unsigned int standardtype = 0;
transform_jnta_algo_type(tmpctx->algotype, tmpctx->algomode, &standardtype);
ret = moduleinterfaces->standardInterfaces->InternalDecrypt(tmpctx->session, (void*)&index, standardtype, tmpiv, indata, inlen, outdata, outlen);
break;
}
case MODULE_SWXA_KMS_TYPE:
ret = moduleinterfaces->extendInterfaces.swxaInterfaces->SWXAEncKeyDecrypt(tmpctx->session, tmpctx->key, tmpctx->keysize, tmpctx->algotype, tmpiv, indata, inlen, outdata, outlen);
break;
default:
ret = CRYPTO_MOD_TYPE_INVALID_ERR;
break;
}
if (ret == INTERNAL_OK) {
return internal_unpadding((char*)outdata, (int*)outlen);
}
INTERNAL_RETURN(ret);
}
int internal_digest(void *sess, ModuleDigestAlgo algo, unsigned char * indata, unsigned int inlen, unsigned char *outdata, unsigned int *outlen)
{
int ret = CRYPT_MOD_OK;
unsigned int realtype = 0;
int position = 0;
int updatelen = 0;
ret = get_real_digest_algo_type(moduleinterfaces->type, algo, &realtype);
if (ret != CRYPT_MOD_OK) {
return ret;
}
ret = moduleinterfaces->standardInterfaces->InternalHashInit(sess, realtype, NULL, NULL, 0);
if (ret != INTERNAL_OK)
return ret;
while (inlen) {
if (inlen >= INTERNAL_MSG_BLOCK_LEN) {
updatelen = INTERNAL_MSG_BLOCK_LEN;
inlen -= INTERNAL_MSG_BLOCK_LEN;
} else {
updatelen = inlen;
inlen = 0;
}
ret = moduleinterfaces->standardInterfaces->InternalHashUpdate(sess, indata + position, updatelen);
if (ret != INTERNAL_OK)
return ret;
position += updatelen;
}
ret = moduleinterfaces->standardInterfaces->InternalHashFinal(sess, outdata, outlen);
INTERNAL_RETURN(ret);
}
/*如果传入的data为NULL,并且data_size为0,则对key自身做hmac*/
int internal_hmac(void *ctx, unsigned char * data, unsigned int data_size, unsigned char *result, size_t *result_size)
{
int ret = INTERNAL_OK;
InternalKeyCtx *tmpctx = (InternalKeyCtx *)ctx;
switch (moduleinterfaces->type) {
case MODULE_GDAC_CARD_TYPE:{
unsigned char tmpkey[INTERNAL_MAX_KEY_LEN] = {0};
unsigned int keylen = 0;
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACExportKEK(tmpctx->session, atoi((char*)tmpctx->key), tmpkey, &keylen);
if (ret != INTERNAL_OK)
return ret;
ret = moduleinterfaces->extendInterfaces.gdacInterfaces->GDACHMAC(tmpctx->session, tmpkey, keylen, tmpctx->algotype,
(data != NULL) ? data : tmpkey, (data_size != 0) ? data_size : keylen, result, (unsigned int*)result_size);
memset(tmpkey,0x0,INTERNAL_MAX_KEY_LEN);
break;
}
case MODULE_JNTA_KMS_TYPE:{
ret = moduleinterfaces->extendInterfaces.jntaInterfaces->JNTACalculateHmac(tmpctx->session, (TA_HMAC_ALG)tmpctx->algotype, atoi((char*)tmpctx->key),
NULL, 0, (data != NULL) ? data : tmpctx->key, (data_size != 0) ? data_size : tmpctx->keysize, result, (unsigned int*)result_size);
break;
}
case MODULE_SWXA_KMS_TYPE:{
ret = moduleinterfaces->extendInterfaces.swxaInterfaces->SWXAHMAC(tmpctx->session, tmpctx->key, tmpctx->keysize, tmpctx->algotype,
(data != NULL) ? data : tmpctx->key, (data_size != 0) ? data_size : tmpctx->keysize, result, (unsigned int*)result_size);
break;
}
default:
ret = CRYPTO_MOD_TYPE_INVALID_ERR;
break;
}
INTERNAL_RETURN(ret);
}
int internal_generate_random(void *sess, char *buffer, size_t size)
{
int ret = INTERNAL_OK;
ret = moduleinterfaces->standardInterfaces->InternalGenerateRandom(sess, size, (unsigned char*)buffer);
INTERNAL_RETURN(ret);
}
/*第一位补0x80,后面补0x00,强补,即如果inlen正好是16的整数倍,则补一个0x80和15个0x00,如果只缺一,则只补一个0x80*/
static int internal_padding(char *indata, int inlen, char *outdata, int *outlen)
{
int i = 0;
int firstpad = 0x80;
int secondpad = 0x00;
int paddlen = 0;
paddlen = INTERNAL_BLOCK_LEN - inlen%INTERNAL_BLOCK_LEN;
memcpy(outdata, indata, inlen);
for (i = 0; i < paddlen; i++) {
if (i == 0)
outdata[inlen + i] = firstpad;
else
outdata[inlen + i] = secondpad;
}
*outlen = inlen + paddlen;
return CRYPT_MOD_OK;
}
static int internal_unpadding(char *indata, int *inlen)
{
int firstpad = 0x80;
int secondpad = 0x00;
int tmplen = 0;
tmplen = *inlen - 1;
while (*(indata + tmplen) == secondpad) {
tmplen--;
}
if (tmplen >= ((*inlen) - INTERNAL_BLOCK_LEN) && *(unsigned char*)(indata + tmplen) == firstpad) {
*inlen = tmplen;
} else {
return CRYPTO_MOD_UNPADDING_ERR;
}
indata[tmplen] = '\0';
return CRYPT_MOD_OK;
}

View File

@ -0,0 +1,127 @@
#ifndef COMMON_INTERNAL_INTERFACES_H
#define COMMON_INTERNAL_INTERFACES_H
#include "common_algo.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ECCref_MAX_BITS 512
#define ECCref_MAX_LEN ((ECCref_MAX_BITS+7) / 8)
/* ECC key data public key structure definition */
typedef struct ECCrefPublicKey_st
{
unsigned int bits;
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
} ECCrefPublicKey;
typedef int (*StandardOpenDevice_type)(void**);
typedef int (*StandardCloseDevice_type)(void*);
typedef int (*StandardOpenSession_type)(void*, void**);
typedef int (*StandardCloseSession_type)(void*);
typedef int (*StandardGenerateRandom_type)(void*, unsigned int, unsigned char*);
typedef int (*StandardHashInit_type)(void*, unsigned int, ECCrefPublicKey*, unsigned char*, unsigned int);
typedef int (*StandardHashUpdate_type)(void*, unsigned char*, unsigned int);
typedef int (*StandardHashFinal_type)(void*, unsigned char*, unsigned int*);
typedef int (*StandardEncrypt_type)(void*, void*, unsigned int, unsigned char*, unsigned char*, unsigned int, unsigned char*, unsigned int*);
typedef int (*StandardDecrypt_type)(void*, void*, unsigned int, unsigned char*, unsigned char*, unsigned int, unsigned char*, unsigned int*);
typedef int (*StandardDestroyKey_type)(void*, void*);
/*SDF标准接口*/
typedef struct {
StandardOpenDevice_type InternalOpenDevice; /*打开设备*/
StandardCloseDevice_type InternalCloseDevice; /*关闭设备*/
StandardOpenSession_type InternalOpenSession; /*打开会话*/
StandardCloseSession_type InternalCloseSession; /*关闭会话*/
StandardGenerateRandom_type InternalGenerateRandom; /*生成随机数*/
StandardHashInit_type InternalHashInit; /*哈希初始化*/
StandardHashUpdate_type InternalHashUpdate; /*哈希update*/
StandardHashFinal_type InternalHashFinal; /*哈希结束*/
StandardEncrypt_type InternalEncrypt; /*使用密钥句柄加密*/
StandardDecrypt_type InternalDecrypt; /*使用密钥句柄解密*/
StandardDestroyKey_type InternalDestroyKey; /*销毁密钥句柄*/
}ModuleStandardInterfaces;
typedef int (*GDACHMAC_type)(void*, unsigned char*, unsigned int, unsigned int, unsigned char*, unsigned int, unsigned char*, unsigned int*);
typedef int (*GDACGenerateKEK_type)(void*, unsigned int, unsigned int);
typedef int (*GDACEncryptWithIndex_type)(void*, unsigned char*, unsigned int, unsigned int, unsigned char*, unsigned int, unsigned char*, unsigned int, unsigned char*, unsigned int*, unsigned char*, unsigned int, unsigned char*);
typedef int (*GDACDecryptWithIndex_type)(void*, unsigned char*, unsigned int, unsigned int, unsigned char*, unsigned int, unsigned char*, unsigned int, unsigned char*, unsigned int*, unsigned char*, unsigned int, unsigned char*);
typedef int (*GDACExportKEK_type)(void*, unsigned int, void*, unsigned int*);
typedef int (*GDACGetkeyState_type)(void*, unsigned int, unsigned int, unsigned int*);
/*光电安辰扩展接口*/
typedef struct {
GDACHMAC_type GDACHMAC; /*hmac*/
GDACGenerateKEK_type GDACGenerateKEK; /*生成指定索引密钥*/
GDACEncryptWithIndex_type GDACEncryptWithIndex; /*使用索引密钥加密*/
GDACDecryptWithIndex_type GDACDecryptWithIndex; /*使用索引密钥解密*/
GDACExportKEK_type GDACExportKEK; /*导出KEK,不对外提供,内做索引转密钥使用*/
GDACGetkeyState_type GDACGetkeyState; /*获取密钥状态*/
}ModuleGdacInterfaces;
typedef int (*SWXAOpenDeviceWithPathAndName_type)(unsigned char*, void **);
typedef int (*SWXAHMAC_type)(void *, unsigned char *, unsigned int, unsigned int, unsigned char *, unsigned int, unsigned char *,unsigned int*);
typedef int (*SWXAGenerateKeyCipher_type)(void*, unsigned int, unsigned char*, unsigned int*);
typedef int (*SWXAEncKeyEncrypt_type)(void*, unsigned char*, unsigned int, unsigned int, unsigned char*, unsigned char*, unsigned int, unsigned char*, unsigned int*);
typedef int (*SWXAEncKeyDecrypt_type)(void*, unsigned char*, unsigned int, unsigned int, unsigned char*, unsigned char*, unsigned int, unsigned char*, unsigned int*);
/*三未信安扩展接口*/
typedef struct {
SWXAOpenDeviceWithPathAndName_type SWXAOpenDeviceWithPathAndName; /*指定配置文件路径和名称打开设备*/
SWXAHMAC_type SWXAHMAC; /*hmac*/
SWXAGenerateKeyCipher_type SWXAGenerateKeyCipher; /*生成密钥密文*/
SWXAEncKeyEncrypt_type SWXAEncKeyEncrypt; /*使用密钥密文加密*/
SWXAEncKeyDecrypt_type SWXAEncKeyDecrypt; /*使用密钥密文解密*/
}ModuleSwxaInterfaces;
typedef int (*JNTACalculateHmac_type)(void *, TA_HMAC_ALG, unsigned int, const unsigned char*, unsigned int, unsigned char*, unsigned int, unsigned char*, unsigned int*);
typedef int (*JNTAGenerateSymmKeyWithLMK_type)(void *, TA_SYMM_ALG, unsigned char*, unsigned int*, unsigned char*,unsigned int*);
typedef int (*JNTAImportKeyCipherByLMK_type)(void*, unsigned int, int, int, TA_SYMM_ALG, int, const unsigned char*, unsigned int, const unsigned char*, unsigned int,
const unsigned char*, unsigned int, const unsigned char symmKcv[8], unsigned int);
/*江南天安扩展接口*/
typedef struct {
JNTACalculateHmac_type JNTACalculateHmac; /*hmac*/
JNTAGenerateSymmKeyWithLMK_type JNTAGenerateSymmKeyWithLMK; /*生成LMK加密的密钥密文*/
JNTAImportKeyCipherByLMK_type JNTAImportKeyCipherByLMK; /*导入LMK加密的密钥密文到指定的索引位置*/
}ModuleJntaInterfaces;
/*硬件提供的所有接口*/
typedef struct {
ModuleType type;
ModuleStandardInterfaces *standardInterfaces;
union {
ModuleGdacInterfaces *gdacInterfaces;
ModuleSwxaInterfaces *swxaInterfaces;
ModuleJntaInterfaces *jntaInterfaces;
}extendInterfaces;
}ModuleInterfaces;
extern int load_module_driver(ModuleParams moduleparams);
extern int unload_module_driver();
extern int internal_open_device(char* cfg_path);
extern int internal_close_device();
extern int internal_open_session(void **sess);
extern int internal_close_session(void *sess);
extern ModuleType get_current_module_type();
extern int internal_generate_symm_key(void* sess, ModuleSymmKeyAlgo algo, unsigned char* key, unsigned int* keylen);
extern int internal_symm_encrypt(void *keyctx, unsigned char *indata, unsigned int inlen, unsigned char *iv, unsigned int ivlen, unsigned char *outdata, unsigned int *outlen, unsigned char *tag);
extern int internal_symm_decrypt(void *keyctx, unsigned char *indata, unsigned int inlen, unsigned char *iv, unsigned int ivlen, unsigned char *outdata, unsigned int *outlen, unsigned char *tag);
extern int internal_digest(void *sess, ModuleDigestAlgo algo, unsigned char * indata, unsigned int inlen, unsigned char *outdata, unsigned int *outlen);
extern int internal_hmac(void *ctx, unsigned char * data, unsigned int data_size, unsigned char *result, long unsigned int *result_size);
extern int internal_generate_random(void *sess, char *buffer, long unsigned int size);
#ifdef __cplusplus
}
#endif
#endif /* COMMON_INTERNAL_INTERFACES_H */

View File

@ -0,0 +1,155 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "common_utils.h"
#include "common_err.h"
#include "common_algo.h"
/*去掉字符串头和尾的空格*/
static char* remove_space(char *input)
{
int header = 0;
int end = 0;
int inputlen = 0;
const char filter = ' ';
char *tmp = NULL;
if (input == NULL || input[0] == '\0') {
return NULL;
}
inputlen = strlen(input);
/*去头部空格*/
while(input[header++] == filter && header < inputlen) {
/*do nothing*/
}
end = inputlen - 1;
/*去尾部空格*/
while(input[end--] == filter && end >= (header - 1)) {
/*do nothing*/
}
tmp = (char*)malloc(inputlen + 1);
memset(tmp,0x0,inputlen + 1);
/*初始位置为header - 1,长度为(end + 1)- (header -1) + 1*/
memcpy(tmp, input + header - 1, end - header + 3);
return tmp;
}
static int set_module_params(char* k, char* v, ModuleParams *moduleparams)
{
if (IS_MODULE_TYPE(k)) {
if (moduleparams->moduletype != MODULE_INVALID_TYPE) {
return CRYPTO_MOD_TYPE_REPEATED_ERR;
}
moduleparams->moduletype = GET_MODULE_TYPE(v);
if (moduleparams->moduletype == MODULE_INVALID_TYPE) {
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
} else if (IS_MODULE_LIB_PATH(k)) {
if (moduleparams->libpath[0] != '\0') {
return CRYPTO_MOD_LIBPATH_REPEATED_ERR;
}
if (v[0] == '\0' || strlen(v) >= MODULE_MAX_PATH_LEN) {
return CRYPTO_MOD_LIBPATH_INVALID_ERR;
} else {
memcpy(moduleparams->libpath, v, strlen(v));
}
} else if(IS_MODULE_CONFIG_FILE_PATH(k)) {
if (moduleparams->cfgfilepath[0] != '\0') {
return CRYPTO_MOD_CFG_PATH_REPEATED_ERR;
}
if (v[0] == '\0' || strlen(v) >= MODULE_MAX_PATH_LEN) {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
} else {
memcpy(moduleparams->cfgfilepath, v, strlen(v));
}
} else {
return CRYPTO_MOD_UNKNOWN_PARAM_ERR;
}
return CRYPT_MOD_OK;
}
static int check_module_params(ModuleParams *moduleparams)
{
if (moduleparams->libpath[0] == '\0') {
return CRYPTO_MOD_LIBPATH_INVALID_ERR;
}
switch (moduleparams->moduletype) {
case MODULE_GDAC_CARD_TYPE:
/*光电安辰密码卡不需要配置文件*/
if (moduleparams->cfgfilepath[0] != '\0') {
return CRYPTO_MOD_PARAM_TOO_MANY_ERR;
}
break;
case MODULE_JNTA_KMS_TYPE:
/*江南天安的配置文件,需要设置为环境变量使用"TASS_GHVSM_CFG_PATH",在后面加载时自己临时设置使用*/
if (moduleparams->cfgfilepath[0] == '\0') {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
}
break;
case MODULE_SWXA_KMS_TYPE:
/*三未信安kms使用带配置文件路径名称的接口*/
if (moduleparams->cfgfilepath[0] == '\0') {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
}
break;
default:
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
return CRYPT_MOD_OK;
}
int parse_module_params(char *paramsstring, ModuleParams *moduleparams)
{
char *p = NULL;
char *saveptr1 = NULL;
const char *split1 = ",";
const char *split2 = "=";
int ret = 0;
p = strtok_r(paramsstring, split1, &saveptr1);
while (p != NULL) {
char *q = NULL;
char *saveptr2 = NULL;
char *tmp_p = NULL;
char *tmp_ptr2 = NULL;
q = strtok_r(p, split2, &saveptr2);
tmp_p = remove_space(p);
tmp_ptr2 = remove_space(saveptr2);
ret = set_module_params(tmp_p, tmp_ptr2, moduleparams);
if (ret != CRYPT_MOD_OK) {
free(tmp_p);
free(tmp_ptr2);
return ret;
}
free(tmp_p);
free(tmp_ptr2);
q = NULL;
p = strtok_r(NULL, split1, &saveptr1);
}
return check_module_params(moduleparams);
}

View File

@ -0,0 +1,52 @@
#ifndef COMMON_UTILS_H
#define COMMON_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
MODULE_INVALID_TYPE = 0,
MODULE_GDAC_CARD_TYPE, /*光电安辰密码卡*/
MODULE_JNTA_KMS_TYPE, /*江南天安KMS*/
MODULE_SWXA_KMS_TYPE /*三未信安KMS*/
} ModuleType;
/*定义以下字符串宏,用来对输入的kv结构字符串做解析,获取对应的value*/
#define MODULE_TYPE "MODULE_TYPE"
#define MODULE_LIB_PATH "MODULE_LIB_PATH"
#define MODULE_CONFIG_FILE_PATH "MODULE_CONFIG_FILE_PATH"
/*支持的硬件类型字符串*/
#define MODULE_GDAC_CARD_STR "GDACCARD"
#define MODULE_JNTA_KMS_STR "JNTAKMS"
#define MODULE_SWXA_KMS_STR "SWXAKMS"
#define IS_GDAC_CARD_TYPE(s) (strcmp(s, MODULE_GDAC_CARD_STR) == 0)
#define IS_JNTA_KMS_TYPE(s) (strcmp(s, MODULE_JNTA_KMS_STR) == 0)
#define IS_SWXA_KMS_TYPE(s) (strcmp(s, MODULE_SWXA_KMS_STR) == 0)
/*字符串转为枚举类型*/
#define GET_MODULE_TYPE(s) (IS_GDAC_CARD_TYPE(s) ? MODULE_GDAC_CARD_TYPE \
: IS_JNTA_KMS_TYPE(s) ? MODULE_JNTA_KMS_TYPE \
: IS_SWXA_KMS_TYPE(s) ? MODULE_SWXA_KMS_TYPE : MODULE_INVALID_TYPE)
#define IS_MODULE_TYPE(s) (strcmp(s, MODULE_TYPE) == 0)
#define IS_MODULE_LIB_PATH(s) (strcmp(s, MODULE_LIB_PATH) == 0)
#define IS_MODULE_CONFIG_FILE_PATH(s) (strcmp(s, MODULE_CONFIG_FILE_PATH) == 0)
#define MODULE_MAX_PATH_LEN 1024
typedef struct {
ModuleType moduletype;
char libpath[MODULE_MAX_PATH_LEN];
char cfgfilepath[MODULE_MAX_PATH_LEN];
}ModuleParams;
extern int parse_module_params(char *paramsstring, ModuleParams *moduleparams);
#ifdef __cplusplus
}
#endif
#endif /* COMMON_UTILS_H */

321
contrib/common_cipher/test.cpp Executable file
View File

@ -0,0 +1,321 @@
#include<pthread.h>
#include<dlfcn.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX_PROVIDER_NAME_LEN 128
#define MAX_ERRMSG_LEN 256
static pthread_rwlock_t drivermutex;
typedef enum {
MODULE_AES_128_CBC = 0,
MODULE_AES_128_CTR,
MODULE_AES_128_GCM,
MODULE_AES_256_CBC,
MODULE_AES_256_CTR,
MODULE_AES_256_GCM,
MODULE_SM4_CBC,
MODULE_SM4_CTR,
MODULE_HMAC_SHA256,
MODULE_HMAC_SM3,
MODULE_DETERMINISTIC_KEY,
MODULE_ALGO_MAX = 1024
} ModuleSymmKeyAlgo;
typedef enum {
MODULE_SHA256 = 0,
MODULE_SM3,
MODULE_DIGEST_MAX = 1024
} ModuleDigestAlgo;
typedef enum {
KEY_TYPE_INVALID,
KEY_TYPE_PLAINTEXT,
KEY_TYPE_CIPHERTEXT,
KEY_TYPE_NAMEORIDX,
KEY_TYPE_MAX
} KeyType;
typedef struct {
char provider_name[MAX_PROVIDER_NAME_LEN];
KeyType key_type;
int supported_symm[MODULE_ALGO_MAX]; // 不支持算法填入0或者支持算法填入1
int supported_digest[MODULE_DIGEST_MAX]; // 不支持算法填入0或者支持算法填入1
} SupportedFeature;
typedef int (*crypto_module_init_type)(char *load_info, SupportedFeature *supported_feature);
typedef int (*crypto_module_sess_init_type)(char *key_info, void **sess);
typedef void (*crypto_module_sess_exit_type)(void *sess);
typedef int (*crypto_create_symm_key_type)(void *sess, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t *key_id_size);
typedef int (*crypto_ctx_init_type)(void *sess, void **ctx, ModuleSymmKeyAlgo algo, int enc, unsigned char *key_id, size_t key_id_size);
typedef int (*crypto_result_size_type)(void *ctx, int enc, size_t data_size);
typedef void (*crypto_ctx_clean_type)(void *ctx);
typedef int (*crypto_encrypt_decrypt_type)(void *ctx, int enc, unsigned char *data, size_t data_size, unsigned char *iv, size_t iv_size, unsigned char *result, size_t *result_size, unsigned char *tag);
typedef int (*crypto_digest_type)(void *sess, ModuleDigestAlgo algo, unsigned char * data, size_t data_size,unsigned char *result, size_t *result_size);
typedef int (*crypto_hmac_init_type)(void *sess, void **ctx, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t key_id_size);
typedef void (*crypto_hmac_clean_type)(void *ctx);
typedef int (*crypto_hmac_type)(void *ctx, unsigned char * data, size_t data_size, unsigned char *result, size_t *result_size);
typedef int (*crypto_gen_random_type)(void *sess, char *buffer, size_t size);
typedef int (*crypto_deterministic_enc_dec_type)(void *sess, int enc, unsigned char *data, unsigned char *key_id, size_t key_id_size, size_t data_size, unsigned char *result, size_t *result_size);
typedef int (*crypto_get_errmsg_type)(void *sess, char *errmsg);
void *libhandle = NULL;
crypto_module_init_type crypto_module_init_use = NULL;
crypto_module_sess_init_type crypto_module_sess_init_use = NULL;
crypto_module_sess_exit_type crypto_module_sess_exit_use = NULL;
crypto_create_symm_key_type crypto_create_symm_key_use = NULL;
crypto_ctx_init_type crypto_ctx_init_use = NULL;
crypto_result_size_type crypto_result_size_use = NULL;
crypto_ctx_clean_type crypto_ctx_clean_use = NULL;
crypto_encrypt_decrypt_type crypto_encrypt_decrypt_use = NULL;
crypto_digest_type crypto_digest_use = NULL;
crypto_hmac_init_type crypto_hmac_init_use = NULL;
crypto_hmac_clean_type crypto_hmac_clean_use = NULL;
crypto_hmac_type crypto_hmac_use = NULL;
crypto_gen_random_type crypto_gen_random_use = NULL;
crypto_deterministic_enc_dec_type crypto_deterministic_enc_dec_use = NULL;
crypto_get_errmsg_type crypto_get_errmsg_use = NULL;
static void load_lib()
{
libhandle = dlopen("/home//vastbase/contrib/common_cipher/libcommoncipher.so", RTLD_LAZY);
crypto_module_init_use = (crypto_module_init_type)dlsym(libhandle, "crypto_module_init");
crypto_module_sess_init_use = (crypto_module_sess_init_type)dlsym(libhandle, "crypto_module_sess_init");
crypto_module_sess_exit_use = (crypto_module_sess_exit_type)dlsym(libhandle, "crypto_module_sess_exit");
crypto_create_symm_key_use = (crypto_create_symm_key_type)dlsym(libhandle, "crypto_create_symm_key");
crypto_ctx_init_use = (crypto_ctx_init_type)dlsym(libhandle, "crypto_ctx_init");
crypto_result_size_use = (crypto_result_size_type)dlsym(libhandle, "crypto_result_size");
crypto_ctx_clean_use = (crypto_ctx_clean_type)dlsym(libhandle, "crypto_ctx_clean");
crypto_encrypt_decrypt_use = (crypto_encrypt_decrypt_type)dlsym(libhandle, "crypto_encrypt_decrypt");
crypto_digest_use = (crypto_digest_type)dlsym(libhandle, "crypto_digest");
crypto_hmac_init_use = (crypto_hmac_init_type)dlsym(libhandle, "crypto_hmac_init");
crypto_hmac_clean_use = (crypto_hmac_clean_type)dlsym(libhandle, "crypto_hmac_clean");
crypto_hmac_use = (crypto_hmac_type)dlsym(libhandle, "crypto_hmac");
crypto_gen_random_use = (crypto_gen_random_type)dlsym(libhandle, "crypto_gen_random");
crypto_deterministic_enc_dec_use = (crypto_deterministic_enc_dec_type)dlsym(libhandle, "crypto_deterministic_enc_dec");
crypto_get_errmsg_use = (crypto_get_errmsg_type)dlsym(libhandle, "crypto_get_errmsg");
}
static void* one_thread_func(void *data)
{
int ret = 1;
int i = 0;
char options[] = {"MODULE_TYPE=JNTAKMS,MODULE_LIB_PATH=/home//vastbase/contrib/common_cipher/libTassSDF4GHVSM.so,MODULE_CONFIG_FILE_PATH=/home//vastbase/contrib/common_cipher/"};
SupportedFeature supportedfeature;
char errmsg[MAX_ERRMSG_LEN] = {0};
void *session = NULL;
unsigned char key[32] = {0};
long unsigned int keylen = 0;
void *keyctx = NULL;
unsigned char srcdata[] = {"12345678"};
unsigned char plaint[32] = {0};
long unsigned int plaintlen = 32;
unsigned char encdata[32] = {0};
long unsigned int enclen = 32;
unsigned char encdata2[32] = {0};
long unsigned int enclen2 = 32;
unsigned char hashdata[32] = {0};
long unsigned int hashlen = 0;
unsigned char hmacdata[32] = {0};
long unsigned int hmaclen = 0;
long unsigned int needlen = 16;
char random[32] = {0};
unsigned char iv[] = {"1234567812345678"};
ret = crypto_module_init_use(options, &supportedfeature);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_module_init error,errmsg:%s\n", errmsg);
return NULL;
} else {
printf("crypto_module_init success\n");
printf("provider_name = %s,key_type = %d\n",supportedfeature.provider_name,supportedfeature.key_type);
for (i = 0; i < MODULE_ALGO_MAX;i++) {
if (supportedfeature.supported_symm[i] == 1)
printf("supported_symm[%d]\n",i);
}
for (i = 0; i < MODULE_DIGEST_MAX;i++) {
if (supportedfeature.supported_digest[i] == 1)
printf("supported_digest[%d]\n",i);
}
}
ret = crypto_module_sess_init_use(NULL, &session);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_module_sess_init error,errmsg:%s\n", errmsg);
return NULL;
} else {
printf("crypto_module_sess_init success\n");
}
ret = crypto_create_symm_key_use(session, MODULE_SM4_CBC, key, &keylen);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_create_symm_key_use error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_create_symm_key_use success\n");
printf("key = %s\n",key);
}
ret = crypto_ctx_init_use(session, &keyctx, MODULE_SM4_CBC, 1, key, keylen);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_ctx_init_use error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_ctx_init_use success\n");
}
ret = crypto_encrypt_decrypt_use(keyctx, 1, srcdata, 8, iv, 16, encdata, &enclen, NULL);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_encrypt_decrypt_use enc error,errmsg:%s\n", errmsg);
crypto_ctx_clean_use(keyctx);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_encrypt_decrypt_use enc success\n");
}
ret = crypto_encrypt_decrypt_use(keyctx, 0, encdata, enclen, iv, 16, plaint, &plaintlen, NULL);
if (ret != 1 || strcmp((char*)plaint, (char*)srcdata))
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_encrypt_decrypt_use dec error,errmsg:%s\n", errmsg);
crypto_ctx_clean_use(keyctx);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_encrypt_decrypt_use dec success\n");
}
printf("enc nedd len:%d\n",crypto_result_size_use(keyctx, 1, needlen));
printf("dec nedd len:%d\n",crypto_result_size_use(keyctx, 0, needlen));
crypto_ctx_clean_use(keyctx);
ret = crypto_digest_use(session, MODULE_SM3, plaint, plaintlen, hashdata, &hashlen);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_digest_use error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_digest_use success\n");
printf("hashlen = %ld\n", hashlen);
}
ret = crypto_hmac_init_use(session, &keyctx, MODULE_HMAC_SM3, key, keylen);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_hmac_init_use error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_hmac_init_use success\n");
}
ret = crypto_hmac_use(keyctx, plaint, plaintlen, hmacdata, &hmaclen);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_hmac_use error,errmsg:%s\n", errmsg);
crypto_hmac_clean_use(keyctx);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_hmac_use success\n");
printf("hmaclen = %ld\n", hmaclen);
}
crypto_hmac_clean_use(keyctx);
ret = crypto_gen_random_use(session, random, 31);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_gen_random_use error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_gen_random_use success\n");
}
ret = crypto_deterministic_enc_dec_use(session, 1, plaint, key, keylen, plaintlen, encdata, &enclen);
if (ret != 1)
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_deterministic_enc_dec_use1 enc error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_deterministic_enc_dec_use1 enc success\n");
}
ret = crypto_deterministic_enc_dec_use(session, 1, plaint, key, keylen, plaintlen, encdata2, &enclen2);
if (ret != 1 || strcmp((char*)encdata, (char*)encdata2))
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_deterministic_enc_dec_use2 enc error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_deterministic_enc_dec_use2 enc success\n");
}
ret = crypto_deterministic_enc_dec_use(session, 0, encdata2, key, keylen, enclen2, plaint, &plaintlen);
if (ret != 1 || strcmp((char*)plaint, (char*)srcdata))
{
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_deterministic_enc_dec_use2 dec error,errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
} else {
printf("crypto_deterministic_enc_dec_use2 dec success\n");
}
crypto_get_errmsg_use(NULL, errmsg);
printf("crypto_get_errmsg_use errmsg:%s\n", errmsg);
crypto_module_sess_exit_use(session);
return NULL;
}
int main()
{
pthread_t t1, t2, t3, t4;
load_lib();
pthread_create(&t1,0,one_thread_func,NULL);
pthread_create(&t2,0,one_thread_func,NULL);
pthread_create(&t3,0,one_thread_func,NULL);
pthread_create(&t4,0,one_thread_func,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
pthread_join(t4,NULL);
return 0;
}

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.

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