CREATE OR REPLACE FUNCTION core.get_associated_units(integer)
RETURNS TABLE(unit_id integer, unit_code text, unit_name text)
LANGUAGE plpgsql
AS $function$
DECLARE root_unit_id integer;
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS temp_unit(unit_id integer) ON COMMIT DROP;
SELECT core.get_root_unit_id($1) INTO root_unit_id;
INSERT INTO temp_unit(unit_id)
SELECT root_unit_id
WHERE NOT EXISTS
(
SELECT * FROM temp_unit
WHERE temp_unit.unit_id=root_unit_id
);
WITH RECURSIVE cte(unit_id)
AS
(
SELECT
compare_unit_id
FROM
core.compound_units
WHERE
base_unit_id = root_unit_id
UNION ALL
SELECT
units.compare_unit_id
FROM
core.compound_units units
INNER JOIN cte
ON cte.unit_id = units.base_unit_id
)
INSERT INTO temp_unit(unit_id)
SELECT cte.unit_id FROM cte;
DELETE FROM temp_unit
WHERE temp_unit.unit_id IS NULL;
RETURN QUERY
SELECT
core.units.unit_id,
core.units.unit_code::text,
core.units.unit_name::text
FROM
core.units
WHERE
core.units.unit_id
IN
(
SELECT temp_unit.unit_id FROM temp_unit
);
END
$function$