更新时间:2024-04-30 GMT+08:00
分享

平台和客户端兼容性

很多平台都使用数据库系统,数据库系统的对外兼容性给平台提供了很大的方便。

transform_null_equals

参数说明:控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。如果expr得出NULL值则返回真,否则返回假。

  • 正确的SQL标准兼容的expr = NULL总是返回NULL(未知)。
  • Microsoft Access里的过滤表单生成的查询使用expr = NULL来测试空值。打开这个选项,可以使用该接口来访问数据库。

参数类型:USERSET

取值范围:布尔型

  • on表示控制表达式expr = NULL(或NULL = expr)当做expr IS NULL处理。
  • off表示不控制,即expr = NULL总是返回NULL(未知)。

默认值:off

新用户经常在涉及NULL的表达式上语义混淆,故默认值设为off。

td_compatible_truncation

参数说明:控制是否开启与Teradata数据库相应兼容的特征。该参数在用户连接上与TD兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能启用后,在后续的insert语句中,对目标表中char和varchar类型的列插入超长字符串时,会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。保证数据都能插入目标表中,而不是报错。

  • 超长字符串自动截断功能不适用于insert语句包含外表的场景。
  • 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。

参数类型:USERSET

取值范围:布尔型

  • on表示启动超长字符串自动截断功能。
  • off表示停止超长字符串自动截断功能。

默认值:off

behavior_compat_options

参数说明:数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。

参数类型:USERSET

取值范围:字符串

默认值:升级场景下保持前向兼容,即与升级前的集群中该参数的默认值保持一致。新安装集群场景下,该参数默认值为check_function_conflicts,以防止用户定义错误的函数属性导致严重的问题。

  • 当前只支持表1
  • 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:
    1
    set behavior_compat_options='end_month_calculate,display_leading_zero';
    
  • 此参数选项中strict_concat_functions和strict_text_concat_td不能同时设置。
表1 兼容性配置项

兼容性配置项

兼容性行为控制

适用兼容模式

display_leading_zero

浮点数显示配置项。

  • 不设置此配置项时,对于-1~0和0~1之间的小数,不显示小数点前的0。比如,0.25显示为.25。
  • 设置此配置项时,对于-1~0和0~1之间的小数,显示小数点前的0。比如,0.25显示为0.25。
例如,某数据迁移场景中,在导入时若未设置该参数,浮点数显示或者转为字符串的时候,缺少前面的0,导致出现类似如下报错。
1
2
ERROR: xxx invalid input syntax for type xxx
DETAIL: Token "." is invalid

ORA

TD

end_month_calculate

add_months函数计算逻辑配置项。

假定函数add_months的两个参数分别为param1和param2,param1的月份和param2的月份和为result。

  • 不设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期小,计算结果中的日期字段(Day字段)和param1的日期字段保持一致。比如,
1
2
3
4
5
select add_months('2018-02-28',3) from dual;
add_months
---------------------
2018-05-28 00:00:00
(1 row)
  • 设置此配置项时,如果param1的日期(Day字段)为月末,并且param1的日期(Day字段)比result月份的月末日期比小,计算结果中的日期字段(Day字段)和result的月末日期保持一致。比如,
1
2
3
4
5
select add_months('2018-02-28',3) from dual;
add_months
---------------------
2018-05-31 00:00:00
(1 row)

ORA

TD

compat_analyze_sample

analyze采样行为配置项。

设置此配置项时,会优化analyze的采样行为,主要体现在analyze时全局采样会更精确的控制在3万条左右,更好的控制analyze时Coordinator端的内存消耗,保证analyze性能的稳定性。

ORA

TD

MySQL

bind_schema_tablespace

绑定模式与同名表空间配置项。

如果存在与模式名sche_name相同的表空间名,那么如果设置search_path为sche_name, default_tablespace也会同步切换到sche_name。

ORA

TD

MySQL

bind_procedure_searchpath

未指定模式名的数据库对象的搜索路径配置项。

在存储过程中如果不显示指定模式名,会优先在存储过程所属的模式下搜索。

如果找不到,则有两种情况:

  • 若不设置此参数,报错退出。
  • 若设置此参数,按照search_path中指定的顺序继续搜索。如果还是找不到,报错退出。

ORA

TD

MySQL

correct_to_number

控制to_number()结果兼容性的配置项。

若设置此配置项,则to_number()函数结果与PG11保持一致,否则默认与Oracle保持一致。

ORA

unbind_divide_bound

控制对整数除法的结果进行范围校验。

  • 不设置此配置项时,将对除法结果进行校验,超出范围则报错。例如,示例中INT_MIN/(-1)会因为超过结果大于INT_MAX而报越界错误:
1
2
SELECT (-2147483648)::int / (-1)::int;
ERROR:  integer out of range
  • 若设置此配置项,则不需要对除法结果进行范围校验。例如,示例中INT_MIN/(-1)可以得到输出结果INT_MAX+1:
1
2
3
4
5
SELECT (-2147483648)::int / (-1)::int;
  ?column?
------------
 2147483648
(1 row)

ORA

TD

merge_update_multi

控制行存表merge into匹配多行时是否进行update操作。

若设置此配置项,匹配多行时update不报错,否则默认与Oracle保持一致,报错。

ORA

TD

disable_row_update_multi

控制行存表update匹配多行时是否进行update操作。

若设置此配置项,匹配多行时update报错,否则默认可以进行多行匹配更新。

ORA

TD

return_null_string

控制函数lpad()、rpad()、repeat()、regexp_split_to_table()和split_part()的结果为空字符串''的显示配置项。

  • 不设置此配置项时,空字符串显示为NULL。
1
2
3
4
5
select length(lpad('123',0,'*')) from dual;
length
--------

(1 row)
  • 设置此配置项时,空字符串显示为''。
1
2
3
4
5
select length(lpad('123',0,'*')) from dual;
length
--------
0
(1 row)

ORA

