From 339a09f2e4020d3fc1d074aab6406bff9ba76ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Mon, 1 Feb 2021 19:03:31 +0100 Subject: [PATCH] Fix check in jobsets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current check happening in jobsets is incorrect. The wanted constraint is stated as follow : - If type is 0 (legacy), then the flake field should be null, and both nixExprInput and nixExprPath should be non-null - If type is 1 (flake), then the flake field should be non-null, and both nixExprInput and nixExprPath should be null The current version will not catch (i.e. it will accept) situations where you have for instance : type = 1, nixExprPath null, nixExprInput non-null, flake non-null This commit fixes that. I split(ted) that into two constraints, to make it more readable and easier to extend if a new type appears in the future. The complete query could be instead : ( type = 0 AND nixExprInput IS NOT NULL AND nixExprPath IS NOT NULL AND flake IS NULL ) OR ( type = 1 AND nixExprInput IS NULL AND nixExprPath IS NULL AND flake IS NOT NULL ) (but an "OR" cannot be split, hence the other formulation) --- src/sql/hydra.sql | 11 ++++++++--- src/sql/upgrade-74.sql | 9 +++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/sql/upgrade-74.sql diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index 2736929d..a73da0fb 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -84,9 +84,14 @@ create table Jobsets ( startTime integer, -- if jobset is currently running type integer not null default 0, -- 0 == legacy, 1 == flake flake text, - check (schedulingShares > 0), - check ((type = 0) = (nixExprInput is not null and nixExprPath is not null)), - check ((type = 1) = (flake is not null)), + constraint jobsets_schedulingshares_nonzero_check check (schedulingShares > 0), + constraint jobsets_type_known_check check (type = 0 or type = 1), + -- If the type is 0, then nixExprInput and nixExprPath should be non-null and other type-specific fields should be null + -- Otherwise the check passes + constraint jobsets_legacy_paths_check check ((type = 0) = (nixExprInput is not null and nixExprPath is not null and flake is null)), + -- If the type is 1, then flake should be non-null and other type-specific fields should be null + -- Otherwise the check passes + constraint jobsets_flake_paths_check check ((type = 1) = (nixExprInput is null and nixExprPath is null and flake is not null)), primary key (project, name), foreign key (project) references Projects(name) on delete cascade on update cascade, constraint Jobsets_id_unique UNIQUE(id) diff --git a/src/sql/upgrade-74.sql b/src/sql/upgrade-74.sql new file mode 100644 index 00000000..33120d30 --- /dev/null +++ b/src/sql/upgrade-74.sql @@ -0,0 +1,9 @@ +alter table Jobsets add constraint jobsets_type_known_check check (type = 0 or type = 1); +alter table Jobsets add constraint jobsets_legacy_paths_check check ((type = 0) = (nixExprInput is not null and nixExprPath is not null and flake is null)); +alter table Jobsets add constraint jobsets_flake_paths_check check ((type = 1) = (nixExprInput is null and nixExprPath is null and flake is not null)); +alter table Jobsets add constraint jobsets_schedulingshares_nonzero_check check (schedulingShares > 0); + +alter table Jobsets drop constraint if exists jobsets_schedulingshares_check; +alter table Jobsets drop constraint if exists jobsets_check; +alter table Jobsets drop constraint if exists jobsets_check1; +alter table Jobsets drop constraint if exists jobsets_check2;