NULLable column is rejected when domain definition includes a check with select -------------------------------------------------------------------------------
Key: CORE-6327 URL: http://tracker.firebirdsql.org/browse/CORE-6327 Project: Firebird Core Issue Type: Bug Affects Versions: 2.5.9 Environment: Windows 2012 R2 Reporter: Alvaro Castiello I have a table for several constants: (oversimplified) create table values ( id integer not nulll primary key, // will never change category varchar(100) not null, // all rows of the same category hold the values they can have value varchar(30) not null // displayed value ); "values" could have something like: 1 sex male 2 sex femenine 3 color blue 4 color red 5 color yellow now, a table that uses "values" create table models as ( // clothes model_id integer not null primary key, name varchar(100) not null, suitable_for sex_map references values(id), factory_color color_map references values(id) ) suitable_for and factory_color can be null because: suitable_for is NULL when the model is unisex and factory_color is NULL because it could be unknown. In order to restrict the values so a color won´t be confused with sex, I defined two domains as create domain sex_map integer check (value in (1,2)); create domain color_map integer check (value in (3,4,5)); so insert into models (model_id,name,suitable_for,factory_color) values (1,'model 1',null,null); runs fine but... later I realized that more colors could exists and also more sex values: 6 sex kid 7 sex girl 8 color green this would also implies to modify the domains every time a new record is inserted in values so, they are better defined as create domain sex_map integer check (value in select id from values where category='sex'); create domain color_map integer check (value in select id from values where category='color'); so here is the bug: Given such domain definitions this insert is rejected insert into models (model_id,name,suitable_for,factory_color) values (1,'model 1',null,null); with message The insert failed because a column definition includes validation constraints. validation error for column SUITABLE_FOR, value "*** null ***". (is nullable by definition) My guess is that the value NULL for SUITABLE_FOR causes the domain restriction to be evaluated as NULL in select id from values where category='color' which in turn is a NULL expression (to my knowledge) Finally, the logic of the constraint should be something like this if (SUITABLE_FOR.thevalue = result of the constraint) then accept the row the value SUITABLE_FOR is also NULL so this will evaluate as if (NULL = NULL) then accept the row which causes the error conclusion: not always a constraint restriction in a domain returns TRUE or FALSE. It may also evaluate to NULL -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://tracker.firebirdsql.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel