Mein Algorithmus funktionierte gut, aber mit einer neuen großen Datenbank überschreitet meine Ganzzahlvariable die maximale Grenzgröße. (Ich benutze den Powerset-Algorithmus: https://www.postgresql.org/message-id/20060924054759.GA71934%40winnie.fuhr.org)Postgresql FEHLER: Operator existiert nicht: bigint << bigint
Also habe ich beschlossen, alle meine Ganzzahl zu Bigint zu ändern, aber jetzt habe ich ein Problem mit dem Vergleichsoperator ... Ich weiß nicht, wie es zu verwalten:
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;
ich habe den Fehler in Zeile bekam:
FOR i IN 1 .. COALESCE((CAST(1 AS BIGINT) << (aupper - alower + 1)) - 1, 0) LOOP
Fehler 42883 Postgresql eRROR: Operator existiert nicht: Bigint < < Bigint
Dank sein! Was ist der Unterschied zwischen int2shl, int4shl, int8shl so? Also muss ich es für alle meine Algorithmus tun? Jeder Vergleichsoperator muss in seiner Funktion geändert werden? –
Siehe die aktualisierte Antwort. – klin