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版間的數據遷移。