compat_concat_variadic

控制函数concat()和concat_ws()对variadic类型结果兼容性的配置项。

若设置此配置项,当concat函数参数为variadic类型时,保留Oracle和Teradata兼容模式下不同的结果形式;否则默认Oracle和Teradata兼容模式下结果相同,且与Oracle保持一致。

ORA

TD

convert_string_digit_to_numeric

控制CHAR类型和INT类型进行二元BOOL运算时类型转换优先级的配置项。

  • 不设置此配置项时,类型转换优先级与PG9.6一致。
  • 设置此配置项时,所有CHAR类型和INT类型的二元BOOL运算均强制转换为NUMERIC类型进行计算。

    设置此配置项后会被影响的CHAR类型包括BPCHAR、VARCHAR、NVARCHAR2、TEXT四种类型,会被影响的INT类型包括INT1、INT2、INT4、INT8四种类型。

注意:

此配置项只对二元BOOL运算生效,例如,INT2>TEXT、INT4=BPCHAR,非BOOL运算不会受到影响,该配置项暂不支持INT>'1.1'这类UNKNOWN类型运算的转换。由于该配置项开启后,CHAR类型与INT类型的BOOL运算会优先转换为NUMERIC类型进行计算,因此会影响数据库计算性能,当JOIN列为受影响的类型组合时,还会影响执行计划。

ORA

TD

MySQL

check_function_conflicts

控制是否检查自定义plpgsql/SQL函数的属性。

  • 不设置此配置项时,不检查自定义函数的IMMUTABLE/STABLE/VOLATILE属性。
  • 设置此配置项时,会检查自定义函数的IMMUTABLE属性,如果函数中含有表,或者是有STABLE/VOLATILE函数时,在执行时会报错。因为函数中如果有表或者STABLE/VOLATILE函数时,与函数定义中的IMMUTABLE属性冲突,即这种场景下,函数的行为非IMMUTABLE。

例如:设置此参数时,以下场景下会执行报错:

1
2
3
4
5
6
7
8
9
CREATE OR replace FUNCTION sql_immutable (INTEGER)
RETURNS INTEGER AS 'SELECT a+$1 from shipping_schema.t4 where a=1;'
LANGUAGE SQL IMMUTABLE
RETURNS NULL
ON NULL INPUT;
select sql_immutable(1);
ERROR:  IMMUTABLE function cannot contain SQL statements with relation or Non-IMMUTABLE function.
CONTEXT:  SQL function "sql_immutable" during startup
referenced column: sql_immutable

ORA

TD

MySQL

varray_verification

控制是否校验数组长度以及数组类型长度。用于兼容GaussDB(DWS) 8.1.0之前的版本。

若设置此配置项,不会校验数组长度以及数组类型长度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
-- 场景1
CREATE OR REPLACE PROCEDURE varray_verification 
AS 
    TYPE org_varray_type IS varray(5) OF VARCHAR2(2); 
    v_org_varray org_varray_type; 
BEGIN 
    v_org_varray(1) := '111'; --例如赋值已经超过了VARCHAR2(2)的限制,配置该选项后将和历史版本保持一致不进行校验
END; 
/ 
--场景2
CREATE OR REPLACE PROCEDURE varray_verification_i3_1 
AS 
    TYPE org_varray_type IS varray(2) OF NUMBER(2); 
    v_org_varray org_varray_type; 
BEGIN 
    v_org_varray(3) := 1; --例如赋值已经超过了varray(2)的数组长度限制,配置该选项后将和历史版本保持一致不进行校验
END; 
/ 

ORA

TD

strict_concat_functions

控制函数textanycat()和anytextcat()在参数存在空值时,对返回值兼容性的配置项。此参数不能和strict_text_concat_td同时设置。

MySQL兼容模式下,此参数无影响。

  • 不设置此配置项时,函数textanycat()和anytextcat()的返回值默认与Oracle保持一致。
  • 设置此配置项时,若函数textanycat()和anytextcat()的参数存在空值,则返回值也为空值,保留与Oracle和Teradata兼容模式下不同的结果。

例如,不设置此配置项时,函数textanycat()和anytextcat()的返回值与Oracle保持一致:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT textanycat('gauss', cast(NULL as BOOLEAN));
 textanycat
------------
 gauss
(1 row)

SELECT 'gauss' || cast(NULL as BOOLEAN); --这种情况下,||运算符会被转换为函数textanycat
 ?column?
----------
 gauss
(1 row)

设置此配置项时,保留与Oracle和Teradata兼容模式下不同的结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT textanycat('gauss', cast(NULL as BOOLEAN));
 textanycat
------------

(1 row)

SELECT 'gauss' || cast(NULL as BOOLEAN); --这种情况下,||运算符会被转换为函数textanycat
 ?column?
----------

(1 row)

ORA

TD

strict_text_concat_td

Teradata兼容模式下,控制函数textcat()、textanycat()和anytextcat()在参数存在空值时,对返回值兼容性的配置项。此参数不能和strict_concat_functions同时设置。

  • 不设置此配置项时,Teradata兼容模式下函数textcat()、textanycat()和anytextcat()的返回值与GaussDB(DWS)一致。
  • 设置此配置项时,若Teradata兼容模式下函数textcat()、textanycat()和anytextcat()的参数存在空值,则返回值为空值。

例如,不设置此配置项时,函数textcat()、textanycat()和anytextcat()的返回值与GaussDB(DWS)保持一致:

1
2
3
4
5
td_compatibility_db=# SELECT textcat('abc', NULL);
textcat
---------
abc
(1 row)
1
2
3
4
5
td_compatibility_db=# SELECT 'abc' || NULL; --这种情况下,||运算符会被转换为函数textcat()
?column?
----------
abc
(1 row)

设置此配置项时,若函数textcat()、textanycat()和anytextcat()的返回值有空值,则返回NULL:

