网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts 盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts 盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务
更新时间:2025-01-23 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,check_function_shippable,unsupported_set_function_case,以防止用户定义错误的函数属性导致严重的问题。

  • 当前只支持表1
  • 配置多个兼容性配置项时,相邻配置项用逗号隔开,例如:set behavior_compat_options='end_month_calculate,display_leading_zero';
  • 此参数选项中strict_concat_functions和strict_text_concat_td不能同时设置。
  • Oracle兼容模式下不建议设置behavior_compat_options= 'return_null_string' ,如果设置了此选项,应避免将查询结果插入到表里。
表1 兼容性配置项

兼容性配置项

兼容性行为控制

适用兼容模式

display_leading_zero

浮点数显示配置项。

  • 不设置此配置项时,对于-1~0和0~1之间的小数,不显示小数点前的0。比如,0.25显示为.25。
  • 设置此配置项时,对于-1~0和0~1之间的小数,显示小数点前的0。比如,0.25显示为0.25。

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而报越界错误:
SELECT (-2147483648)::int / (-1)::int;
ERROR:  integer out of range
  • 若设置此配置项,则不需要对除法结果进行范围校验。例如,示例中INT_MIN/(-1)可以得到输出结果INT_MAX+1:
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。

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

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
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保持一致:

SELECT textanycat('gauss', cast(NULL as BOOLEAN));
 textanycat
------------
 gauss
(1 row)

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

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

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)保持一致:

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

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

td_compatibility_db=# SELECT textcat('abc', NULL);
textcat
---------

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

(1 row)

TD

compat_display_ref_table

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

  • 不设置该选项时默认带前缀,即tab.col的格式。
  • 设置该选项时与原始定义一致,原始定义带前缀则显示,否则不显示。
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字符串的处理风格。

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

例如,设置参数时:

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类型入参时返回的格式。

例如:

未设置此参数时:

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函数的参数有空串时:

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

ORA

TD

MySQL

case_insensitive

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

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

例如:

  • 未设置此选项时,入参大小写敏感。
    mysql_compatibility_db=# SELECT LOCATE('sub', 'Substr');
     locate
    --------
          0
    (1 row)
  • 设置此选项时,入参大小写不敏感。
    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。
    mysql_compatibility_db=# SELECT greatest(1, 2, null), least(1, 2, null);
     greatest | least
    ----------+-------
              |
    (1 row)
  • 设置此选项时,返回非null参数中的最大/小值。
    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| 个位置开始截取字符。
    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时仍然从左侧开始截取字符。
    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行为,匹配完整子串。
    mysql_compatibility_db=# SELECT trim('{}{name}{}','{}'),trim('xyznamezyx','xyz');
     btrim  |  btrim
    --------+---------
     {name} | namezyx
    (1 row)
  • 设置此选项时,匹配字符集合中的单个字符。
    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模式。
    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语法为空模式。
    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语法,执行不报错。
    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语法,执行报错。
    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。
    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时,执行报错。
    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类型。

  • 设置此选项时,当对操作符进行模糊匹配时,会在所有备选(即不区分jsonb类型)中匹配,兼容8.1.1之后集群版本的匹配规则。
    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操作。

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

ORA

TD

MySQL

add_column_default_v_func

