H2嵌入式DB LIMIT + OFFSET> Integer.MAX_VALUE导致错误的结果

时间:2019-07-09 08:38:54

标签: sql h2

使用H2 SQL查询会产生奇怪的行为。在Ubuntu Linux上使用Java8,spring-jdbc:4.3.13,h2:1.4.199。

更新:确认这是一个错误,请检查答案

我有一个这样的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

使用spring-jdbc和rowmappers涉及到Java代码,所以我不能轻易地将其粘贴在这里。

1 个答案:

答案 0 :(得分:1)

已在https://github.com/h2database/h2database/issues/2025报告并确认

  

此问题是由于SortOrder.sort(ArrayList,int,int)中的溢出引起的。

     

解决方法是避免在不需要限制时生成FETCH,LIMIT或TOP子句。