1
2
3
4
5
td_compatibility_db=# SELECT textcat('abc', NULL);
textcat
---------

(1 row)
1
2
3
4
5
td_compatibility_db=# SELECT 'abc' || NULL;
?column?
----------

(1 row)

TD

compat_display_ref_table

设置视图中列的显示格式。

  • 不设置该选项时默认带前缀,即tab.col的格式。
  • 设置该选项时与原始定义一致,原始定义带前缀则显示,否则不显示。
1
2
3
4
5
6
7
SET behavior_compat_options='compat_display_ref_table';
CREATE OR REPLACE VIEW viewtest2 AS SELECT a.c1, c2, a.c3, 0 AS c4 FROM viewtest_tbl a;
SELECT pg_get_viewdef('viewtest2');
pg_get_viewdef
-----------------------------------------------------
SELECT a.c1, c2, a.c3, 0 AS c4 FROM viewtest_tbl a;
(1 row)

ORA

TD

para_support_set_func

列存表中控制函数COALESCE()、NVL()、GREATEST()、LEAST()入参是否支持多结果集表达式。

  • 不设置此配置项时,函数入参包含多结果集表达式时,直接报错不支持。
1
2
SELECT COALESCE(regexp_split_to_table(c3,'#'), regexp_split_to_table(c3,'#')) FROM regexp_ext2_tb1 ORDER BY 1 LIMIT 5;
ERROR:  set-valued function called in context that cannot accept a set
  • 设置此配置项时,支持函数入参包含多结果集表达式。
1
2
3
4
5
6
7
8
9
SELECT COALESCE(regexp_split_to_table(c3,'#'), regexp_split_to_table(c3,'#')) FROM regexp_ext2_tb1 ORDER BY 1 LIMIT 5;
 coalesce
----------
 a
 a
 a
 a
 a
(5 rows)

ORA

TD

disable_select_truncate_parallel

控制分区表的truncate等ddl的锁等级。

  • 设置此配置项时,将禁止分区表的不同分区上truncate与DML(如select)的并发,允许分区表上select的FQS(快速下发)。在OLTP场景下分区表上的简单查询较多,并且没有分区表不同分区truncate与DML并发的需求,可以考虑设置此配置项。
  • 不设置此配置项时,分区表上不同分区的select与truncate可以并发进行,同时关闭分区表的FQS(快速下发)来避免可能的不一致问题。

ORA

TD

MySQL

bpchar_text_without_rtrim

Teradata兼容模式下,设置此参数时,控制bpchar到text转换保留右侧空格,如果实际长度不足bpchar指定的长度,对其进行补空格操作,兼容Teradata对bpchar字符串的处理风格。

当前不支持“比较字符串时忽略尾部空格”,拼接后结果如果存在尾部空格,进行比较时会对空格敏感。

例如,设置参数时:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
td_compatibility_db=# select length('a'::char(10)::text);
length
--------
10
(1 row)

td_compatibility_db=# select length('a'||'a'::char(10));
length
--------
11
(1 row)

TD

convert_empty_str_to_null_td

Teradata兼容模式下,设置此参数时,控制to_date, to_timestamp和to_number类型转换函数处理空串时,返回null;同时控制to_char函数处理date类型入参时返回的格式。

例如:

未设置此参数时:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
td_compatibility_db=# select to_number('');
 to_number 
-----------
         0
(1 row)

td_compatibility_db=# select to_date('');
ERROR:  the format is not correct
DETAIL:  invalid date length "0", must between 8 and 10.
CONTEXT:  referenced column: to_date

td_compatibility_db=# select to_timestamp('');
      to_timestamp
------------------------
 0001-01-01 00:00:00 BC
(1 row)

td_compatibility_db=# select to_char(date '2020-11-16');
        to_char         
------------------------
 2020-11-16 00:00:00+08
(1 row)

设置此参数,若to_number, to_date, to_timestamp函数的参数有空串时:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
td_compatibility_db=# select to_number('');
 to_number 
-----------

(1 row)

td_compatibility_db=# select to_date('');
 to_date 
---------

(1 row)

td_compatibility_db=# select to_timestamp('');
 to_timestamp
--------------

(1 row)

td_compatibility_db=# select to_char(date '2020-11-16');
  to_char   
------------
 2020/11/16
(1 row)

TD

disable_case_specific

控制字符类型匹配时是否忽略大小写。仅在Teradata兼容模式下生效。

  • 不设置此配置项时,字符类型匹配时,字符的大小写敏感。
  • 设置此配置项时,字符类型匹配时,字符的大小写不敏感。

设置此配置项后会影响的字符类型包括CHAR、TEXT、BPCHAR、VARCHAR、NVARCHAR五种类型,会被影响的操作符包括<、>、=、>=、<=、!=、<>、!=、like、not like、in、not in共12种操作符以及case when、decode 表达式。

注意:

由于该配置项开启后,字符类型前会增加UPPER函数进而会影响估算逻辑,需要使用增强的估算模型。(建议设置:cost_param=16、cost_model_version = 1、join_num_distinct=-20、qual_num_distinct=200)

TD

enable_interval_to_text

控制interval到text类型的隐式转换功能。

  • 设置此选项时,支持interval类型到text类型的隐式转换。
    1
    2
    3
    4
    5
    SELECT TO_DATE('20200923', 'yyyymmdd') - TO_DATE('20200920', 'yyyymmdd') = '3'::text;
    ?column?
    ----------
    f
    (1 row)
    
  • 不设置此选项时,不支持interval类型到text类型的隐式转换。
    1
    2
    3
    4
    5
    SELECT TO_DATE('20200923', 'yyyymmdd') - TO_DATE('20200920', 'yyyymmdd') = '3'::text;
    ?column?
    ----------
    t
    (1 row)
    

ORA

TD

MySQL

case_insensitive

MySQL兼容模式下,设置此参数,控制locate,strpos,instr字符串函数入参大小写不敏感。

