GaussDB(DWS)入参类型为any的函数为什么执行会报错?

举报
-CHEN111- 发表于 2023/12/04 11:00:35 2023/12/04
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。