H2 встроенная БД LIMIT + OFFSET> Integer.MAX_VALUE приводит к неверному результату - PullRequest
1 голос
/ 09 июля 2019

Я получаю странное поведение при использовании H2 SQL-запросов. Используя Java8, spring-jdbc: 4.3.13, h2: 1.4.199, в Ubuntu Linux.

Обновление: подтвердили, что это ошибка, проверьте ответ

У меня есть таблица PERSON, подобная этой:

id | name
1  | "John"
2  | "Jane"
3  | "Frank"

Когда я запускаю это подготовленное утверждение:

-- (Note ordering is descending.)
SELECT * FROM person ORDER BY id DESC LIMIT ? OFFSET ?
  • ОК, используя: (Integer.MAX_VALUE, 0), я получаю все 3 строки: [(3, Frank), (2, Jane), (1, John)]
  • ОК, используя: (20, 2), я получаю строку (1, John).
  • ОК, используя: (Integer.MAX_VALUE - 2, 2), я получаю (1, John)
  • НЕ в порядке, используя: (Integer.MAX_VALUE - 1, 2), я получаю (3, Frank)

Таким образом, смещение работает нормально, если я не использую очень большое число для предела, и в этом случае я понятия не имею, что происходит.

То же самое, если я попробую другие варианты, такие как "LIMIT?,?" (и переключение значений).

Так это ошибка или известное ограничение H2 / JDBC?

То же самое происходит, когда я жестко кодирую значения:

SELECT * FROM person ORDER BY id DESC LIMIT 2147483646 OFFSET 2

Java-код немного задействован с использованием spring-jdbc и rowmappers, поэтому я не могу легко вставить его сюда.

1 Ответ

1 голос
/ 10 июля 2019

Сообщено и подтверждено на https://github.com/h2database/h2database/issues/2025

Эта проблема вызвана переполнением в SortOrder.sort (ArrayList, int, int).

Обходной путь - избежать генерацииПредложение FETCH, LIMIT или TOP, когда ограничение не требуется.

...