1
0
mirror of https://github.com/chylex/Advent-of-Code.git synced 2025-06-11 23:34:03 +02:00
Advent-of-Code/2017/utils/procedures.sql

46 lines
1.2 KiB
PL/PgSQL

CREATE OR REPLACE PROCEDURE aoc_drop_tables(day TEXT) AS
$$
DECLARE
row RECORD;
BEGIN
FOR row IN
SELECT table_name
FROM information_schema.tables
WHERE table_name LIKE (day || '.%') AND table_schema = CURRENT_SCHEMA()
LOOP
EXECUTE FORMAT('DROP TABLE %I CASCADE', row.table_name);
END LOOP;
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE aoc_setup_tables(day TEXT, input_columns TEXT) AS
$$
BEGIN
CALL aoc_drop_tables(day);
EXECUTE FORMAT('CREATE TABLE %I (%s)', day || '.input', input_columns);
EXECUTE FORMAT('CREATE TABLE %I (part INT, result TEXT NULL)', day || '.output');
EXECUTE FORMAT('INSERT INTO %I (part) VALUES (1), (2)', day || '.output');
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION aoc_results(day TEXT)
RETURNS TABLE (
RESULT TEXT
)
STABLE
ROWS 2
AS
$$
BEGIN
RETURN QUERY EXECUTE FORMAT('SELECT CONCAT(''Part '', part, '' : '', result) FROM %I WHERE result IS NOT NULL ORDER BY part', day || '.output');
END
$$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE aoc_text_file(day TEXT) AS
$$
BEGIN
CALL aoc_setup_tables(day, 'input TEXT');
EXECUTE FORMAT('COPY %I FROM ''/aoc/%s/input.txt''', day || '.input', day);
END
$$ LANGUAGE plpgsql;