目前默认未设置该参数,即入参大小写敏感。

例如:

  • 未设置此选项时,入参大小写敏感。
    1
    2
    3
    4
    5
    mysql_compatibility_db=# SELECT LOCATE('sub', 'Substr');
     locate
    --------
          0
    (1 row)
    
  • 设置此选项时,入参大小写不敏感。
    1
    2
    3
    4
    5
    mysql_compatibility_db=# SELECT LOCATE('sub', 'Substr');
     locate
    --------
          1
    (1 row)
    

MySQL

inherit_not_null_strict_func

控制函数原有的strict属性,参数为1个的函数可以传递NOT NULL属性的行为。即:对于func(x),如果func()为strict属性,且x包含NOT NULL约束,则认为func(x)也是包含NOT NULL约束的。

该兼容配置项在某些优化场景,例如:NOT IN优化、COUNT(DISTINCT)优化,会有特定的优化效果,但特定场景可能导致结果错误。

目前默认未设置该参数,保证结果正确,但可能导致性能回退,如果出现问题可设置该参数回退到历史版本行为。

ORA

TD

MySQL

disable_compat_minmax_expr_mysql

MySQL兼容模式下,控制greatest/least表达式对null入参的处理方式。

默认兼容MySQL。可通过设置此参数,回退到历史版本行为。

  • 不设置此选项时,兼容MySQL行为,入参为null时返回null。
    1
    2
    3
    4
    5
    mysql_compatibility_db=# SELECT greatest(1, 2, null), least(1, 2, null);
     greatest | least
    ----------+-------
              |
    (1 row)
    
  • 设置此选项时,返回非null参数中的最大/小值。
    1
    2
    3
    4
    5
    mysql_compatibility_db=# SELECT greatest(1, 2, null), least(1, 2, null);
     greatest | least
    ----------+-------
            2 |     1
    (1 row)
    

MySQL

disable_compat_substr_mysql

MySQL兼容模式下,控制substr/substring函数在起始位置pos <= 0时的行为。

默认兼容MySQL。可通过设置此参数,回退到历史版本行为。

  • 不设置此选项时,兼容MySQL行为,即pos = 0时返回空串,pos < 0时从倒数第 |pos| 个位置开始截取字符。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    mysql_compatibility_db=# SELECT substr('helloworld',0);
     substr
    --------
    
    (1 row)
    mysql_compatibility_db=# SELECT substring('helloworld',0),substring('helloworld',-2,4);
     substring | substring
    -----------+-----------
               | ld
    (1 row)
    
  • 设置此选项时,pos <= 0时仍然从左侧开始截取字符。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    mysql_compatibility_db=# SELECT substr('helloworld',0);
       substr
    ------------
     helloworld
    (1 row)
    mysql_compatibility_db=# SELECT substring('helloworld',0),substring('helloworld',-2,4);
     substring  | substring
    ------------+-----------
     helloworld | h
    (1 row)
    

MySQL

disable_compat_trim_mysql

MySQL兼容模式下,控制trim/ltrim/rtrim函数对入参的处理方式。

默认兼容MySQL。可通过设置此参数,回退到历史版本行为。

  • 不设置此选项时,兼容MySQL行为,匹配完整子串。
    1
    2
    3
    4
    5
    mysql_compatibility_db=# SELECT trim('{}{name}{}','{}'),trim('xyznamezyx','xyz');
     btrim  |  btrim
    --------+---------
     {name} | namezyx
    (1 row)
    
  • 设置此选项时,匹配字符集合中的单个字符。
    1
    2
    3
    4
    5
    mysql_compatibility_db=# SELECT trim('{}{name}{}','{}'),trim('xyznamezyx','xyz');
     btrim | btrim
    -------+-------
     name  | name
    (1 row)
    

MySQL

light_object_mtime

控制pg_object系统表mtime字段是否会记录对象行为的操作。

  • 设置此选项时,GRANT/REVOKE/TRUNCATE操作不被mtime记录即不更新mtime字段。
  • 不设置此选项时(默认行为),ALTER操作、COMMENT、GRANT/REVOKE和TRUNCATE均会被mtime记录即更新mtime字段。

ORA

TD

MySQL

disable_including_all_mysql

MySQL兼容模式下,控制CREATE TABLE ... LIKE语法是否为INCLUDING_ALL模式。

默认不设置此参数,即MySQL兼容模式下,CREATE TABLE ... LIKE语法默认为INCLUDING_ALL模式。

可通过设置此参数,回退到历史版本行为。

  • 不设置此选项,MySQL兼容模式下,CREATE TABLE ... LIKE语法为INCLUDING_ALL模式。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    mysql_compatibility_db=# CREATE TABLE mysql_like(id int, name varchar(10), score int) DISTRIBUTE BY hash(id) COMMENT 'mysql_like';
    CREATE TABLE
    mysql_compatibility_db=# CREATE INDEX index_like ON mysql_like(name);
    CREATE INDEX
    mysql_compatibility_db=# \d+ mysql_like;
                                 Table "public.mysql_like"
     Column |         Type          | Modifiers | Storage  | Stats target | Description
    --------+-----------------------+-----------+----------+--------------+-------------
     id     | integer               |           | plain    |              |
     name   | character varying(10) |           | extended |              |
     score  | integer               |           | plain    |              |
    Indexes:
        "index_like" btree (name) TABLESPACE pg_default
    Has OIDs: no
    Distribute By: HASH(id)
    Location Nodes: ALL DATANODES
    Options: orientation=row, compression=no
    
    mysql_compatibility_db=# CREATE TABLE copy_like like mysql_like;
    CREATE TABLE
    mysql_compatibility_db=# \d+ copy_like;
                                  Table "public.copy_like"
     Column |         Type          | Modifiers | Storage  | Stats target | Description
    --------+-----------------------+-----------+----------+--------------+-------------
     id     | integer               |           | plain    |              |
     name   | character varying(10) |           | extended |              |
     score  | integer               |           | plain    |              |
    Indexes:
        "copy_like_name_idx" btree (name) TABLESPACE pg_default
    Has OIDs: no
    Distribute By: HASH(id)
    Location Nodes: ALL DATANODES
    Options: orientation=row, compression=no
    
  • 设置此选项,MySQL兼容模式下,CREATE TABLE ... LIKE语法为空模式。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    mysql_compatibility_db=# SET behavior_compat_options = 'disable_including_all_mysql';
    SET
    mysql_compatibility_db=# CREATE TABLE mysql_copy LIKE mysql_like;
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default.
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    CREATE TABLE
    mysql_db=# \d+ mysql_copy;
                                 Table "public.mysql_copy"
     Column |         Type          | Modifiers | Storage  | Stats target | Description
    --------+-----------------------+-----------+----------+--------------+-------------
     id     | integer               |           | plain    |              |
     name   | character varying(10) |           | extended |              |
     score  | integer               |           | plain    |              |
    Has OIDs: no
    Distribute By: ROUND ROBIN
    Location Nodes: ALL DATANODES
    Options: orientation=row, compression=no
    

