Prepared Statements

Apache Doris PreparedStatement 之谜

使用的 Apache Doris 版本:3.0.3, 对应的 Doris 源码如果没有特意说明,均为 3.0.3 版本。

更新 #

后续又遇到了一个跟 prepared statement 相关的错误,起因是在一次迭代中将 DQ-1 的 gorm 版本从 v1.25.5 升级到了 v1.26.1 发现大量的 SQL 报错:

Error 1105 (HY000): errCode = 2, detailMessage = \nmismatched input 'LIMIT' expecting {<EOF>, ';'`);

但是 SQL 没有做过任何调整, 将 SQL 复制出来在 mysql shell 中都正常运行。

抓包可以发现,这个错误是在 COM_STMT_PREPARE 阶段报出的, 如下图:

update-prepare-limit-variables
update-prepare-limit-variables

经过对比和查看 gorm 的发布历史,找到这样一个 PR:

#6806: let limit and offset use bind parameter

带来的影响就是把 limit 后面的变量在 prepare 阶段使用占位符号替代(之前的版本是直接使用的值而不是占位符)。恰恰 doris 还不支持如下这种语句,所以导致了上面的错误。

select * from user where id = ? limit ?;

原因是 doris 的 SQL 语法约定了, LIMIT OFFSET 后面必须要跟一个整型字面量:

...

访问量 访客数