2014-11-24 2 views
4

В процессе написания программы, которая принимает литералы tsrange от пользователя, которые затем подключаются к различным SQL-запросам, сегодня я тестировал некоторые tsranges, чтобы увидеть, как они интерпретируются PostgreSQL 9.3.5.PostgreSQL tsrange: правильно ли для lower_inf ('(- infinity, today)' :: tsrange) false?

Это один, в частности, ведет себя странно: '(-Infinity, сегодня)' :: tsrange

Функция lower_inf говорит нижняя граница не бесконечна

test=> SELECT lower_inf('(-infinity,today)'::tsrange); 
lower_inf 
----------- 
f 
(1 row) 

Еще PostgreSQL (!) сообщает, что этот tsrange содержит отметку времени, например «1000-01-01 BC». , ,

test=> SELECT '(-infinity,today)'::tsrange @> '1000-01-01 BC'::timestamp; 
?column? 
---------- 
t 
(1 row) 

Может ли кто-нибудь пролить свет на это?

+1

Выглядит достаточно подозреваемый, чтобы оправдать сообщение об ошибке для меня. –

+0

@CraigRinger: Я тоже так думал. Но, оказывается, это задокументировано. Более похоже на неудачное двойное использование термина «бесконечность». –

ответ

6

Путаница происходит от двух разных значений «бесконечности» здесь.

  1. timestamp типы принимают special values for infinity and -infinity.
  2. Типы диапазонов имеют общее понятие для диапазонов без нижней/верхней границы. Функции для тестирования для него называются lower_inf() and upper_inf(), но они действительно тестируют «без ограничений» в диапазоне. Диапазоны без верхней/нижней границы включаютзначениеinfinity/-infinity для timestamp соответственно.

Per documentation:

Кроме того, некоторые типы элементов имеют понятие «бесконечность», но это просто другое значение постольку, поскольку механизмы типа диапазона обеспокоены. Например, для , в диапазонах временных интервалов, [today,] означает то же, что и [today,). Но [today,infinity] означает что-то отличное от [today,infinity) - последнее исключает специальное значение временной отметки infinity.

SQL Fiddle.

Может эти функции должны быть действительно называется что-то вроде lower_nobound() и upper_nobound(), чтобы избежать путаницы ...

+0

Хорошо пойман и хорошо объяснен. Я должен был понять, что это то, что происходило, но не удалось RTFM. –

+0

На самом деле я прочитал этот фрагмент в документации, но не понял, как «бесконечность как просто другое значение» отличается от бесконечного интервала. Как бесконечность может быть «просто другой ценностью» и как [сегодня, бесконечность] отличается от [сегодня, бесконечности]? – smithfarm

+0

@smithfarm: ответ находится в цитате из документов. –