Добры день. Подскажите как правильно сделать CONSTRAINT EXCLUDE USING gist
Чтоб проверял пересечение массивов, но пустые массивы считал за "любое значение"
Для пробы сделал нечто
CREATE OR REPLACE FUNCTION intersect_array_with_empty(a1 int[], a2 int[])
RETURNS BOOLEAN AS $$
SELECT cardinality(a1) = 0 OR cardinality(a2) = 0 OR a1 && a2;
$$ LANGUAGE SQL IMMUTABLE;
DROP OPERATOR &&?(int[], int[]);
CREATE OPERATOR &&? (
LEFTARG = int[],
RIGHTARG = int[],
PROCEDURE = intersect_array_with_empty
);
select '{}'::int[] &&? '{}'::int[];
select(intersect_array_with_empty('{}'::int[], '{}'::int[]));
в примитивном виде работает, ограничение не работает
ALTER TABLE t
ADD CONSTRAINT t_test
EXCLUDE USING gist (a WITH &&, b WITH &&?, c WITH &&?, daterange(d1, d2, '[]') WITH &&);
[42809] ОШИБКА: оператор &&?(integer[],integer[]) не коммутативен Подробности: В ограничениях-исключениях могут использоваться только коммутативные операторы.