MySQL

cte_onetime_inline

控制非stream计划是否执行inline。

  • 设置此选项时,非stream计划且只被引用一次的CTE执行inline。
  • 不设置此选项时,非stream计划且只被引用一次的CTE不执行inline。

ORA

TD

MySQL

skip_first_after_mysql

MySQL兼容模式下,控制是否在ALTER TABLE ADD/MODIFY/CHANGE COLUMN中忽略FIRST/AFTER colname语法。

  • 设置此选项时,将忽略FIRST/AFTER colname语法,执行不报错。
    1
    2
    3
    mysql_compatibility_db=# SET behavior_compat_options = 'skip_first_after_mysql';
    mysql_compatibility_db=# ALTER TABLE t1 ADD COLUMN b text after a;
    ALTER TABLE
    
  • 不设置此选项时,将不支持FIRST/AFTER colname语法,执行报错。
    1
    2
    3
    mysql_compatibility_db=# SET behavior_compat_options = '';
    mysql_compatibility_db=# ALTER TABLE t1 ADD COLUMN b text after a;
    ERROR:  FIRST/AFTER is not yet supported.
    

MySQL

enable_division_by_zero_mysql

MySQL兼容模式下,除数为0时,控制除法或取余操作是否报错。(该配置项仅8.1.3.110及以上集群版本支持。)

  • 设置此选项时,除法或取余操作除数为0时,返回NULL。
    1
    2
    3
    4
    5
    6
    7
    compatible_mysql_db=# SET behavior_compat_options = 'enable_division_by_zero_mysql';
    SET
    compatible_mysql_db=# SELECT 1/0 AS test;
     test 
    ----------
             
    (1 row)
    
  • 不设置此选项时,除法或取余操作除数为0时,执行报错。
    1
    2
    compatible_mysql_db=# SELECT 1/0;
    ERROR:  division by zero
    

MySQL

normal_session_id

控制是否生成normal格式的会话ID。

  • 设置此选项时,生成normal格式的会话ID,兼容8.1.3及之前集群版本的会话ID。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options='normal_session_id';
    SELECT pg_current_sessionid();
        pg_current_sessionid
    ----------------------------
     1660268184.140594655524608
    (1 row)
    
  • 不设置此选项时,生成pretty格式的会话ID。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options='';
    SELECT pg_current_sessionid();
              pg_current_sessionid
    -----------------------------------------
     1660268184.140594655524608.coordinator1
    (1 row)
    

ORA

TD

MySQL

disable_jsonb_exact_match

控制操作符匹配规则,在对二元操作符进行模糊匹配时是否考虑jsonb类型。(该参数仅8.2.0及以上集群版本支持)

  • 设置此选项时,当对操作符进行模糊匹配时,会在所有备选(即不区分jsonb类型)中匹配,兼容8.1.1到8.1.3集群版本的匹配规则。
    1
    2
    3
    SET behavior_compat_options='disable_jsonb_exact_match';
    select '2022' - '2'::text;
    ERROR:  cannot delete from scalar
    
  • 不设置此选项时,当对操作符进行模糊匹配时,会在不含jsonb类型的备选中匹配,兼容8.1.1之前集群版本的匹配规则。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options='';
    select '2022' - '2'::text;
     ?column? 
    ----------
         2020
    (1 row)
    

ORA

TD

MySQL

merge_into_with_trigger

控制是否支持对有触发器的表执行MERGE INTO操作。(该参数仅8.1.3.200及以上集群版本支持)

  • 设置此选项时,可以对有触发器的表执行MERGE INTO操作。注意在MERGE INTO操作执行时,表上的触发器不会被触发执行。
  • 不设置此选项时,对有触发器的表执行MERGE INTO操作时报错。

ORA

TD

MySQL

add_column_default_v_func

控制alter table add column default expression中expression是否支持volatile类型的函数。(该参数仅8.1.3.200及以上集群版本支持).

  • 设置此选项时,alter table add column default expression中的expression支持volatile类型的函数。
  • 不设置此选项时,alter table add column default expression中expression不支持volatile类型的函数,如果expression中有volatile的函数,该语句执行会报错。

ORA

TD

MySQL

disable_full_group_by_mysql

MySQL兼容模式下,控制查询中GROUP BY后是否可以不体现任何非聚合函数查询字段。(该参数仅8.2.0.101及以上集群版本支持)

  • 设置此选项时,查询允许GROUP BY后不体现任何非聚合函数查询字段。
    1
    2
    3
    4
    5
    6
    7
    SET behavior_compat_options='disable_full_group_by_mysql';
    SELECT a,b FROM t1 GROUP BY a;
     a | b
    ---+---
     1 | 1
     2 | 2
    (2 rows)
    
  • 不设置此选项时,查询不允许GROUP BY后不体现任何非聚合函数查询字段,查询报错。
    1
    2
    3
    4
    SET behavior_compat_options='';
    SELECT a,b FROM t1 GROUP BY a;
    ERROR:  column "t1.b" must appear in the GROUP BY clause or be used in an aggregate function
    LINE 1: SELECT a,b FROM t1 GROUP BY a;
    
