返回首页

gbase数据、南大通用产品文档:GBase8agbase_optimizer_query_rewrite

更新日期:2024年09月11日

取值:[0|1]
默认值:0
说明:使用指定sql 进行改写。默认关闭。
修改方式:
可使用set 语句修改值也可在配置文件中修改值。
适用于session、
global
范围均可。

SQL UNION 构造必须把那些可能不太相似的类型匹配起来成为一个结果集。解析算法
分别应用于联合查询的每个输出字段。
INTERSECT 和EXCEPT 构造对不相同的类型使用和
UNION 相同的算法进行解析。CASE、ARRAY、VALUES、GREATEST 和LEAST 构造也
使用同样的算法匹配它的部件表达式并且选择一个结果数据类型。
UNION,CASE 和相关构造解析

如果所有输入都是相同的类型,并且不是unknown 类型,那么解析成这种类型。

如果所有输入都是unknown 类型则解析成text 类型(字符串类型范畴的首选类
型)

否则,忽略unknown 输入。

如果输入不属于同一个类型范畴,失败。
(unknown 类型除外)

如果输入类型是同一个类型范畴,则选择该类型范畴的首选类型。
(例外:union 操作
会选择第一个分支的类型作为所选类型。

系统表pg_type 中typcategory 表示数据类型范畴,
typispreferred 表示是否是typcategory
分类中的首选类型。

把所有输入转换为所选的类型(对于字符串保持原有长度)
。如果从给定的输入到所选
的类型没有隐式转换则失败。

若输入中含json、txid_snapshot、sys_refcursor 或几何类型,则不能进行union。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
620
对于case 和coalesce,在TD 兼容模式下的处理

如果所有输入都是相同的类型,并且不是unknown 类型,那么解析成这种类型。

如果所有输入都是unknown 类型则解析成text 类型。

如果输入字符串(包括unknown,unknown 当text 来处理)和数字类型,那么解析成字
符串类型,如果是其他不同的类型范畴,则报错。

如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。

把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。
对于case,在ORA 兼容模式下的处理

decode(expr, search1, result1, search2, result2, ..., defresult),也即case expr when search1
then result1
when search2 then result2 else defresult end; 在ORA 兼容模式下的处理,

整个表达式最终的返回值类型定为result1 的数据类型,或者与result1 同
类型范畴的
更高精度的数据类型。
(例如,numeric 与int 同属数值类型范畴,但numeric 比int 精度
要高,具有更高优先级)

将result1 的数据类型置为最终的返回值类型preferType ,其所属类型范畴为
preferCategory。

依次考虑result2、
result3 直至defresult 的数据类型。
如果其类型范畴也是preferCategory,
即与result1 具有相同的类型范畴,则判断其精度(优先级)是否高于preferType,如
果高于,则将preferType 更新为更高精度的数据类型;如果其类型范畴不是
preferCategory,则判断其数据类型是否可以隐式转换为preferType,不可以则报错。

将最终preferType 记录的数据类型作为整个表达式最终的返回值类型;表达式的结果
向此类型进行隐式转换。
注1:
为了兼容一种特殊情况,即表示了超大数字的字符类型向数值类型转换的情况,例如
select decode(1, 2, 2, "53465465676465454657567678676"),
大数超过了bigint、
double 等的表
示范围。所以,当result1 的类型范畴为数值类型时,将返回值的类型直接置为numeric,

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
621
以兼容此种特殊情况。
注2:
数值类型的优先级排序:
numeric>float8>float4>int8>int4>int2>int1
字符类型的优先
级排序:text>varchar=nvarchar2>bpchar>char
日期类型的优先级排序:
timestamptz>timestamp>smalldatetime>date>abstime>timetz>time
日期跨度类型的优先级排序:interval>tinterval>reltime 注3:
ORA 兼容模式,
开启set sql_beta_feature = 'a_style_coerce'; 参数的情况下,
所支持的隐
式类型转换见下图,\代表不需要转换,yes 表示支持,空白表示不支持:
示例
示例1:Union 中的待定类型解析。这里,unknown 类型文本'b'将被解析成text 类型。
gbase=#SELECT text 'a' AS "text" UNION
SELECT 'b'; text
------
a b
(2 rows)
示例2:简单Union 中的类型解析。文本1.2 的类型为numeric,而且integer 类型的1 可
以隐含地转换为numeric,因此使用这个类型。
gbase=#SELECT 1.2 AS "numeric" UNION SELECT 1; numeric
---------
1

功能说明
GBase 8a MPP Cluster 中的LEAVE 语句用于退出循环结构,因此该语句也只能出
现在LOOP、REPEAT 和WHILE 结构中,LEAVE 语句通常被放在IF 结构中以实
现根据条件退出循环结构。同样的,在使用LEAVE 语句时必须为包含该语句的
循环结构定义标签,然后在使用该语句处指定该标签。
语法格式
LEAVE label

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1363
示例
示例1:LEAVE...
gbase> DELIMITER //
gbase> DROP PROCEDURE IF EXISTS doiterate //
Query OK, 0 rows affected
gbase> CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN ITERATE label1; END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END //
Query OK, 0 rows affected
gbase> DELIMITER ;
gbase> CALL doiterate(1);
Query OK, 0 rows affected
gbase> SELECT @x;
+------+
| @x
|
+------+
|
10 |
+------+
1 row in set