已关闭
[Bug]: B 库创建存储过程不支持MySQL语法 #8232
王正元创建于  6月27日关闭于  18 天前
王正元
王正元成员
6月27日 创建

测试类型

SQL功能

测试版本

7.0.0LTS

问题描述

某存储过程在MySQL创建成功,但是在openGauss创建失败,存储过程内没有复杂语法

操作系统和硬件信息

openEuler release 20.03 (LTS-SP3)
Linux openGauss88 4.19.90-2112.8.0.0131.oe1.aarch64 #1 SMP Fri Dec 31 19:53:20 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

测试环境

极简版

被测功能

MySQL 兼容性

预置条件

操作步骤

step1. 在 openGauss B 库创建存储过程,以MySQL语法

delimiter //
CREATE PROCEDURE `db_replace`(
    IN `search` varchar(100),
    IN `replacement` varchar(100),
    IN `db_name` varchar(100)
)
BEGIN
    DECLARE t_name VARCHAR(50);
    DECLARE done int default 0;
    DECLARE cur CURSOR FOR SELECT DISTINCT table_name as name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=db_name;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    FETCH cur INTO t_name;
        WHILE (done<>1) DO
            call tbl_replace(search,replacement,db_name,t_name);
            FETCH cur INTO t_name;
        END WHILE;
END
//

delimiter ;

预期输出

step1. 成功

实际输出

step1. 失败,相同语句在MySQL 5.7 执行成功
image.png

日志信息

test_b=# delimiter //
SET
test_b=# CREATE PROCEDURE `db_replace`(
test_b(#     IN `search` varchar(100),
test_b(#     IN `replacement` varchar(100),
test_b(#     IN `db_name` varchar(100)
test_b(# )
test_b-# BEGIN
test_b-#     DECLARE t_name VARCHAR(50);
test_b-#     DECLARE done int default 0;
test_b-#     DECLARE cur CURSOR FOR SELECT DISTINCT table_name as name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=db_name;
test_b-#     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
test_b-#     OPEN cur;
test_b-#     FETCH cur INTO t_name;
test_b-#         WHILE (done<>1) DO
test_b-#             call tbl_replace(search,replacement,db_name,t_name);
test_b-#             FETCH cur INTO t_name;
test_b-#         END WHILE;
test_b-# END
test_b-# //
ERROR:  syntax error at or near ""
LINE 1: DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
        ^
QUERY:  DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
oldId int:=0;objId int:=0;allNum int:=0;
begin
 select count(*) from dbe_pldeveloper.gs_source into allNum where nspid=2200 and name='db_replace' and type='procedure';if allNum > 0 then select id from dbe_pldeveloper.gs_source into oldId where nspid=2200 and name='db_replace' and type='procedure';objId := oldId; else objId := 0;end if;delete from DBE_PLDEVELOPER.gs_source where nspid=2200 and name='db_replace' and type = 'procedure';
delete from DBE_PLDEVELOPER.gs_source where nspid=2200 and name='db_replace' and type = 'procedure';
delete from DBE_PLDEVELOPER.gs_errors where nspid=2200 and name='db_replace' and type = 'procedure';
insert into DBE_PLDEVELOPER.gs_source values(objId, 10, 2200,'db_replace', 'procedure', 'f', $gssource$CREATE PROCEDURE `db_replace`(
    IN `search` varchar(100),
    IN `replacement` varchar(100),
    IN `db_name` varchar(100)
)
BEGIN
    DECLARE t_name VARCHAR(50);
    DECLARE done int default 0;
    DECLARE cur CURSOR FOR SELECT DISTINCT table_name as name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=db_name;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    FETCH cur INTO t_name;
        WHILE (done<>1) DO
            call tbl_replace(search,replacement,db_name,t_name);
            FETCH cur INTO t_name;
        END WHILE;
END
/$gssource$);
EXCEPTION WHEN OTHERS THEN NULL; 
end

提单组织

内部开发

测试代码

likedislike
王正元王正元成员
6月27日 添加了label:bug
opengauss_bot
opengauss_bot成员
6月27日 评论:

This issue requires an assignee. Since you haven't specified one, we've assigned TestManager as the default assignee for this issue.

likedislike
opengauss_botopengauss_bot成员
6月27日 将 TestManager 设为负责人
opengauss_botopengauss_bot成员
6月27日 添加了label:sig/StorageEngine,sig/AI,sig/CM,sig/CloudNative,sig/SecurityTechnology,sig/SQLEngine
opengauss_bot
opengauss_bot成员
6月27日 评论:

Welcome To openGauss Community

Hey @wangzhengyuan1 , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.

Contact Guide

If you have any questions, please contact the SIG: StorageEngine, AI, CM, CloudNative, SecurityTechnology, SQLEngine ,
and any of the maintainers: @CarrotGo, @chendong76, @chenxiaobin19, @congzhou2603, @dodders, @hwworkholic, @jemappellehc, @muyulinzhong, @quemingjian, @shenzheng4, @shirley_zhengx, @superlchf, @totaj, @wlff234, @ywzq1161327784 ,
and any of the committers: @Igali, @bihua111, @cailei19, @h_ray, @levy53071, @libiao2024, @lihaixiao, @mrzack, @wangfeihuo, @wuyuechuan, @xiong_xjun, @zhangfengzhi123, @zhangxubo, @zjh_hw .

likedislike
王正元王正元成员
6月27日 issue优先级由 无优先级 改变为 次要
此处折叠了7条事件消息 查看更多
ywzq1161327784ywzq1161327784成员
7月6日 将 superlchf 设为负责人,移除负责人 ywzq1161327784
superlchf成员
7月6日 评论:

可以使用以下参数进行创建测试: set check_function_bodies=off;
image.png
这只会推迟解析。后续真正执行 call db_replace(...) 时,如果 tbl_replace 仍然不存在或签名不匹配,还是会失败。

likedislike
ywzq1161327784ywzq1161327784成员
7月21日 issue状态由 待办的 改变为 已完成
王正元
王正元成员
7月21日 评论:

set check_function_bodies=off,参数设置后,在7.0.0测试没问题,但6.0.6还是有问题。

likedislike
codefarrmer
codefarrmer成员
8月12日 评论:

最新转测包测试6版本参数关闭后正常
image.png

likedislike
王正元
王正元成员
8月12日 评论:

最新6.0.6转测版本问题已解决,问题单可关闭
image.png

likedislike
Ssuperlchf成员
8月13日 issue状态由 已完成 改变为 待回归
Ssuperlchf成员
8月13日 issue状态由 待回归 改变为 已完成
codefarrmer
codefarrmer成员
23 天前 评论:

转测包地址:https://download-opengauss.osinfra.cn/archive_test/7.0.0/openGauss7.0.0.B020/openEuler20.03/arm/
测试日期:2026/08/26
验证结果:
image.png
若未设置参数set check_function_bodies=off;报错信息合理
image.png

likedislike
codefarrmercodefarrmer成员
23 天前 issue状态由 已完成 改变为 待回归
yangl_
yangl_成员
20 天前 评论:

回归版本:7.0.0 LTS B020
回归结论:通过
回归过程:
set check_function_bodies=on;成功执行
image.png
set check_function_bodies=off;报错合理
image.png

likedislike
liuzhen001liuzhen001成员
18 天前 issue状态由 待回归 改变为 已验收
liuzhen001liuzhen001成员
18 天前 关闭了 issue