关于期望数组

时间:2015-09-29 09:27:54

标签: sql postgresql

_c / _x某种Postgres 9.1保留字(或只是一个bug)?

我定义了一个名为_c的方法,在创建时没有给出错误,但是当我尝试调用该方法时,我得到一个关于错误数组格式的意外错误。

以下是您可以重现的方式:

# create or replace function _c(text) returns
text as $$
select $1;
$$ language sql immutable;

# select _c('test');
ERROR:  array value must start with "{" or dimension information

-- This works just fine, only _c returns error
# create or replace function _cc(text) returns
text as $$
select $1;
$$ language sql immutable;

# select _cc('test');
_cc  
------
 test
(1 row)

尝试了更多“字母”,似乎_x有同样的错误。

我只能在9.1中重现这一点,在9.4.4上,这个问题似乎已得到修复,并按预期工作。

2 个答案:

答案 0 :(得分:1)

PostgreSQL使用下划线前缀的名称来表示"(原始类型)"的数组,例如_int4是int4数组的内部类型名称,即int4[]

如果您还有一个名为c的表格,可能会让您感到困惑。

test=> select _c('fred');
ERROR:  malformed array literal: "fred"
LINE 1: select _c('fred');
                  ^
DETAIL:  Array value must start with "{" or dimension information.

test=> drop table c;
DROP TABLE

test=> select _c('fred');
  _c  
------
 fred
(1 row)

答案 1 :(得分:0)

转换参数有助于解析器找出正确的路径:

UPDATE TICKET 
   SET ELSDATE = TICKDATE 
 WHERE TICKDATE < CURDATE() /* AND ELSDATE IS NULL */

感谢Tom Lane在postgres邮件列表中指出:

  

发生的原因是数组类型的内部名称   c []是“_c”,搜索不明确的函数名称的顺序是   这样就可以选择函数式转换解释了   实际功能;看到   http://www.postgresql.org/docs/9.4/static/typeconv-func.html   特别是第3步。

     

根据需要使其工作的方法是将参数转换为   正确的类型:

     

选择_c('text':: text);

     

然后你在决议序列的第2步得到一个匹配(“确切   参数类型匹配“),因此用户定义的函数胜出   演员解释。

以下是完整帖子:http://www.postgresql.org/message-id/flat/16142.1443542877@sss.pgh.pa.us#16142.1443542877@sss.pgh.pa.us