控制alter table add column default expression中expression是否支持volatile类型的函数。

  • 设置此选项时,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后是否可以不体现任何非聚合函数查询字段。

  • 设置此选项时,查询允许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)场景下,控制使用过滤条件查询外表数据时过滤条件的下推情况。

  • 设置此选项时,过滤条件中若存在不满足下推条件的因素(如非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语句时是否忽略处理新的元组。默认不再处理新的元组。

  • 设置此选项时,当前会话执行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上设置全局变量。

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

ORA

TD

MySQL

variadic_null_check

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

  • 设置此选项时,禁止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条件。该选项默认不设置。

  • 不设置该选项时,如果复制表在INSERT、UPDATE、MERGE INTO和DELETE时采用oid/ctid/tableoid/xc_node_id作为过滤条件、连接条件和having条件,会报如下错误:
    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报文。该选项默认不设置。

  • 当参数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。

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

ORA

TD

MYSQL

enable_pushdown_groupingset_subquery

当子查询中含有grouping set时,该选项控制是否可将外层查询中仅与该子查询相关的条件下推到子查询中。

  • 当子查询中含有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语句场景,若涉及到多表关联,则报下述错误:
    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时,如果前一位为偶数则不进位,如果前一位为奇数则进位。

  • 设置选项时,舍入行为采用银行家算法:
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
  • 不设置选项时,舍入行为采用四舍五入:
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

create_partition_local_index

控制在分区表上默认创建的索引是全局(GLOBAL)索引还是本地(LOCAL)索引。该选项仅8.2.1.210及以上集群版本支持。

  • 不设置此选项时,在分区表上默认创建全局(GLOBAL)索引。
    SET behavior_compat_options = '';
    CREATE INDEX sale_id_idx ON sales(sale_id);
    ERROR:  partitioned table does not support global index
    HINT:  please set behavior_compat_options = 'create_partition_local_index'to create local index by default.
  • 设置此选项时,在分区表上默认创建本地(LOCAL)索引。
    SET behavior_compat_options = create_partition_local_index;
    CREATE INDEX sale_id_idx ON sales(sale_id);
    CREATE INDEX

ORA

enable_int_division_by_truncate

控制整数除法行为结果集输出整数还是浮点数,行为兼容PG或者兼容ORA。

  • 设置此选项时,整数除法结果输出整数,小数位截断,兼容PG行为。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options = 'enable_int_division_by_truncate';
    SELECT 8::int8 / 3::int8, 8::int4 / 3::int4, 8::int2 / 3::int2, 8::int1 / 3::int1;
     ?column? | ?column? | ?column? | ?column? 
    ----------+----------+----------+----------
            2 |        2 |        2 |        2
    (1 row)
    
  • 不设置此选项时,整数除法结果输出浮点数,包含小数位,兼容ORA行为。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options = '';
    SELECT 8::int8 / 3::int8, 8::int4 / 3::int4, 8::int2 / 3::int2, 8::int1 / 3::int1;
         ?column?     |     ?column?     |     ?column?     |     ?column?     
    ------------------+------------------+------------------+------------------
     2.66666666666667 | 2.66666666666667 | 2.66666666666667 | 2.66666666666667
    (1 row)
    

ORA

TD

MYSQL

select_into_allow_multi_result

控制存储过程中SELECT INTO是否允许接收多行结果或者没有结果集。

  • 不设置此选项时,存储过程中使用SELECT INTO语句插入多值或者空时,执行报错:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    CREATE TABLE PersonTmpTable (id int primary key, name varchar(64), age int, city varchar(512) default null, update_time timestamp default null);
    INSERT INTO PersonTmpTable VALUES(1,'zhangsan', 23, 'wuhan', '2022-12-10 15:39:32');
    INSERT INTO PersonTmpTable VALUE(2,'lisi', 11, 'beijing', '2022-12-13 15:39:32');
    INSERT INTO PersonTmpTable VALUE(3,'wangwu', 46, 'xian', '2022-12-1 15:39:32');
    INSERT INTO PersonTmpTable VALUE(4,'zhaoliu', 46, 'wuhan', '2022-12-31 15:39:32');
    
    SET behavior_compat_options = '';
    
    CREATE OR REPLACE function func_test1 RETURNS int LANGUAGE plpgsql AS $$DECLAREtmp INTEGER;BEGINSELECT id INTO tmp FROM  PersonTmpTable;dbms_output.put_line(tmp);return tmp;END;$$;select func_test1();
    ERROR:  query returned no rows when process INTO.
    ERROR:  query returned 2 rows more than one row.
    
  • 设置此选项,存储过程中使用SELECT INTO语句插入多值或者空时,成功插入第一行或者空。
    1
    2
    3
    4
    SET behavior_compat_options = 'select_into_allow_multi_result';
    
    CREATE OR REPLACE function func_test1 RETURNS int LANGUAGE plpgsql AS $$DECLAREtmp INTEGER;BEGINSELECT id INTO tmp FROM  PersonTmpTable;dbms_output.put_line(tmp);return tmp;END;$$;select func_test1();
    CREATE FUNCTION
    

ORA

TD

MYSQL

orderby_null_first

控制ORDER BY排序时NULL值是否默认视为最小值。

  • 设置此选项时,ORDER BY排序时NULL值默认视为最小值。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options = 'orderby_null_first';
    SELECT * FROM test ORDER BY a;
     a | b
    ---+---
       | 1
     1 | 2
    
  • 不设置此选项时,ORDER BY排序时NULL值默认视为最大值。
    1
    2
    3
    4
    5
    6
    SET behavior_compat_options = '';
    SELECT * FROM test ORDER BY a;
     a | b
    ---+---
     1 | 2
       | 1
    

TD

unsupported_set_function_case

控制是否支持case when条件中含有返回为多结果集函数。该选项仅8.3.0.100及以上集群版本支持。9.1.0及以上新安装的集群版本中默认开启该参数。

  • 设置此选项时,列存不支持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

enable_change_search_path

控制在形成通用计划generic_plan后能否修改搜寻路径。该选项仅9.1.0及以上集群版本支持。

  • 不设置此选项时,当设置新的搜索路径(search_path)并执行EXECUTE语句,数据库将仍然从原表的schema下寻找对应表。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE SCHEMA s1
      CREATE TABLE abc(f1 INT);
    CREATE SCHEMA s2
      CREATE TABLE abc(f1 INT);
    SET search_path = s1;
    INSERT INTO s1.abc VALUES(123);INSERT INTO s2.abc VALUES(456);
    SET search_path = s1;
    PREPARE p1 AS SELECT f1 FROM abc;
    EXECUTE p1;
     f1  
    -----
     123
    (1 row)
    SET search_path = s2;
    SELECT f1 FROM abc;
     f1  
    -----
     456
    (1 row)
    EXECUTE p1;
     f1  
    -----
     123
    (1 row)
    
  • 设置此选项时,当设置新的搜索路径(search_path)并执行EXECUTE语句,数据库将从新设置的搜索路径中寻找对应表。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    SET behavior_compat_options = 'enable_change_search_path';
    EXECUTE p1;
     f1  
    -----
     456
    (1 row)
    
    SET search_path = s1;
    EXECUTE p1;
     f1  
    -----
     123
    (1 row)
    

TD

enable_varchar_to_nvarchar2

控制通过DDL语句创建及更新的varchar字段是否自动切换为nvarchar2字段。该选项仅9.1.0及以上集群版本支持。

  • 设置此选项时,通过DDL语句创建/更新的varchar字段自动切换为nvarchar2字段。
  • 不设置此选项时,通过DDL语句创建/更新的varchar字段不会切换为nvarchar2字段。

ORA

TD

MYSQL

normalize_negative_zero

控制ceil(),round()函数在处理float类型特定值时返回-0与否。

  • 设置此选项时,ceil()处理(-1,0),round()处理[-0.5, 0)时返回值会返回0。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    SET behavior_compat_options='normalize_negative_zero';
    SELECT ceil(cast(-0.1 as float));
     ceil
    ------
        0
    (1 row)
    SELECT round(cast(-0.1 as FLOAT));
     round
    -------
         0
    (1 row)
    
  • 不设置此选项时,ceil()处理(-1,0),round()处理[-0.5, 0)时返回值会返回-0。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    SET behavior_compat_options = '';
    SELECT ceil(cast(-0.1 as FLOAT));
     ceil 
    ------
       -0 
    (1 row)
    SELECT round(cast(-0.1 as FLOAT));
     round
    -------
        -0
    (1 row)
    

ORA

TD

MySQL

disable_client_detection_commit

控制在每次事务提交之前,检测与客户端的连接是否存在。如果不存在,则报错,回滚该事务,防止因断连未感知重复下发导致的数据重复问题。

  • 不设置此选项时,每次事务提交之前检测一次客户端连接是否存在。
  • 设置此选项时,事务提交之前不检测客户端连接是否存在。

ORA

TD

MySQL

change_illegal_char

控制gds读取UTF8非法字符的显示问题。该选项仅8.3.0.100及以上集群版本支持。

该选项打开时,gds读取到UTF8不兼容的非法字符从“?”变为显示“�”。

MySQL

row_use_pseudo_name

控制row相关表达式是否对匿名列生成伪列名。该参数仅9.1.0.100及以上集群版本支持。

  • 不设置此选项时,row表达式中若存在对应的真实列名,则使用真实的列名,若本身为匿名列,则生成f1、f2...fn的伪列名。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
SELECT row_to_json(row(1,'foo'));
     row_to_json
---------------------
 {"f1":1,"f2":"foo"}
(1 row)

CREATE TABLE json_tbl(id INT, x INT, y text) WITH (ORIENTATION = COLUMN);
INSERT INTO json_tbl VALUES (1, 1, 'txt1'), (2, 2, 'txt2'), (3, 3, 'txt3');
SELECT to_json(t.*) FROM json_tbl t;
          to_json
---------------------------
 {"id":3,"x":3,"y":"txt3"}
 {"id":1,"x":1,"y":"txt1"}
 {"id":2,"x":2,"y":"txt2"}
(3 rows)
  • 设置此选项时,row表达式中将在列存表条件下生成f1、f2...fn的伪列名。
1
2
3
4
5
6
7
8
SET behavior_compat_options='ROW_USE_PSEUDO_NAME';
SELECT to_json(t.*) FROM json_tbl t;
           to_json
-----------------------------
 {"f1":3,"f2":3,"f3":"txt3"}
 {"f1":1,"f2":1,"f3":"txt1"}
 {"f1":2,"f2":2,"f3":"txt2"}
(3 rows)

ORA

TD

MySQL

enable_trunc_orc_string

控制orc格式外表字段为varchar(n),但是orc文件字段类型为string,且string长度超过n时,外表查询的行为。

  • 不设置此选项时,查询报错,提示字段超长。
  • 设置此选项时,查询正常,按照varchar(n)定义长度进行截断。

ORA

TD

MySQL

gds_fill_multi_missing_fields

控制GDS外表容错性参数fill_missing_fields设置为true/on时的行为。在GDS外表fill_missing_fields设置为true/on时,允许数据源文件一行中最后若干字段缺失,处理方式是将这些字段设置为NULL。而在此之前,仅允许数据源文件一行中最后一个字段缺失,否则报错。

  • 设置此选项时,GDS外表允许数据源文件一行最后多个字段缺失。
  • 不设置此选项时,GDS外表允许数据源文件一行最后一个字段缺失。兼容历史行为。

ORA

TD

MySQL

相关文档