web.ts/drizzle/0000_functions.sql
2025-06-05 01:08:50 +01:00

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;