47 lines
1.2 KiB
PL/PgSQL
47 lines
1.2 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION enum_array_to_bitmask(anyarray)
|
|
RETURNS bigint AS $$
|
|
DECLARE
|
|
result bigint := 0;
|
|
val text;
|
|
enum_vals text[];
|
|
i int;
|
|
BEGIN
|
|
-- Get all possible values of the enum type
|
|
EXECUTE format('SELECT enum_range(NULL::%s)', pg_typeof($1[1])::text) INTO enum_vals;
|
|
|
|
-- Loop through input array and compute the bitmask
|
|
FOREACH val IN ARRAY $1 LOOP
|
|
FOR i IN 1 .. array_length(enum_vals, 1) LOOP
|
|
IF enum_vals[i] = val THEN
|
|
result := result + (1::bigint << (i - 1));
|
|
EXIT;
|
|
END IF;
|
|
END LOOP;
|
|
END LOOP;
|
|
|
|
RETURN result;
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
--> statement-breakpoint
|
|
CREATE OR REPLACE FUNCTION enum_to_bitmask(anyenum)
|
|
RETURNS bigint AS $$
|
|
DECLARE
|
|
enum_vals text[];
|
|
val text := $1::text;
|
|
i int;
|
|
BEGIN
|
|
-- Get all possible enum values of the input type
|
|
EXECUTE format('SELECT enum_range(NULL::%s)', pg_typeof($1)::text) INTO enum_vals;
|
|
|
|
-- Find the position of the value
|
|
FOR i IN 1 .. array_length(enum_vals, 1) LOOP
|
|
IF enum_vals[i] = val THEN
|
|
RETURN i;
|
|
END IF;
|
|
END LOOP;
|
|
|
|
-- If not found return 0
|
|
RETURN 0;
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|