64 lines
1.7 KiB
PL/PgSQL
64 lines
1.7 KiB
PL/PgSQL
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; $$;
|