Greenplum plpgsql函数中exit存在无法跳出循环的BUG

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介:

Greenplum中如果使用循环,并且内部嵌套了子块,在子块中的exit只能跳出子块,不能跳出子块外面的循环。

CREATE OR REPLACE FUNCTION test1(i integer) RETURNS 
integer AS 

$$

DECLARE count int;
BEGIN
    count := 1;
    LOOP
        count := count + 1;

        begin
            raise notice 'sub xact: %', count;
            EXECUTE 'select 1';
            IF count > 10 THEN
                EXIT;  -- BUG在这里, 只跳出了begin, 没有跳出LOOP
                raise notice 'sub xact if: %', count;
            END IF;
            raise notice 'sub xact end if: %', count;
        exception when others then
        end;

        raise notice 'parent xact: %', count;
    END LOOP;
    return 1;
END

$$
 LANGUAGE plpgsql;

postgres=# select test1(1);
NOTICE:  sub xact: 2
NOTICE:  sub xact end if: 2
NOTICE:  parent xact: 2
NOTICE:  sub xact: 3
NOTICE:  sub xact end if: 3
NOTICE:  parent xact: 3
NOTICE:  sub xact: 4
NOTICE:  sub xact end if: 4
NOTICE:  parent xact: 4
NOTICE:  sub xact: 5
NOTICE:  sub xact end if: 5
NOTICE:  parent xact: 5
NOTICE:  sub xact: 6
NOTICE:  sub xact end if: 6
NOTICE:  parent xact: 6
NOTICE:  sub xact: 7
NOTICE:  sub xact end if: 7
NOTICE:  parent xact: 7
NOTICE:  sub xact: 8
NOTICE:  sub xact end if: 8
NOTICE:  parent xact: 8
NOTICE:  sub xact: 9
NOTICE:  sub xact end if: 9
NOTICE:  parent xact: 9
NOTICE:  sub xact: 10
NOTICE:  sub xact end if: 10
NOTICE:  parent xact: 10
NOTICE:  sub xact: 11
NOTICE:  parent xact: 11
NOTICE:  sub xact: 12
NOTICE:  parent xact: 12
NOTICE:  sub xact: 13
NOTICE:  parent xact: 13
NOTICE:  sub xact: 14
NOTICE:  parent xact: 14

CREATE OR REPLACE FUNCTION test1(i integer) RETURNS 
integer AS 

$$

DECLARE count int;
BEGIN
    count := 1;
    LOOP
        count := count + 1;

        begin
            raise notice 'sub xact: %', count;
            EXECUTE 'select 1';
            IF count > 10 THEN
                return 0;  -- 改成return, 退出整个函数, 如果要跳出loop, 应该在loop内控制。不能放在LOOP内的sub block执行。
            END IF;
        exception when others then
        end;

        raise notice 'parent xact: %', count;
    END LOOP;
    return 1;
END

$$
 LANGUAGE plpgsql;

postgres=# select test1(1);
NOTICE:  sub xact: 2
NOTICE:  parent xact: 2
NOTICE:  sub xact: 3
NOTICE:  parent xact: 3
NOTICE:  sub xact: 4
NOTICE:  parent xact: 4
NOTICE:  sub xact: 5
NOTICE:  parent xact: 5
NOTICE:  sub xact: 6
NOTICE:  parent xact: 6
NOTICE:  sub xact: 7
NOTICE:  parent xact: 7
NOTICE:  sub xact: 8
NOTICE:  parent xact: 8
NOTICE:  sub xact: 9
NOTICE:  parent xact: 9
NOTICE:  sub xact: 10
NOTICE:  parent xact: 10
NOTICE:  sub xact: 11
 test1 
-------
     0
(1 row)

在PostgreSQL中不存在这个问题。 使用GP时需要注意一下。

相关文章
|
存储 关系型数据库 MySQL
MySQL控制流函数-if 、elseif、else、case...when
MySQL控制流函数-if 、elseif、else、case...when
227 0
MySQL控制流函数-if 、elseif、else、case...when
|
存储 关系型数据库 MySQL
MySQL的存储过程——流程控制-while、repeat、loop循环
MySQL的存储过程——流程控制-while、repeat、loop循环
510 0
MySQL的存储过程——流程控制-while、repeat、loop循环
|
6月前
|
SQL 关系型数据库 MySQL
mysql中执行 sql 语句报语法错误引出的代码空格问题
根据报错提示 sql 语法错误,错误状态码 1064,网上很多人说是使用了 mysql 保留关键字,没用反单引号``包起来,或者普通字符串使用了反单引号这些...反正大部分都是说引号这块出了问题,但一遍遍地检查确实又都没发现问题
67 1
|
SQL
在tp5.1 fetchSql打印出执行的sql语句
在tp5.1 fetchSql打印出执行的sql语句
257 0
在tp5.1 fetchSql打印出执行的sql语句
|
SQL 数据库
三分钟搞懂SQL的Case函数
三分钟搞懂SQL的Case函数
163 0
三分钟搞懂SQL的Case函数
|
SQL Java 程序员
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
152 0
|
SQL 存储 关系型数据库
跳过或替代执行异常的 SQL 语句
本文介绍了如何使用 DM 来处理异常的 SQL 语句。 目前,TiDB 并不完全兼容所有的 MySQL 语法(详见 TiDB 已支持的 DDL 语句)。当使用 DM 从 MySQL 同步数据到 TiDB 时,如果 TiDB 不支持对应的 SQL 语句,可能会造成错误并中断同步任务。在这种情况下,DM 提供以下两种方式来恢复同步: 使用 dmctl 来手动跳过 (skip) 该 SQL 语句对应的 binlog event。 使用 dmctl 来手动指定其他 SQL 语句来替代 (replace) 该 SQL 语句对应的 binlog event,并向下游执行。 如果提前预知将要同步 T
613 0