成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PostgreSQLDBA(57)-Couldnotchooseabestcandidateoperator

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


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.從系統(tǒng)目錄pg_operator中找出匹配該操作符和操作數(shù)的候選函數(shù)(數(shù)據(jù)行);
2.根據(jù)隱式轉換規(guī)則選擇合適的operator.

原生PG
通過分析和跟蹤代碼,第一步,從pg_operator中選出的后續(xù)函數(shù)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,因此不會出錯.

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比盧龍網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式盧龍網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋盧龍地區(qū)。費用合理售后完善,10年實體公司更值得信賴。

創(chuàng)建integer -> text轉換
而創(chuàng)建了integer -> text的cast后,從pg_operator中選出的后續(xù)函數(shù)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之間無法做出選擇,因此出現(xiàn)錯誤:Could not choose a best candidate operator.

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

分享標題:PostgreSQLDBA(57)-Couldnotchooseabestcandidateoperator
文章來源:http://jinyejixie.com/article22/jjhccc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、搜索引擎優(yōu)化、自適應網(wǎng)站、用戶體驗、App設計定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司
涪陵区| 肇东市| 辽中县| 海兴县| 泰来县| 新干县| 旌德县| 莲花县| 沭阳县| 兴和县| 泰来县| 海兴县| 宜良县| 巫山县| 青岛市| 独山县| 弋阳县| 常熟市| 托里县| 信阳市| 周至县| 阜南县| 鹤峰县| 舟曲县| 庄河市| 绍兴县| 林州市| 花垣县| 囊谦县| 香格里拉县| 犍为县| 阿克| 崇礼县| 延寿县| 达拉特旗| 衡东县| 西华县| 闽侯县| 宣化县| 定西市| 岳阳市|