6.0版本與7.0版本兼容性注意事項(xiàng)
AnalyticDB PostgreSQL 6.0版與AnalyticDB PostgreSQL 7.0版存在兼容性差異,當(dāng)您需要將實(shí)例從6.0版本升級(jí)到7.0版本時(shí),請(qǐng)先根據(jù)本文了解6.0版本與7.0版本兼容性注意事項(xiàng)。
數(shù)據(jù)類型
AnalyticDB PostgreSQL 7.0版刪除了以下被SQL標(biāo)準(zhǔn)類型(如timestamp)所淘汰的數(shù)據(jù)類型:
abstime
realtime
tinterval
timeInterval
AnalyticDB PostgreSQL 7.0版雖然保留了unknown關(guān)鍵字,但已不再支持unknown類型。具體內(nèi)容如下:
不再支持以u(píng)nknown類型作為列類型。
--- 不再支持直接作為列類型 CREATE TABLE test(a INT, b UNKNOWN); ERROR: COLUMN "b" has pseudo-type UNKNOWN
AnalyticDB PostgreSQL 7.0版中,CTAS語(yǔ)句的字符串常量不再識(shí)別為unknown類型,而是以就近原則來(lái)轉(zhuǎn)換類型或默認(rèn)轉(zhuǎn)換為text類型。
--- CTAS:普通字符串常量或NULL,在adbpg6中被識(shí)別為unknown類型,而在adbpg7中被默認(rèn)轉(zhuǎn)換為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類型會(huì)就近轉(zhuǎn)換為對(duì)應(yīng)列的同類型 CREATE TABLE test AS SELECT 1::INT UNION SELECT NULL; TABLE "public.test" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- int4 | integer | | | Distributed randomly
當(dāng)字符串常量的位置無(wú)法就近獲取被轉(zhuǎn)換的類型時(shí),字符串常量默認(rèn)轉(zhuǎn)換為text類型,此時(shí)可能會(huì)發(fā)生類型相關(guān)的錯(cuò)誤。
CREATE TABLE test(a INT); --- 兩層select的嵌套,讓內(nèi)部的字符串無(wú)法根據(jù)就近原則發(fā)現(xiàn)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
對(duì)于部分函數(shù),如果輸入的參數(shù)錯(cuò)誤,字符串常量可能會(huì)出現(xiàn)unknown類型報(bào)錯(cuò)。
--- string_agg的入?yún)⒅挥幸韵聝煞N string_agg(text,text) string_agg(bytea,bytea) --- 如果其它類型和字符串常量同時(shí)出現(xiàn)可能會(huì)以u(píng)nknown類型的報(bào)錯(cuò)展示 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
說(shuō)明AnalyticDB PostgreSQL 6.0版v6.3.11與AnalyticDB PostgreSQL 7.0版保持一致,不再支持unknown類型。AnalyticDB PostgreSQL 6.0版v6.6.2添加了開(kāi)關(guān)
adbpg_enable_resolve_unknowns
來(lái)控制是否支持unknown類型,并默認(rèn)關(guān)閉。
SQL語(yǔ)法
ALTER TABLE ... ADD PRIMARY KEY
差異:AnalyticDB PostgreSQL 7.0版主表執(zhí)行
ALTER TABLE ... ADD PRIMARY KEY
標(biāo)記列為NOT NULL時(shí),該更新操作會(huì)傳播到繼承的子表,即子表的對(duì)應(yīng)列會(huì)增加NOT NULL屬性。AnalyticDB PostgreSQL 6.0版主表執(zhí)行
ALTER TABLE ... ADD PRIMARY KEY
標(biāo)記列為NOT NULL時(shí),該更新操作不會(huì)傳播到繼承的子表。
CREATE FUNCTION
差異:AnalyticDB PostgreSQL 7.0版移除CREATE FUNCTION中的WITH子句。
AnalyticDB PostgreSQL 6.0版CREATE FUNCTION中仍保留WITH子句。
刪除OID列的特殊行為差異:
AnalyticDB PostgreSQL 7.0版系統(tǒng)表有普通的OID列。
AnalyticDB PostgreSQL 6.0版系統(tǒng)表中有隱藏的OID列。AnalyticDB PostgreSQL 6.0版在創(chuàng)建表的過(guò)程中,可以使用WITH OIDS來(lái)指定一個(gè)通常不可見(jiàn)的OID列,目前該功能已被刪除;列仍然可以顯式聲明為OID類型。 對(duì)具有使用WITH OIDS創(chuàng)建的列的表的操作將需要調(diào)整。
系統(tǒng)表
系統(tǒng)表在AnalyticDB PostgreSQL 7.0版進(jìn)行了以下變更,如果您的業(yè)務(wù)邏輯引用了以下系統(tǒng)表,請(qǐng)進(jìn)行修改否則將引起報(bào)錯(cuò)。
刪除以下系統(tǒng)表:
pg_exttable
AnalyticDB PostgreSQL 7.0版將
external
系統(tǒng)表與foreign
系統(tǒng)表合并為pg_foreign_table
。其中external
表的server被設(shè)為gp_exttable_server
,相關(guān)屬性寫(xiě)入ftoptions
。pg_partition
pg_partition_encoding
pg_partition_rule
與分區(qū)表相關(guān)的系統(tǒng)表由
gp_partition_template
和pg_partitioned_table
代替。
新增分區(qū)表相關(guān)系統(tǒng)表:
gp_partition_template
gp_partition_template
定義了分區(qū)表在分區(qū)層次結(jié)構(gòu)中每個(gè)級(jí)別的子分區(qū)模板,表結(jié)構(gòu)信息如下。列名
類型
描述
relid
oid
分區(qū)表的OID(頂層父表)。
level
int16
分區(qū)在層次中的級(jí)別。
template
pg_node_tree
模板結(jié)構(gòu)。
pg_partitioned_table
pg_partitioned_table
存放有關(guān)表如何被分區(qū)的信息,表結(jié)構(gòu)信息如下。列名
類型
引用
描述
partrelid
oid
pg_class.oid
分區(qū)表pg_class項(xiàng)的OID。
partstrat
char
無(wú)
分區(qū)策略,取值說(shuō)明:
h:哈希分區(qū)表。
l:列表分區(qū)表。
r:范圍分區(qū)表。
partnatts
int2
無(wú)
分區(qū)鍵中的列數(shù)。
partdefid
oid
pg_class.oid
分區(qū)表默認(rèn)分區(qū)(子分區(qū))的pg_class項(xiàng)的OID,如果分區(qū)表沒(méi)有默認(rèn)分區(qū)則為0。
partattrs
int2vector
pg_attribute.attnum
長(zhǎng)度為partnatts值的數(shù)組,指示分區(qū)鍵的組成部分。例如,取值
1 3
表示第一和第三個(gè)列組成了分區(qū)鍵。該數(shù)組中的零表示對(duì)應(yīng)的分區(qū)鍵列是一個(gè)表達(dá)式而不是簡(jiǎn)單的列引用。partclass
oidvector
pg_opclass.oid
partclass包含分區(qū)鍵中每一列要使用的操作符類的OID。詳見(jiàn)pg_opclass。
partcollation
oidvector
pg_opclass.oid
partcollation包含分區(qū)鍵中每一列要用于分區(qū)排序規(guī)則的OID,如果該列不是一種可排序數(shù)據(jù)類型則為零。
partexprs
pg_node_tree
無(wú)
非簡(jiǎn)單列引用的分區(qū)鍵列的表達(dá)式樹(shù)(以
nodeToString()
的表達(dá)式)。該項(xiàng)是一個(gè)列表,如果所有分區(qū)鍵列都是簡(jiǎn)單列引用,則該域?yàn)榭铡?/p>
更改以下系統(tǒng)表:
系統(tǒng)表
變更內(nèi)容
pg_attribute
新增atthasmissing列,指示是否有missing值。取值說(shuō)明:
true
:該列具有缺失值選項(xiàng),可以包含NULL值。false
:該列不具有缺失值選項(xiàng),不允許包含NULL值。
新增attidentity列,指示該列是否被定義為標(biāo)識(shí)列。取值說(shuō)明:
'a'
:該列是標(biāo)識(shí)列,其值總是生成。'd'
:該列是標(biāo)識(shí)列,其值是通過(guò)序列或其他機(jī)制自動(dòng)生成的。''
(零字節(jié)):該列不是標(biāo)識(shí)列。
新增attgenerated列,指示該列是否為生成列。取值說(shuō)明:
's'
:該列是生成列,其值為stored。''
(零字節(jié)):該列不是生成列。
pg_class
刪除relstorage列,用于指示relkind的物理存儲(chǔ)方式。AnalyticDB PostgreSQL 7.0版中external表的relkind由
'r'
更改為'f'
。刪除relhasoids列,用于指示是否為表每行生成一個(gè)OID。AnalyticDB PostgreSQL 7.0版已經(jīng)刪除OID隱藏列。
刪除relhaspkey列,用于指示是否有Primary Key Index(主鍵索引),AnalyticDB PostgreSQL 7.0版已刪除,需要檢查主鍵的應(yīng)用程序,應(yīng)查詢pg_index。
新增relrowsecurity列,指示行級(jí)安全是否開(kāi)啟。取值說(shuō)明:
true
:表啟用了行級(jí)安全性,可以應(yīng)用安全策略。false
:表未啟用行級(jí)安全性,默認(rèn)情況下所有用戶都可以訪問(wèn)表的所有數(shù)據(jù)。
新增felforcerowsecurity列,跟蹤表是否強(qiáng)制啟用了行級(jí)安全性,如果行級(jí)安全性(啟用時(shí))也適用于表?yè)碛姓邉t為真(true)。
新增relispartition列,指示是否為分區(qū)表。取值說(shuō)明:
true
:該表是分區(qū)表的一個(gè)分區(qū)。false
:該表不是分區(qū)表或者是分區(qū)表的父表。
新增relrewrite列,指示表在DDL操作期間是否具有重寫(xiě)規(guī)則。取值說(shuō)明:
true
:表具有重寫(xiě)規(guī)則。false
:表沒(méi)有定義重寫(xiě)規(guī)則或者不適用于重寫(xiě)規(guī)則。
新增relpartbound列,為pg_node_tree類型,表明分區(qū)邊界的內(nèi)部表達(dá)。
pg_index
新增indnkeyatts列,指示Index中Key列的數(shù)量。AnalyticDB PostgreSQL 7.0版對(duì)Index開(kāi)始加入Including語(yǔ)句,可以將非Index鍵的列寫(xiě)入葉子節(jié)點(diǎn)方便查找。
pg_proc
將protransform列更名為prosupport,調(diào)用該函數(shù)時(shí)可以通過(guò)此列指定的函數(shù)進(jìn)行簡(jiǎn)化。
刪除proisagg列,指示函數(shù)是否為一個(gè)聚集函數(shù)。
刪除proiswindow列,指示函數(shù)是否為一個(gè)窗口函數(shù)。
新增prokind列,用于指示函數(shù)的種類。取值說(shuō)明:
f:普通函數(shù)。
p:存儲(chǔ)過(guò)程。
a:聚集函數(shù)。
w:窗口函數(shù)。
新增proparallel列,指示該函數(shù)在并行模式下是否能安全運(yùn)行。取值說(shuō)明:
s:能在并行模式下不受限制安全運(yùn)行的函數(shù)。
r:可以在并行模式下運(yùn)行,但是只限于由并行分組的領(lǐng)導(dǎo)者執(zhí)行的函數(shù)。
u:在并行模式中不安全的函數(shù),這類函數(shù)的存在會(huì)強(qiáng)制一個(gè)順序執(zhí)行計(jì)劃。
新增protrftypes列,存儲(chǔ)需要應(yīng)用轉(zhuǎn)換數(shù)據(jù)類型的OID。
pg_statistic
新增stacoll列,指示統(tǒng)計(jì)信息的收集方法。取值說(shuō)明:
N:排序規(guī)則用于導(dǎo)出存儲(chǔ)在第N個(gè)“槽”中的統(tǒng)計(jì)信息。例如,可排序列的直方圖槽將顯示定義數(shù)據(jù)排序順序的排序規(guī)則。
0:表示不可整理數(shù)據(jù)。
擴(kuò)展插件
以下擴(kuò)展插件,AnalyticDB PostgreSQL 7.0版可能暫時(shí)無(wú)法使用。
插件名 | 描述 |
adbpg_desensitization | 進(jìn)行SQL脫敏。 |
adbpg_hardware_bench | 評(píng)估硬件的適用性。 |
address_standardizer | 用于將地址解析為組元素,一般用于支持地理編碼地址標(biāo)準(zhǔn)化步驟。 |
address_standardizer_data_us | 提供了美國(guó)地址標(biāo)準(zhǔn)化和解析的功能。 |
auto_partition | 管理日期分區(qū)。 |
diskquota | 磁盤配額程序。 |
fastann | 向量化數(shù)據(jù)庫(kù)引擎。 |
hyjal_pb_formatter | 支持讀取hyjal protobuf數(shù)據(jù)。 |
madlib | 提供用于可擴(kuò)展數(shù)據(jù)庫(kù)內(nèi)分析的開(kāi)源庫(kù)。 |
morton_code | 莫頓碼編碼器。 |
multi_master | 提供Multi-Master特性的UDF。 |
Multicorn | 實(shí)現(xiàn)自定義外部數(shù)據(jù)源的查詢,使用Multicorn插件需要一定的Python編程知識(shí)。 |
open_analytic | 對(duì)非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行分析。 |
oss_ext | 用于支持OSS外表的協(xié)議。 AnalyticDB PostgreSQL 7.0版不再支持,使用oss_fdw替換。 |
PL/Java | 提供了將Java代碼嵌入到PostgreSQL數(shù)據(jù)庫(kù)中的能力。 |
PL/Python | 提供了將Python代碼嵌入到PostgreSQL數(shù)據(jù)庫(kù)中的能力。 AnalyticDB PostgreSQL 7.0版不再支持,更改為PL/Python3u。 |
PL/Python2u | 允許在PostgreSQL數(shù)據(jù)庫(kù)中使用Python 2語(yǔ)言編寫(xiě)存儲(chǔ)過(guò)程、觸發(fā)器和函數(shù)。 AnalyticDB PostgreSQL 7.0版不再支持,更改為PL/Python3u。 |
querycache | 提供QueryCache特性的UDF。 |
redis_fdw | 用于查詢Redis服務(wù)器的外部數(shù)據(jù)包裝器。 |
關(guān)鍵字
AnalyticDB PostgreSQL 7.0版新增、修改、刪除了部分關(guān)鍵字。(數(shù)據(jù)庫(kù)對(duì)象的命名,不可與關(guān)鍵字沖突)。
關(guān)鍵字不同的分類及含義,可以通過(guò)如下命令查看(6.0版和7.0版均適用)。
SELECT * FROM pg_get_keywords();
AnalyticDB PostgreSQL 7.0版字符分類碼說(shuō)明如下:
catcode | 說(shuō)明 |
U | 不保留,可以用于任何對(duì)象(視圖、表、函數(shù)、類型、索引、字段、類型等)。 |
C | 不保留,但是不可用于函數(shù)、類型名。 |
T | 保留,但是可用于函數(shù)、類型名。 |
R | 保留,不可用于任何對(duì)象名稱。 |
AnalyticDB PostgreSQL 7.0版與AnalyticDB PostgreSQL 6.0版關(guān)鍵字差異如下:
關(guān)鍵字 | AnalyticDB PostgreSQL 6.0版 | AnalyticDB PostgreSQL 7.0版 |
access_key_id | unreserved | 無(wú)此關(guān)鍵字 |
attach | 無(wú)此關(guān)鍵字 | unreserved |
call | 無(wú)此關(guān)鍵字 | unreserved |
columns | 無(wú)此關(guān)鍵字 | unreserved |
coordinator | 無(wú)此關(guān)鍵字 | unreserved |
cube | unreserved(不可用于函數(shù)、類型名) | unreserved |
depends | 無(wú)此關(guān)鍵字 | unreserved |
detach | 無(wú)此關(guān)鍵字 | unreserved |
endpoint | 無(wú)此關(guān)鍵字 | unreserved |
generated | 無(wú)此關(guān)鍵字 | unreserved |
groups | 無(wú)此關(guān)鍵字 | unreserved |
import | 無(wú)此關(guān)鍵字 | unreserved |
include | 無(wú)此關(guān)鍵字 | unreserved |
incremental | unreserved | 無(wú)此關(guān)鍵字 |
initplan | 無(wú)此關(guān)鍵字 | unreserved |
json | unreserved | 無(wú)此關(guān)鍵字 |
jsonline | unreserved | 無(wú)此關(guān)鍵字 |
lc_collate | unreserved | 無(wú)此關(guān)鍵字 |
lc_ctype | unreserved | 無(wú)此關(guān)鍵字 |
library | unreserved | 無(wú)此關(guān)鍵字 |
locked | 無(wú)此關(guān)鍵字 | unreserved |
logged | 無(wú)此關(guān)鍵字 | unreserved |
manifest | unreserved | 無(wú)此關(guān)鍵字 |
merge | unreserved | 無(wú)此關(guān)鍵字 |
method | 無(wú)此關(guān)鍵字 | unreserved |
multisort | unreserved | 無(wú)此關(guān)鍵字 |
new | 無(wú)此關(guān)鍵字 | unreserved |
old | 無(wú)此關(guān)鍵字 | unreserved |
orc | unreserved | 無(wú)此關(guān)鍵字 |
overriding | 無(wú)此關(guān)鍵字 | unreserved |
persistently | 無(wú)此關(guān)鍵字 | unreserved |
parquet | unreserved | 無(wú)此關(guān)鍵字 |
policy | 無(wú)此關(guān)鍵字 | unreserved |
procedures | 無(wú)此關(guān)鍵字 | unreserved |
referencing | 無(wú)此關(guān)鍵字 | unreserved |
retrieve | 無(wú)此關(guān)鍵字 | unreserved |
rollup | unreserved(不可用于函數(shù)、類型名) | unreserved |
routine | 無(wú)此關(guān)鍵字 | unreserved |
routines | 無(wú)此關(guān)鍵字 | unreserved |
schemas | 無(wú)此關(guān)鍵字 | unreserved |
secret_access_key | unreserved | 無(wú)此關(guān)鍵字 |
sets | unreserved(不可用于函數(shù)、類型名) | unreserved |
skip_ao_aux_table | unreserved | 無(wú)此關(guān)鍵字 |
skip | 無(wú)此關(guān)鍵字 | unreserved |
sort | unreserved | 無(wú)此關(guān)鍵字 |
sorted | unreserved | 無(wú)此關(guān)鍵字 |
storage_cold | unreserved | 無(wú)此關(guān)鍵字 |
storage_hot | unreserved | 無(wú)此關(guān)鍵字 |
stored | 無(wú)此關(guān)鍵字 | unreserved |
support | 無(wú)此關(guān)鍵字 | unreserved |
synchronization | unreserved | 無(wú)此關(guān)鍵字 |
tablesample | 無(wú)此關(guān)鍵字 | reserved(不可用于函數(shù)、類型名) |
transform | 無(wú)此關(guān)鍵字 | unreserved |
ttl | unreserved | 無(wú)此關(guān)鍵字 |
unload | unreserved | 無(wú)此關(guān)鍵字 |
unsorted | unreserved | 無(wú)此關(guān)鍵字 |
xmlnamespaces | 無(wú)此關(guān)鍵字 | unreserved(不可用于函數(shù)、類型名) |
xmltable | 無(wú)此關(guān)鍵字 | unreserved(不可用于函數(shù)、類型名) |
zorder | reserved | 無(wú)此關(guān)鍵字 |
函數(shù)相關(guān)
AnalyticDB PostgreSQL 7.0版重命名預(yù)寫(xiě)式日志目錄
pg_xlog 為pg_wal
,并重命名事務(wù)狀態(tài)目錄pg_clog為pg_xact
,因此名稱引用了“xlog”的SQL函數(shù)、工具和選項(xiàng)等都被更改為“wal”。例如,pg_switch_xlog()
被改為pg_switch_wal()
,pg_receivexlog
被改為pg_receivewal
,--xlogdir
被改為--waldir
。AnalyticDB PostgreSQL 7.0版修改SQL風(fēng)格的
substring()
,使其具有符合標(biāo)準(zhǔn)的貪婪行為。在模式以多種方式匹配的情況下,初始子模式會(huì)被視為匹配盡可能少的文本,而不是匹配盡可能多的文本。例如,%#"aa*#"%
模式當(dāng)前會(huì)從輸入中選擇第一組a,而不是最后一組。
其他
為提高安全性,AnalyticDB PostgreSQL 7.0版使用sha256算法對(duì)密碼進(jìn)行加密,sha256算法的安全性遠(yuǎn)高于AnalyticDB PostgreSQL 6.0版默認(rèn)的md5算法。您可以使用遷移方式進(jìn)行升級(jí),升級(jí)后請(qǐng)重置密碼。具體操作,請(qǐng)參見(jiàn)AnalyticDB PostgreSQL版間的數(shù)據(jù)遷移。