是_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上,这个问题似乎已得到修复,并按预期工作。
答案 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步得到一个匹配(“确切 参数类型匹配“),因此用户定义的函数胜出 演员解释。