70 lines
1.7 KiB
MySQL
70 lines
1.7 KiB
MySQL
|
-- +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 users USING B-TREE (id);
|
||
|
CREATE INDEX ON users USING B-TREE (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 REFERENCES users ON DELETE CASCADE,
|
||
|
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),
|
||
|
CHECK (length(name) != 0),
|
||
|
CHECK (length(description) != 0)
|
||
|
);
|
||
|
|
||
|
CREATE INDEX ON users USING B-TREE (id);
|
||
|
CREATE INDEX ON users USING B-TREE (id,user_id,problem_id,language_id);
|
||
|
|
||
|
-- +goose StatementEnd
|
||
|
|
||
|
-- +goose Down
|
||
|
DROP TABLE IF EXISTS tests;
|
||
|
DROP TABLE IF EXISTS solutions;
|