sql - H2 嵌入式 DB LIMIT + OFFSET> Integer.MAX_VALUE 导致错误结果
问题描述
我从使用 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
),我得到 row(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 代码,所以我不能轻易地将它粘贴到这里。
解决方案
在https://github.com/h2database/h2database/issues/2025报告并确认
此问题是由 SortOrder.sort(ArrayList, int, int) 中的溢出引起的。
解决方法是避免在不需要限制时生成 FETCH、LIMIT 或 TOP 子句。
推荐阅读
- ruby-on-rails - 如何动态调度和等待 Promise
- python - 试图在 plotly 中绘制实时数据
- python - TypeError:“ObjectId”类型的对象不能使用 Flask 和 MongoDB 进行 JSON 序列化
- python-3.x - tkinter:由于 TKinter 中的单独进程,如何正确更新 GUI?
- arduino - 在结构中初始化 char 数组的问题。VS2019中的Arduion项目
- node.js - 请求 localAddress 超时
- python - Python 程序不写入 Excel 单元格
- python - Python PCA 实现
- computer-vision - 用火炬平均计算阿尔法值?
- php - 如何解析类似于 .ini 文件的格式化文本?