代码之家  ›  专栏  ›  技术社区  ›  tkruse

h2 embedded db limit integer.max_值导致错误结果

  •  0
  • tkruse  · 技术社区  · 6 年前

    我通过使用h2 sql查询得到了奇怪的行为。在ubuntu linux上使用java8、spring jdbc:4.3.13、h2:1.4.199。

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

    我有一张这样的人桌:

    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,约翰)
    • 不可以使用:( Integer.MAX_VALUE - 1, 2 ),我得到 (3, Frank)

    所以偏移是正常工作的,除非我使用一个很高的数字作为极限,在这种情况下,我不知道发生了什么。

    如果我尝试其他变体,比如“limit?,“?”(并切换值)。

    那么这是一个bug,还是h2/jdbc的已知限制?

    当我硬编码这些值时也会发生同样的情况:

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

    Java代码使用Spring JDBC和RoMaMPES有点涉及,所以我不能很容易地粘贴到这里。

    0 回复  |  直到 6 年前
        1
  •  1
  •   tkruse    6 年前

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

    此问题是由sortorder.sort(arraylist,int,int)中的溢出引起的。

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

    推荐文章