abort; set local session authorization default; CREATE OR REPLACE FUNCTION array_distinct(anyarray) RETURNS anyarray AS $f$ SELECT array_agg(DISTINCT x) FROM unnest($1) t(x); $f$ LANGUAGE SQL IMMUTABLE; CREATE OR REPLACE FUNCTION lastRowCount() RETURNS bigint LANGUAGE plpgsql AS $$ DECLARE lastRowCount bigint; BEGIN GET DIAGNOSTICS lastRowCount = ROW_COUNT; RETURN lastRowCount; END; $$; -- ======================================================== -- Test Data helpers -- -------------------------------------------------------- CREATE OR REPLACE FUNCTION intToVarChar(i integer, len integer) RETURNS varchar LANGUAGE plpgsql AS $$ DECLARE partial varchar; BEGIN SELECT chr(ascii('a') + i%26) INTO partial; IF len > 1 THEN RETURN intToVarChar(i/26, len-1) || partial; ELSE RETURN partial; END IF; END; $$; select * from intToVarChar(211, 4); CREATE OR REPLACE FUNCTION randomInRange(min INTEGER, max INTEGER) RETURNS INT RETURNS NULL ON NULL INPUT language 'plpgsql' AS $$ BEGIN RETURN floor(random() * (max-min + 1) + min); END; $$; select * from randomInRange(0, 4); -- ======================================================== -- Test helpers -- -------------------------------------------------------- -- there are some random ractors in test data generation, thus a range has to be accepted CREATE OR REPLACE PROCEDURE expectBetween(actualCount integer, expectedFrom integer, expectedTo integer) LANGUAGE plpgsql AS $$ BEGIN IF NOT actualCount BETWEEN expectedFrom AND expectedTo THEN RAISE EXCEPTION 'count expected to be between % and %, but got %', expectedFrom, expectedTo, actualCount; END IF; END; $$;