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_templatepg_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版间的数据迁移