PostgreSQL -Переполнение Smallint при создании индекса для нескольких столбцов. Это ошибка?

У меня возникла проблема со вставкой значения 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.

5
задан Mike Christensen 5 August 2012 в 05:11
поделиться