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 UNKNOWNAnalyticDB 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_exttableAnalyticDB PostgreSQL 7.0版將
external系統資料表與foreign系統資料表合并為pg_foreign_table。其中external表的server被設為gp_exttable_server,相關屬性寫入ftoptions。pg_partitionpg_partition_encodingpg_partition_rule與分區表相關的系統資料表由
gp_partition_template和pg_partitioned_table代替。
新增分區表相關係統表:
gp_partition_templategp_partition_template定義了分區表在分區階層中每個層級的子分區模板,表結構資訊如下。列名
類型
描述
relid
oid
分區表的OID(頂層父表)。
level
int16
分區在層次中的層級。
template
pg_node_tree
模板結構。
pg_partitioned_tablepg_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版間的資料移轉。