本文介绍了ADB PG 4.3版本与6.0版本在兼容性上的注意事项,如果您需要将实例从4.3版本升级到6.0版本,请根据实际情况对本文提及的部分进行相应的修改。

优化器

名称 V4.3 V6.0
默认优化器 Legacy优化器 ORCA优化器

4.3版本与6.0版本都支持Legacy优化器和ORCA优化器,可根据需求选择使用,有关优化器的选择,请参见两种优化器的选择

转义符

  • 在6.0版本中,字符串的转义字符\ ,将作为字符串本身,不再表示转义符。
  • 可执行以下语句保持和4.3版本语义一致,但不建议这样操作。
    set standard_conforming_strings = off;
    说明 上述语句仅对session级别生效。如果需要对集群生效,请 提交工单,由ADB PG后台技术人员进行设置。

类型转换

  • 6.0版本中不再支持YYYYMMDDHH24MISS格式的字符串自动强转为时间戳类型。您可以通过系统内建函数to_timestamp/to_char,进行YYYYMMDDHH24MISS格式的字符串和时间戳之间的转换。
  • 6.0版本不再支持数字类型隐式转换成TEXT类型。如果4.3版本中有这类语句,升级到6.0版本后,您可以通过增加Function支持这类场景。比如:
    create or replace function substr(numeric, integer,integer)returns text as $$
    select substr($1::text,$2,$3);
    $$ language sql IMMUTABLE strict;
    create or replace function pg_catalog.btrim(str numeric) returns text as $$
    return $_[0];
    $$ language plperl IMMUTABLE strict;
    create or replace function to_date(timestamp, text) returns date as $$
    select to_date($1::text,$2);
    $$ language sql IMMUTABLE strict;
    create or replace function to_date(integer, text) returns date as $$
    select to_date($1::text,$2);
    $$ language sql IMMUTABLE strict;
  • 如果有SQL或Function需要隐式转换成TEXT类型的场景,会受到影响,需要手工改写。

外部表错误日志

6.0版本不支持在 create external tablecopy语句时,使用 into error_table子句。您可以使用系统函数代替 into error_table子句的功能。
gp_read_error_log('$external_table')
gp_truncate_error_log('$external_table')

数据类型

  • NUMERIC类型的文件存储格式变化,会影响到磁盘空间使用;
  • MONEY类型由32位改为64位,会影响磁盘空间使用;
  • 6.0版本不支持以下数据类型作为分布键:
    • abstime
    • reltime
    • tinterval
    • money
    • anyarray

关键字

6.0版本新增、修改、删除了部分关键字。(数据库对象的命名,不可以与关键字冲突)。

关键字不同的分类,含义不一样。可以通过如下命令,查看所有关键字和具体分类。(4.3 和 6.0 版本均适用)。

select * from pg_get_keywords();
表 1. 关键字分类说明
catcode catdesc 说明
U unreserved 不保留,可以用于任何对象(视图、表、函数、类型、索引、字段、类型等)。
C unreserved (cannot be function or type name) 不保留,但是不可用于函数、类型名。
T reserved (can be function or type name) 保留,但是可用于函数、类型名。
R reserved 保留,不可用于任何对象名称。
表 2. 4.3版和6.0版本分类不同的关键字列表如下:
关键字 v4.3 v6.0
between reserved unreserved (cannot be function or type name)
collation reserved (can be function or type name)
concurrently unreserved reserved (can be function or type name)
convert unreserved (cannot be function or type name)
filter reserved unreserved
lateral - reserved
new reserved
off reserved unreserved
old reserved
percentile_cont unreserved (cannot be function or type name)
percentile_disc unreserved (cannot be function or type name)
range reserved unreserved
reindex unreserved reserved
rows reserved unreserved
sort reserved reserved (can be function or type name)
variadic reserved

系统表

系统表在4.3版和6.0版中有部分区别,如果您的业务逻辑引用了以下系统表,请进行修改否则将引起报错。

V4.3 V6.0 说明
pg_class.reltoastidxid 已删除
pg_stat_activity.procpid pg_stat_activity.pid 进程号
pg_stat_activity.current_query pg_stat_activity.state

pg_stat_activity.query

拆分为两列,state标识后端状态,query标识当前执行的请求
gp_distribution_policy.attrnums gp_distribution_policy.distkey 修改列名,且数据类型变int2vector
sesion_level_memory_consumption.__gp_localid

sesion_level_memory_consumption.__gp_masterid

已删除
pg_filespace

pg_filespace_entry

已删除

内置函数的参数

在6.0版本中,一些内置函数的参数发生了变化。

V4.3 V6.0 说明
int4_avg_accum(bytea, integer) int4_avg_accum(bigint[], integer)
string_agg(expression) string_agg(expression, delimiter) 把一个表达式变成字符串

其他用法

名称 V4.3 V6.0
left()函数 不支持 支持
update分布键 不支持 支持