首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql错误:操作符不存在: bigint << bigint

Postgresql错误:操作符不存在: bigint << bigint
EN

Stack Overflow用户
提问于 2017-11-21 20:27:27
回答 1查看 5.7K关注 0票数 0

我的算法工作得很好,但是有了一个新的大数据库,我的整数变量就超过了最大限制大小。(我使用powerset算法:https://www.postgresql.org/message-id/20060924054759.GA71934%40winnie.fuhr.org)

所以我决定把我所有的整数改为bigint,但是现在比较运算符有问题了.我不知道怎么处理:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION powerset(a anyarray)
  RETURNS SETOF anyarray AS
$BODY$
DECLARE
    retval  a%TYPE;
    alower  bigint := array_lower(a, 1);
    aupper  bigint := array_upper(a, 1);
    j       bigint;
    k       bigint;
BEGIN
    FOR i IN 1 .. COALESCE((CAST(1 AS BIGINT) << (aupper - alower + 1)) - 1, 0) LOOP
        retval := '{}';
        j := alower;
        k := i;

        WHILE k > CAST(0 AS BIGINT) LOOP
            IF k & CAST(1 AS BIGINT) = CAST(1 AS BIGINT) THEN
                retval := array_append(retval, a[j]);
            END IF;

            j := j + CAST(1 AS BIGINT);
            k := k >> CAST(1 AS BIGINT);
        END LOOP;

        RETURN NEXT retval;
    END LOOP;

    RETURN;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE STRICT
  COST 100
  ROWS 1000;
ALTER FUNCTION powerset(anyarray)
  OWNER TO postgres;

我在网上发现了错误:

代码语言:javascript
复制
FOR i IN 1 .. COALESCE((CAST(1 AS BIGINT) << (aupper - alower + 1)) - 1, 0) LOOP

错误42883 Postgresql错误:操作符不存在: bigint << bigint

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-21 20:43:59

位移位操作符的右操作数的类型是integer.,不幸的是,在文件。中没有提到这一点。

应将shift运算符的右操作数转换为integer:

代码语言:javascript
复制
-- instead of 
-- COALESCE((CAST(1 AS BIGINT) << (aupper - alower + 1)) - 1, 0)
-- use
select COALESCE(1 << (aupper - alower + 1)::int- 1, 0)::bigint

-- instead of
-- k := k >> CAST(1 AS BIGINT);
--- use
k := k >> 1;
-- etc

您可以通过查询系统目录来检查可能的操作数类型,例如:

代码语言:javascript
复制
select oprname, oprleft::regtype, oprright::regtype
from pg_operator
where oprname = '<<'
and oprcode::text like '%shl%' -- shift left functions

 oprname | oprleft  | oprright 
---------+----------+----------
 <<      | smallint | integer
 <<      | integer  | integer
 <<      | bigint   | integer
(3 rows)    

以上结果表明,运算符<< (位向左移位)的左操作数可以是smallint,integerbigint,而右操作数必须是integer.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47422103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档