У меня возникла проблема со вставкой значения 32767 в столбец smallint
в Postgres, что приводило к ошибке smallint вне диапазона . Это было странно, потому что я мог:
SELECT 32767::int2;
Что будет работать нормально. После небольшого выдергивания волос я, наконец, отследил это до индекса в рассматриваемом столбце. Во-первых, вот схема (Ну, не совсем так, но я упростил ее до случая воспроизведения):
CREATE TABLE Test
(
id uuid NOT NULL,
cooktime smallint,
preptime smallint,
CONSTRAINT test_pkey PRIMARY KEY (id )
)
WITH (
OIDS=FALSE
);
Теперь я создаю следующий индекс:
CREATE INDEX idx_test_totaltime
ON Test
USING btree
((cooktime + preptime) );
Далее я пытаюсь создать следующую строку:
INSERT INTO Test (CookTime, PrepTime, Id)
VALUES (
(32767)::int2,
(10)::int2,
(E'fd47dc1e-c3c6-42c1-b058-689e926a72a4')::uuid
);
Я получаю сообщение об ошибке:
ERROR: smallint out of range SQL state: 22003
Кажется, что idx_test_totaltime
ожидает максимальное значение int2
, даже несмотря на то, что индекс применяется к сумме двух smallints.
Это ошибка Postgres или я упустил что-то простое? Есть ли способ обойти это ограничение ,или мне нужно сделать эти столбцы int4
и использовать ограничение CHECK, чтобы ограничить каждое значение до 32767? Я использую Postgres 9.0.0 (Да, мне нужно обновиться! ), но я создал скрипт SQL , который демонстрирует эту ошибку в 9.1.4.