注意:

该参数需结合full_group_by_mode使用,具体请参考full_group_by_mode

此配置项配置后,若full_group_by_mode为notpadding,对于非GROUP BY后非聚合查询字段需要保证分组后数据一致,否则该列将为随机值。

MySQL

disable_gc_fdw_filter_partial_pushdown

协同分析外表(类型为gc_fdw)场景下,控制使用过滤条件查询外表数据时过滤条件的下推情况。(该参数仅8.2.1及以上集群版本支持)

  • 设置此选项时,过滤条件中若存在不满足下推条件的因素(如非immutable函数),为了保证结果集文档,则全部过滤条件不下推,此行为兼容8.2.1版本之前的行为。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    --源端集群建表
    CREATE TABLE t1(c1 INT, c2 INT, c3 INT) DISTRIBUTE BY HASH(c1);
    --本地集群建相同结构外表
    CREATE SERVER server_remote FOREIGN DATA WRAPPER gc_fdw options(ADDRESS 'address', DBNAME 'dbname', USERNAME 'username', PASSWORD 'password');
    CREATE FOREIGN TABLE t1(c1 INT, c2 INT, c3 INT) SERVER server_remote;
    --打开参数时,条件下推情况
    SET behavior_compat_options = 'disable_gc_fdw_filter_partial_pushdown';
    EXPLAIN (verbose on,costs off) SELECt * FROM t1 WHERE c1>3 AND c2 <100 AND now() - '20230101' < c3;
                                                                            QUERY PLAN                                                                        
    ----------------------------------------------------------------------------------------------------------------------------------------------------------
     Streaming (type: GATHER)
       Output: c1, c2, c3
       Node/s: All datanodes
       ->  Foreign Scan on ca_schema.t1
             Output: c1, c2, c3
             Filter: ((t1.c1 > 3) AND (t1.c2 < 100) AND ((now() - '2023-01-01 00:00:00-08'::timestamp with time zone) < (t1.c3)::interval))
             Remote SQL: SELECT c1, c2, c3 FROM ca_schema.t1
    (7 rows)
    
  • 不设置此选项时,过滤条件中可下推的部分将下推到源端集群执行,不可下推部分将在本地集群执行,如此可提升外表查询效率。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    --关闭参数时,条件下推情况
    SET behavior_compat_options = '';
    EXPLAIN (verbose on,costs off) SELECT * FROM t1 WHERE c1>3 AND c2 <100 AND now() - '20230101' < c3;
                                                    QUERY PLAN                                                
    ----------------------------------------------------------------------------------------------------------
     Streaming (type: GATHER)
       Output: c1, c2, c3
       Node/s: All datanodes
       ->  Foreign Scan on ca_schema.t1
             Output: c1, c2, c3
             Filter: ((now() - '2023-01-01 00:00:00-08'::timestamp with time zone) < (t1.c3)::interval)
             Remote SQL: SELECT c1, c2, c3 FROM ca_schema.t1 WHERE ((c1 > 3)) AND ((c2 < 100))
    (7 rows)
    

ORA

TD

MySQL

ignore_unshipped_concurrent_update

并发更新场景下,当前会话的语句不下推时,如果更新的元组被其它会话更新成新元组后,控制当前会话执行UPDATE/DELETE语句时是否忽略处理新的元组。默认不再处理新的元组。(该参数仅8.2.1及以上集群版本支持)

  • 设置此选项时,当前会话执行UPDATE/DELETE语句时忽略处理新的元组,当前UPDATE/DELETE语句执行成功,此行为会导致并发更新场景数据不一致。此行为兼容8.2.1版本之前的行为。
  • 不设置此选项时,当前会话执行UPDATE/DELETE语句检测元组已被更新时,会重新执行当前会话的UPDATE/DELETE语句,以保证数据一致性。语句执行重试次数受max_query_retry_times参数控制。

ORA

TD

MySQL

disable_set_global_var_on_datanode

控制set_config函数是否可以在DN上设置全局变量。(该参数仅8.2.1及以上集群版本支持)

  • 设置此选项时,禁止set_config函数在DN上设置全局变量。此行为默认兼容8.2.1版本之前的行为。
  • 不设置此选项时,允许set_config函数在DN上设置全局变量,这将会使得CN与DN上全局变量值不一致,导致read_global_var函数下推时可能出错。

ORA

TD

MySQL

variadic_null_check

控制variadic参数是否能传入NULL参数的选项,默认不开启。(该参数仅8.2.1.300及以上集群版本支持)

  • 设置此选项时,禁止variadic传入NULL参数,传入后会报错。
    1
    2
    3
    4
    SET behavior_compat_options = 'variadic_null_check';
    
    SELECT format ( 'array', VARIADIC NULL);
    ERROR:  VARIADIC parameter must be an array
    
    说明:

    为了兼容mysql,compat_concat_variadic开启时,对concat函数和concat_ws函数不会生效,仍然可以传入NULL参数。

  • 不设置此选项时,允许variadic传入NULL参数。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options = '';
    SELECT format ( 'array', VARIADIC NULL);
     format
    --------
     array
    (1 row)
    

ORA

TD

MySQL

enable_use_syscol_in_replicate_table

