全部產品
Search
文件中心

AnalyticDB:6.0版本與7.0版本相容性注意事項

更新時間:Nov 01, 2024

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版間的資料移轉