-- +goose Up -- +goose StatementBegin CREATE TABLE IF NOT EXISTS tests ( id serial NOT NULL, problem_id INT NOT NULL, PRIMARY KEY (id) ); CREATE INDEX ON tests USING BTREE (id); CREATE INDEX ON tests USING BTREE (problem_id); CREATE TABLE IF NOT EXISTS languages ( id serial NOT NULL, name VARCHAR(60) NOT NULL, build_file_hash CHAR(128) NOT NULL, execute_file_hash CHAR(128) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (id) ); CREATE FUNCTION lng_upd_trg_fn() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$; CREATE TRIGGER lng_upd_trg BEFORE UPDATE ON languages FOR EACH ROW EXECUTE PROCEDURE lng_upd_trg_fn(); CREATE TABLE IF NOT EXISTS solutions ( id serial NOT NULL, user_id INT NOT NULL, problem_id INT REFERENCES problems ON DELETE CASCADE, language_id INT REFERENCES languages ON DELETE CASCADE, contest_id INT NOT NULL, solution_hash CHAR(128) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (id) ); CREATE INDEX ON solutions USING BTREE (id); CREATE INDEX ON solutions USING BTREE (id,user_id,problem_id,language_id); -- +goose StatementEnd -- +goose Down DROP TABLE IF EXISTS tests; DROP TABLE IF EXISTS solutions;