控制复制表在INSERT、UPDATE、MERGE INTO和DELETE时是否可以采用oid/ctid/tableoid/xc_node_id作为过滤条件、连接条件和having条件。该选项默认不设置。该选项仅8.2.1.200及以上集群版本支持。

  • 不设置该选项时,如果复制表在INSERT、UPDATE、MERGE INTO和DELETE时采用oid/ctid/tableoid/xc_node_id作为过滤条件、连接条件和having条件,会报如下错误:
    1
    ERROR:  Can not use system column oid/ctid/tableoid/xc_node_id in Replication Table.
    
  • 设置该选项时,可在复制表中使用系统列id/ctid/tableoid/xc_node_id进行INSERT、UPDATE、MERGE INTO和DELETE。
    注意:

    复制表在INSERT、UPDATE、MERGE INTO和DELETE时采用oid/ctid/tableoid/xc_node_id作为过滤条件、连接条件和having条件,语句有导致集群core的风险,请慎重考虑配置该选项。

ORA

TD

MYSQL

enable_force_add_batch

当参数support_batch_bind设置为on且参数enable_fast_query_shipping和enable_light_proxy设置设置off时,该选项控制GaussDB(DWS)是否接受addbatch模式的U报文。该选项默认不设置。该选项仅8.2.1.200及以上集群版本支持。

  • 当参数support_batch_bind设置为on且参数enable_fast_query_shipping和enable_light_proxy设置设置off,不设置该选项时,GaussDB(DWS)不再接收addbatch模式的U报文。
  • 当参数support_batch_bind设置为on且参数enable_fast_query_shipping和enable_light_proxy设置设置off,设置该选项时,GaussDB(DWS)接收addbatch模式的U报文。但是入库速度较慢,有内存不足风险,需谨慎设置该选项。

ORA

TD

MYSQL

disable_mergesort_without_material

控制当前stream片段是否含有物化算子时stream算子采用merge sort。该选项仅8.2.1.100及以上集群版本支持。

  • 设置此选项时,若当前stream片段含有物化算子(material、sort、agg、CteScan),则可采用merge sort,否则不可采用merge sort。
  • 不设置此选项时,是否采用merge sort不需要判断当前stream片段是否含有物化算子。

ORA

TD

MYSQL

enable_pushdown_groupingset_subquery

当子查询中含有grouping set时,该选项控制是否可将外层查询中仅与该子查询相关的条件下推到子查询中。该选项仅8.2.1.100及以上集群版本支持。

  • 当子查询中含有grouping set时,设置此选项,则不可将外层查询的条件下推到子查询中。
  • 当子查询中含有grouping set时,不设置此选项,则将外层查询的条件下推到子查询中。

ORA

TD

MYSQL

enable_whole_row_var

该参数主要涉及两个场景。1. 控制是否允许表或视图出现在SQL表达式中,包括但不限于查询的目标列表、GROUP BY列表等;2. 控制是否允许非表的record出现的SQL表达式。该选项仅8.3.0及以上集群版本支持。

  • 设置此选项时,允许表或视图出现在SQL表达式中。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    SET behavior_compat_options = 'enable_whole_row_var';
    SELECT a1 FROM t a1;
     a1
    ----
    (0 rows)
    SELECT t FROM (SELECT 1) as t;
      t
    -----
     (1)
    (1 rows)
    
  • 不设置此选项时,不允许表或视图出现在SQL表达式中,如果SQL中出现则报错。
    1
    2
    3
    4
    5
    SET behavior_compat_options = '';
    SELECT a1 FROM t a1;
    ERROR:  Table or view cannot appear in expression. Table/view name: t, alias: a1. Please check targetList, groupClause etc.
    SELECT t FROM (SELECT 1) as t;
    ERROR:  Non-table records cannot appear in expression. alias: t. Please check targetList, groupClause etc.
    

ORA

TD

MYSQL

enable_unknown_datatype

控制是否允许创建含有unknown类型列的表。该选项仅8.3.0及以上集群版本支持。

  • 设置此选项时,允许创建含有unknown类型列的表。
    1
    2
    3
    4
    5
    SET behavior_compat_options = 'enable_unknown_datatype';
    CREATE TABLE t(a unknown);
    WARNING:  column "a" has type "unknown"
    DETAIL:  Proceeding with relation creation anyway.
    CREATE TABLE
    
  • 不设置此选项时,不允许创建含有unknown类型列的表,如果建表SQL含有unknown列,则报错。
    1
    2
    3
    SET behavior_compat_options = '';
    create table t(a unknown);
    ERROR:  column "a" has type "unknown"
    

ORA

TD

MYSQL

alter_distribute_key_by_partition

控制ALTER TABLE修改分区表分布列时INSERT INTO是否按分区执行。

  • 设置此选项时,按分区执行INSERT INTO,使用内存降低但性能劣化。
  • 不设置此选项时,将分区表整表进行INSERT INTO,性能较好但使用内存较多。

ORA

TD

MYSQL

disable_update_returning_check

控制是否禁用涉及到多表关联,更新复制表且带returning语句场景。该选项仅8.3.0及以上集群版本支持。

  • 不设置此选项时,更新复制表且带returning语句场景,若涉及到多表关联,则报下述错误:
    1
    ERROR: Unsupported FOR UPDATE replicated table joined with other table.
    
  • 设置此选项,与旧版本前向兼容,但是在更新复制表且带returning语句场景,若涉及到多表关联,存在结果集不一致问题。

ORA

TD

MYSQL

check_function_shippable

控制是否检查自定义plpgsql/SQL函数的属性。该选项仅8.3.0及以上集群版本支持。

  • 不设置此配置项时,不检查自定义函数的IMMUTABLE/STABLE/VOLATILE属性。
  • 设置此配置项时,会遵循以下逻辑检查自定义函数的IMMUTABLE/STABLE/VOLATILE属性:
    • 设置白名单:对于DBMS_OUTPUT的3个函数,跳过check_function_shippable的检测
    • 如果自定义函数内部有DML语句,外层是IMMUTABLE或者SHIPPABLE,均是下推,故报错。
    • 如果自定义函数外层是shippable,内层是immutable,则通过检查。
    • 如果自定义函数外层是shippable,内层是非immutable且内层是shippable,则通过检查。
    • 如果函数外层是shippable,但是内层非上述的情况,则报错。

