GaussDB(DWS)入参类型为any的函数为什么执行会报错?
【摘要】 any类型作为伪类型实际支持任意类型,但是为什么执行any作为入参的函数时,会报函数不存在呢?
直接从案例出发。
(一)案例背景
客户执行窗口函数lag报错
postgres=# SELECT LAG(c2, c1, 0) OVER (PARTITION BY c1 ORDER BY c2), c1, c2 FROM test1;
ERROR: function lag(bigint, integer, integer) does not exist
从报错看,是函数入参类型不匹配导致的。
(二)问题排查
先看一下表定义和函数定义
postgres=# \d+ test1
Table "public.test1"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-------------------+-----------+----------+--------------+-------------
c1 | integer | | plain | |
c2 | bigint | | plain | |
c3 | character varying | | extended | |
Has OIDs: no
Distribute By: ROUND ROBIN
Location Nodes: ALL DATANODES
Options: orientation=row, compression=no
postgres=# \df+ lag
List of functions
Schema | Name | Result data type | Argument data types | Type | Volatility | Strict | Shippable | Owner | Language | Source code | Description | Fenced mode | From package
------------+------+------------------+---------------------------------+--------+------------+--------+-----------+-----------+----------+------------------------------------+------------------------------------------------+-------------+--------------
pg_catalog | lag | anyelement | anyelement | window | immutable | t | | c30024897 | internal | window_lag | fetch the preceding row value | f | f
pg_catalog | lag | anyelement | anyelement, integer | window | immutable | t | | c30024897 | internal | window_lag_with_offset | fetch the Nth preceding row value | f | f
pg_catalog | lag | anyelement | anyelement, integer, anyelement | window | immutable | t | | c30024897 | internal | window_lag_with_offset_and_default | fetch the Nth preceding row value with default | f | f
(3 rows)
从函数定义看,本次查询入参对应anyelement, integer, anyelement,而anyelement作为伪类型,理论上应该支持任意类型入参才对,为什么这里bigint, integer, integer会报错呢?
这是因为同一个函数中,出现多个anyelement,需要保证类型一样。
对应上面查询就是第1,3个入参需要保证类型一致。
postgres=# SELECT LAG(c2, c1, 0::bigint) OVER (PARTITION BY c1 ORDER BY c2), c1, c2 FROM test1;
lag | c1 | c2
-----+----+----
(0 rows)
重新尝试后,不再报错
3. 解决方案
该类问题需要先查询函数定义,再根据入参要求,保证多个anyelement类型一致。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)