91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL DBA(57) - Could not choose a best candidate operator

發布時間:2020-08-10 23:54:14 來源:ITPUB博客 閱讀:378 作者:husthxd 欄目:關系型數據庫

本節內容來源于客戶現場反饋的一個問題.
Question
創建了integer到text的cast后,為何執行字符串連接”||”操作報錯?


testdb=# drop table if exists t_cast ;
DROP TABLE
testdb=# create table t_cast (id int);
CREATE TABLE
testdb=# insert into t_cast values(1),(2),(3);
INSERT 0 3
testdb=# create cast(integer as text) with inout as implicit;
CREATE CAST
testdb=# select id||'X' from t_cast;
psql: ERROR:  operator is not unique: integer || unknown
LINE 1: select id||'X' from t_cast;
                 ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

Answer
PostgreSQL處理操作符時分為以下兩個步驟:
1.從系統目錄pg_operator中找出匹配該操作符和操作數的候選函數(數據行);
2.根據隱式轉換規則選擇合適的operator.

原生PG
通過分析和跟蹤代碼,第一步,從pg_operator中選出的后續函數OID為374/2780


testdb=# select oid,oprname,oprleft::regtype,oprright::regtype 
testdb-# from pg_operator 
testdb-# where oid in (374,2780);
 oid  | oprname |   oprleft   | oprright 
------+---------+-------------+----------
  374 | ||      | anyelement  | anyarray
 2780 | ||      | anynonarray | text
(2 rows)

而’X’可視為text,最終PostgreSQL會選擇OID = 2780的operator,因此不會出錯.

創建integer -> text轉換
而創建了integer -> text的cast后,從pg_operator中選出的后續函數OID為654/2779/374/2780


testdb=# select oid,oprname,oprleft::regtype,oprright::regtype 
testdb-# from pg_operator 
testdb-# where oid in (654,2779,374,2780);
 oid  | oprname |   oprleft   |  oprright   
------+---------+-------------+-------------
  374 | ||      | anyelement  | anyarray
  654 | ||      | text        | text
 2779 | ||      | text        | anynonarray
 2780 | ||      | anynonarray | text
(4 rows)

因為integer可以轉換為text,PostgreSQL無法在2779和2780之間無法做出選擇,因此出現錯誤:Could not choose a best candidate operator.

參考資料
PostgreSQL 源碼解讀(209)- 隱式類型轉換(func_select_candidate)
PostgreSQL 源碼解讀(210)- 隱式類型轉換(func_match_argtypes)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

轮台县| 疏附县| 镇沅| 临夏市| 乐陵市| 闵行区| 灌南县| 沂南县| 秦安县| 万荣县| 万源市| 上思县| 澜沧| 柞水县| 咸阳市| 攀枝花市| 庆云县| 星子县| 民县| 醴陵市| 独山县| 芦山县| 凯里市| 化州市| 彭泽县| 上饶市| 夹江县| 九龙坡区| 长治市| 乌兰浩特市| 呼图壁县| 渝中区| 郴州市| 阜平县| 尚义县| 江达县| 定陶县| 玛纳斯县| 达拉特旗| 犍为县| 民乐县|