例如:设置此参数时,以下场景下会执行报错:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
CREATE OR replace function func_ship(a int)
returns int
LANGUAGE plpgsql
NOT FENCED  SHIPPABLE
AS $function$
begin
perform test_ship();
return a;
EXCEPTION WHEN OTHERS THEN
return a;
end $function$;
select func_ship(a) from tt3;
ERROR:  parent function is shippable but child is not immutable or shippable.

ORA

TD

MYSQL

enable_full_string_agg

控制string_agg(a, delimeter) over (partition by b order by c)场景行为,采用窗口内的全量聚合逻辑还是增量聚合逻辑。该参数8.3.0及以上集群版本支持。

不设置此选项时,采用增量聚合逻辑。设置此选项时,采用窗口内的全量聚合逻辑。默认不设置此选项。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE string_agg_dn_col(c1 int, c2 text) WITH(orientation = column) distribute by hash(c1); 
INSERT INTO string_agg_dn_col values(1, 'test'); 
INSERT INTO string_agg_dn_col values(1, 'haidian');
INSERT INTO string_agg_dn_col values(1, 'nanjing');
SELECT t.c1 AS c1, string_agg(t.c2, ',') OVER(PARTITION BY t.c1 ORDER BY t.c2) AS c2 FROM string_agg_dn_col t ORDER BY c2;
 c1 |          c2          
----+----------------------
  1 | haidian
  1 | haidian,nanjing
  1 | haidian,nanjing,test
(3 rows)

SET behavior_compat_options='enable_full_string_agg';
SELECT t.c1 AS c1, string_agg(t.c2, ',') OVER(PARTITION BY t.c1 ORDER BY t.c2) AS c2 FROM string_agg_dn_col t ORDER BY c2;
 c1 |          c2          
----+----------------------
  1 | haidian,nanjing,test
  1 | haidian,nanjing,test
  1 | haidian,nanjing,test
(3 rows)

ORA

TD

MYSQL

enable_banker_round

控制数值类型舍入行为使用四舍五入还是银行家算法。该选项仅8.3.0及以上集群版本支持。

受到参数控制的行为包括:

  • INSERT INTO和::xxx指定类型时自动触发的类型转换:所有整数类型(int1,int2,int4,int8)、所有任意精度类型(decimal,numeric,number)和money类型。
  • 对numeric类型的舍入和转换函数:round(xxx.xx,s),cast('xxx.xx',numeric),to_char(xxx.xx,'xxx')。
  • numeric类型的数学计算。
说明:

银行家算法舍入规则:舍入位后的值大于5时,进位;舍入位后的值小于5时,不进位;舍入位后的值等于5时,如果前一位为偶数则不进位,如果前一位为奇数则进位。

  • 设置选项时,舍入行为采用银行家算法:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SET behavior_compat_options = enable_banker_round;
SELECT 1.5::int1,1.5::int2,1.5::int4,1.5::int8,1.5::numeric(10,0),1.115::money;
 int1 | int2 | int4 | int8 | numeric | money 
------+------+------+------+---------+-------
 2    |    2 |    2 |    2 |       2 | $1.12
SELECT 0.5::int1,0.5::int2,0.5::int4,0.5::int8,0.5::numeric(10,0),1.105::money;
 int1 | int2 | int4 | int8 | numeric | money 
------+------+------+------+---------+-------
 0    |    0 |    0 |    0 |       0 | $1.10
SELECT round(1.05,1),round(1.15,1),cast('1.05',numeric(10,1)),cast('1.15',numeric(10,1)),to_char(1.05,'9D9'),to_char(1.15,'9D9');
 round | round | numeric | numeric | to_char | to_char 
-------+-------+---------+---------+---------+---------
   1.0 |   1.2 |     1.0 |     1.2 |  1.0    |  1.2
  • 不设置选项时,舍入行为采用四舍五入:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SET behavior_compat_options = '';
SELECT 1.5::int1,1.5::int2,1.5::int4,1.5::int8,1.5::numeric(10,0),1.115::money;
 int1 | int2 | int4 | int8 | numeric | money 
------+------+------+------+---------+-------
 2    |    2 |    2 |    2 |       2 | $1.12
SELECT 0.5::int1,0.5::int2,0.5::int4,0.5::int8,0.5::numeric(10,0),1.105::money;
 int1 | int2 | int4 | int8 | numeric | money 
------+------+------+------+---------+-------
 1    |    1 |    1 |    1 |       1 | $1.11
SELECT round(1.05,1),round(1.15,1),cast('1.05',numeric(10,1)),cast('1.15',numeric(10,1)),to_char(1.05,'9D9'),to_char(1.15,'9D9');
 round | round | numeric | numeric | to_char | to_char 
-------+-------+---------+---------+---------+---------
   1.1 |   1.2 |     1.1 |     1.2 |  1.1    |  1.2

ORA

TD

MYSQL

unsupported_set_function_case

控制是否支持case when条件中含有返回为多结果集函数。该选项仅8.3.0.100及以上集群版本支持。

  • 设置此选项时,列存不支持case when条件中含有返回为多结果集函数:
    CREATE TABLE t1(id int, c1 text) with(orientation=column);
    INSERT INTO t1 values(1, 'a#1');
    SET behavior_compat_options = 'unsupported_set_function_case';
    SELECT CASE split_part(regexp_split_to_table(c1, E'\,'),'#',1) when 'a' then c1 else null end from t1;
    ERROR:  set-valued function called in context that cannot accept a set
  • 不设置此选项时,列存支持case when条件中含有返回为多结果集函数:
    SET behavior_compat_options = '';
    SELECT CASE split_part(regexp_split_to_table(c1, E'\,'),'#',1) when 'a' then c1 else null end from t1;
     case
    ------
     a#1
    (1 row)

ORA

TD

MYSQL

分享:

    相关文档

    相关产品