6.0版本与7.0版本兼容性注意事项
AnalyticDB PostgreSQL 6.0版与AnalyticDB PostgreSQL 7.0版存在兼容性差异,当您需要将实例从6.0版本升级到7.0版本时,请先根据本文了解6.0版本与7.0版本兼容性注意事项。
数据类型
AnalyticDB PostgreSQL 7.0版删除了以下被SQL标准类型(如timestamp)所淘汰的数据类型:
abstime
realtime
tinterval
timeInterval
AnalyticDB PostgreSQL 7.0版虽然保留了unknown关键字,但已不再支持unknown类型。具体内容如下:
不再支持以unknown类型作为列类型。
--- 不再支持直接作为列类型 CREATE TABLE test(a INT, b UNKNOWN); ERROR: COLUMN "b" has pseudo-type UNKNOWN
AnalyticDB PostgreSQL 7.0版中,CTAS语句的字符串常量不再识别为unknown类型,而是以就近原则来转换类型或默认转换为text类型。
--- CTAS:普通字符串常量或NULL,在adbpg6中被识别为unknown类型,而在adbpg7中被默认转换为text类型 CREATE TABLE test AS SELECT 1 AS a, NULL AS b; TABLE "public.test" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- a | integer | | | b | text | | | Distributed randomly --- 使用union,unknown类型会就近转换为对应列的同类型 CREATE TABLE test AS SELECT 1::INT UNION SELECT NULL; TABLE "public.test" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- int4 | integer | | | Distributed randomly
当字符串常量的位置无法就近获取被转换的类型时,字符串常量默认转换为text类型,此时可能会发生类型相关的错误。
CREATE TABLE test(a INT); --- 两层select的嵌套,让内部的字符串无法根据就近原则发现test表中int类型的存在 INSERT INTO test SELECT a FROM (SELECT '1' AS a) t; ERROR: COLUMN "a" IS OF type INTEGER but expression IS OF type text
对于部分函数,如果输入的参数错误,字符串常量可能会出现unknown类型报错。
--- string_agg的入参只有以下两种 string_agg(text,text) string_agg(bytea,bytea) --- 如果其它类型和字符串常量同时出现可能会以unknown类型的报错展示 CREATE TABLE test(a INT, b INT); SELECT a, string_agg(b,',') FROM test GROUP BY a; ERROR: FUNCTION string_agg(INTEGER, UNKNOWN) does NOT exist
说明AnalyticDB PostgreSQL 6.0版v6.3.11与AnalyticDB PostgreSQL 7.0版保持一致,不再支持unknown类型。AnalyticDB PostgreSQL 6.0版v6.6.2添加了开关
adbpg_enable_resolve_unknowns
来控制是否支持unknown类型,并默认关闭。
SQL语法
ALTER TABLE ... ADD PRIMARY KEY
差异:AnalyticDB PostgreSQL 7.0版主表执行
ALTER TABLE ... ADD PRIMARY KEY
标记列为NOT NULL时,该更新操作会传播到继承的子表,即子表的对应列会增加NOT NULL属性。AnalyticDB PostgreSQL 6.0版主表执行
ALTER TABLE ... ADD PRIMARY KEY
标记列为NOT NULL时,该更新操作不会传播到继承的子表。
CREATE FUNCTION
差异:AnalyticDB PostgreSQL 7.0版移除CREATE FUNCTION中的WITH子句。
AnalyticDB PostgreSQL 6.0版CREATE FUNCTION中仍保留WITH子句。
删除OID列的特殊行为差异:
AnalyticDB PostgreSQL 7.0版系统表有普通的OID列。
AnalyticDB PostgreSQL 6.0版系统表中有隐藏的OID列。AnalyticDB PostgreSQL 6.0版在创建表的过程中,可以使用WITH OIDS来指定一个通常不可见的OID列,目前该功能已被删除;列仍然可以显式声明为OID类型。 对具有使用WITH OIDS创建的列的表的操作将需要调整。
系统表
系统表在AnalyticDB PostgreSQL 7.0版进行了以下变更,如果您的业务逻辑引用了以下系统表,请进行修改否则将引起报错。
删除以下系统表:
pg_exttable
AnalyticDB PostgreSQL 7.0版将
external
系统表与foreign
系统表合并为pg_foreign_table
。其中external
表的server被设为gp_exttable_server
,相关属性写入ftoptions
。pg_partition
pg_partition_encoding
pg_partition_rule
与分区表相关的系统表由
gp_partition_template
和pg_partitioned_table
代替。
新增分区表相关系统表:
gp_partition_template
gp_partition_template
定义了分区表在分区层次结构中每个级别的子分区模板,表结构信息如下。列名
类型
描述
relid
oid
分区表的OID(顶层父表)。
level
int16
分区在层次中的级别。
template
pg_node_tree
模板结构。
pg_partitioned_table
pg_partitioned_table
存放有关表如何被分区的信息,表结构信息如下。列名
类型
引用
描述
partrelid
oid
pg_class.oid
分区表pg_class项的OID。
partstrat
char
无
分区策略,取值说明:
h:哈希分区表。
l:列表分区表。
r:范围分区表。
partnatts
int2
无
分区键中的列数。
partdefid
oid
pg_class.oid
分区表默认分区(子分区)的pg_class项的OID,如果分区表没有默认分区则为0。
partattrs
int2vector
pg_attribute.attnum
长度为partnatts值的数组,指示分区键的组成部分。例如,取值
1 3
表示第一和第三个列组成了分区键。该数组中的零表示对应的分区键列是一个表达式而不是简单的列引用。partclass
oidvector
pg_opclass.oid
partclass包含分区键中每一列要使用的操作符类的OID。详见pg_opclass。
partcollation
oidvector
pg_opclass.oid
partcollation包含分区键中每一列要用于分区排序规则的OID,如果该列不是一种可排序数据类型则为零。
partexprs
pg_node_tree
无
非简单列引用的分区键列的表达式树(以
nodeToString()
的表达式)。该项是一个列表,如果所有分区键列都是简单列引用,则该域为空。
更改以下系统表:
系统表
变更内容
pg_attribute
新增atthasmissing列,指示是否有missing值。取值说明:
true
:该列具有缺失值选项,可以包含NULL值。false
:该列不具有缺失值选项,不允许包含NULL值。
新增attidentity列,指示该列是否被定义为标识列。取值说明:
'a'
:该列是标识列,其值总是生成。'd'
:该列是标识列,其值是通过序列或其他机制自动生成的。''
(零字节):该列不是标识列。
新增attgenerated列,指示该列是否为生成列。取值说明:
's'
:该列是生成列,其值为stored。''
(零字节):该列不是生成列。
pg_class
删除relstorage列,用于指示relkind的物理存储方式。AnalyticDB PostgreSQL 7.0版中external表的relkind由
'r'
更改为'f'
。删除relhasoids列,用于指示是否为表每行生成一个OID。AnalyticDB PostgreSQL 7.0版已经删除OID隐藏列。
删除relhaspkey列,用于指示是否有Primary Key Index(主键索引),AnalyticDB PostgreSQL 7.0版已删除,需要检查主键的应用程序,应查询pg_index。
新增relrowsecurity列,指示行级安全是否开启。取值说明:
true
:表启用了行级安全性,可以应用安全策略。false
:表未启用行级安全性,默认情况下所有用户都可以访问表的所有数据。
新增felforcerowsecurity列,跟踪表是否强制启用了行级安全性,如果行级安全性(启用时)也适用于表拥有者则为真(true)。
新增relispartition列,指示是否为分区表。取值说明:
true
:该表是分区表的一个分区。false
:该表不是分区表或者是分区表的父表。
新增relrewrite列,指示表在DDL操作期间是否具有重写规则。取值说明:
true
:表具有重写规则。false
:表没有定义重写规则或者不适用于重写规则。
新增relpartbound列,为pg_node_tree类型,表明分区边界的内部表达。
pg_index
新增indnkeyatts列,指示Index中Key列的数量。AnalyticDB PostgreSQL 7.0版对Index开始加入Including语句,可以将非Index键的列写入叶子节点方便查找。
pg_proc
将protransform列更名为prosupport,调用该函数时可以通过此列指定的函数进行简化。
删除proisagg列,指示函数是否为一个聚集函数。
删除proiswindow列,指示函数是否为一个窗口函数。
新增prokind列,用于指示函数的种类。取值说明:
f:普通函数。
p:存储过程。
a:聚集函数。
w:窗口函数。
新增proparallel列,指示该函数在并行模式下是否能安全运行。取值说明:
s:能在并行模式下不受限制安全运行的函数。
r:可以在并行模式下运行,但是只限于由并行分组的领导者执行的函数。
u:在并行模式中不安全的函数,这类函数的存在会强制一个顺序执行计划。
新增protrftypes列,存储需要应用转换数据类型的OID。
pg_statistic
新增stacoll列,指示统计信息的收集方法。取值说明:
N:排序规则用于导出存储在第N个“槽”中的统计信息。例如,可排序列的直方图槽将显示定义数据排序顺序的排序规则。
0:表示不可整理数据。
扩展插件
以下扩展插件,AnalyticDB PostgreSQL 7.0版可能暂时无法使用。
插件名 | 描述 |
adbpg_desensitization | 进行SQL脱敏。 |
adbpg_hardware_bench | 评估硬件的适用性。 |
address_standardizer | 用于将地址解析为组元素,一般用于支持地理编码地址标准化步骤。 |
address_standardizer_data_us | 提供了美国地址标准化和解析的功能。 |
auto_partition | 管理日期分区。 |
diskquota | 磁盘配额程序。 |
fastann | 向量化数据库引擎。 |
hyjal_pb_formatter | 支持读取hyjal protobuf数据。 |
madlib | 提供用于可扩展数据库内分析的开源库。 |
morton_code | 莫顿码编码器。 |
multi_master | 提供Multi-Master特性的UDF。 |
Multicorn | 实现自定义外部数据源的查询,使用Multicorn插件需要一定的Python编程知识。 |
open_analytic | 对非结构化数据进行分析。 |
oss_ext | 用于支持OSS外表的协议。 AnalyticDB PostgreSQL 7.0版不再支持,使用oss_fdw替换。 |
PL/Java | 提供了将Java代码嵌入到PostgreSQL数据库中的能力。 |
PL/Python | 提供了将Python代码嵌入到PostgreSQL数据库中的能力。 AnalyticDB PostgreSQL 7.0版不再支持,更改为PL/Python3u。 |
PL/Python2u | 允许在PostgreSQL数据库中使用Python 2语言编写存储过程、触发器和函数。 AnalyticDB PostgreSQL 7.0版不再支持,更改为PL/Python3u。 |
redis_fdw | 用于查询Redis服务器的外部数据包装器。 |
关键字
AnalyticDB PostgreSQL 7.0版新增、修改、删除了部分关键字。(数据库对象的命名,不可与关键字冲突)。
关键字不同的分类及含义,可以通过如下命令查看(6.0版和7.0版均适用)。
SELECT * FROM pg_get_keywords();
AnalyticDB PostgreSQL 7.0版字符分类码说明如下:
catcode | 说明 |
U | 不保留,可以用于任何对象(视图、表、函数、类型、索引、字段、类型等)。 |
C | 不保留,但是不可用于函数、类型名。 |
T | 保留,但是可用于函数、类型名。 |
R | 保留,不可用于任何对象名称。 |
AnalyticDB PostgreSQL 7.0版与AnalyticDB PostgreSQL 6.0版关键字差异如下:
关键字 | AnalyticDB PostgreSQL 6.0版 | AnalyticDB PostgreSQL 7.0版 |
access_key_id | unreserved | 无此关键字 |
attach | 无此关键字 | unreserved |
call | 无此关键字 | unreserved |
columns | 无此关键字 | unreserved |
coordinator | 无此关键字 | unreserved |
cube | unreserved(不可用于函数、类型名) | unreserved |
depends | 无此关键字 | unreserved |
detach | 无此关键字 | unreserved |
endpoint | 无此关键字 | unreserved |
generated | 无此关键字 | unreserved |
groups | 无此关键字 | unreserved |
import | 无此关键字 | unreserved |
include | 无此关键字 | unreserved |
incremental | unreserved | 无此关键字 |
initplan | 无此关键字 | unreserved |
json | unreserved | 无此关键字 |
jsonline | unreserved | 无此关键字 |
lc_collate | unreserved | 无此关键字 |
lc_ctype | unreserved | 无此关键字 |
library | unreserved | 无此关键字 |
locked | 无此关键字 | unreserved |
logged | 无此关键字 | unreserved |
manifest | unreserved | 无此关键字 |
merge | unreserved | 无此关键字 |
method | 无此关键字 | unreserved |
multisort | unreserved | 无此关键字 |
new | 无此关键字 | unreserved |
old | 无此关键字 | unreserved |
orc | unreserved | 无此关键字 |
overriding | 无此关键字 | unreserved |
persistently | 无此关键字 | unreserved |
parquet | unreserved | 无此关键字 |
policy | 无此关键字 | unreserved |
procedures | 无此关键字 | unreserved |
referencing | 无此关键字 | unreserved |
retrieve | 无此关键字 | unreserved |
rollup | unreserved(不可用于函数、类型名) | unreserved |
routine | 无此关键字 | unreserved |
routines | 无此关键字 | unreserved |
schemas | 无此关键字 | unreserved |
secret_access_key | unreserved | 无此关键字 |
sets | unreserved(不可用于函数、类型名) | unreserved |
skip_ao_aux_table | unreserved | 无此关键字 |
skip | 无此关键字 | unreserved |
sort | unreserved | 无此关键字 |
sorted | unreserved | 无此关键字 |
storage_cold | unreserved | 无此关键字 |
storage_hot | unreserved | 无此关键字 |
stored | 无此关键字 | unreserved |
support | 无此关键字 | unreserved |
synchronization | unreserved | 无此关键字 |
tablesample | 无此关键字 | reserved(不可用于函数、类型名) |
transform | 无此关键字 | unreserved |
ttl | unreserved | 无此关键字 |
unload | unreserved | 无此关键字 |
unsorted | unreserved | 无此关键字 |
xmlnamespaces | 无此关键字 | unreserved(不可用于函数、类型名) |
xmltable | 无此关键字 | unreserved(不可用于函数、类型名) |
zorder | reserved | 无此关键字 |
函数相关
AnalyticDB PostgreSQL 7.0版重命名预写式日志目录
pg_xlog 为pg_wal
,并重命名事务状态目录pg_clog为pg_xact
,因此名称引用了“xlog”的SQL函数、工具和选项等都被更改为“wal”。例如,pg_switch_xlog()
被改为pg_switch_wal()
,pg_receivexlog
被改为pg_receivewal
,--xlogdir
被改为--waldir
。AnalyticDB PostgreSQL 7.0版修改SQL风格的
substring()
,使其具有符合标准的贪婪行为。在模式以多种方式匹配的情况下,初始子模式会被视为匹配尽可能少的文本,而不是匹配尽可能多的文本。例如,%#"aa*#"%
模式当前会从输入中选择第一组a,而不是最后一组。
其他
为提高安全性,AnalyticDB PostgreSQL 7.0版使用sha256算法对密码进行加密,sha256算法的安全性远高于AnalyticDB PostgreSQL 6.0版默认的md5算法。您可以使用迁移方式进行升级,升级后请重置密码。具体操作,请参见AnalyticDB PostgreSQL版间的数据迁移。