在 sourceforge 上挖掘 hsqldb 源代码后终于找到了我自己问题的答案。
HSQLDB 2.3.3 版本不支持NOWAIT。
我在他们的讨论论坛中提出了这个问题并提出了这个问题,但是它不像 GitHub,您可以在其中创建问题,因此没有打开正式的问题/请求。
我正在与一个糟糕的黑客相处,现在正在修改HSQLDB
我自己编码org.hsqldb.ParserDQL
类以忽略 select-for-update SQL 中的 NOWAIT。
如果有人有更好的答案,我会接受他们的答案。
更新:(2015 年 8 月 24 日)
收到 HSQLDB 论坛的确认,NOWAIT 将被忽略。同时,我发布了代码片段以忽略从 HSQLDB sourceforge 论坛收到的NOWAIT。您可能想要等待 HSQLDB 的下一个版本,而不是将其添加到您的代码库中(作为黑客)。
if (Tokens.T_NOWAIT.equals(token.tokenString)) {
read();
}
已更新以显示有关在 ParserDQL.java 中添加上述代码片段的完整上下文
/**
* Retrieves a SELECT or other query expression Statement from this parse context.
*/
StatementQuery compileCursorSpecification(RangeGroup[] rangeGroups,
int props, boolean isRoutine) {
OrderedHashSet colNames = null;
QueryExpression queryExpression = XreadQueryExpression();
if (token.tokenType == Tokens.FOR) {
read();
if (token.tokenType == Tokens.READ
|| token.tokenType == Tokens.FETCH) {
read();
readThis(Tokens.ONLY);
props = ResultProperties.addUpdatable(props, false);
} else {
readThis(Tokens.UPDATE);
props = ResultProperties.addUpdatable(props, true);
if (token.tokenType == Tokens.OF) {
readThis(Tokens.OF);
colNames = new OrderedHashSet();
readColumnNameList(colNames, null, false);
}
if (Tokens.T_NOWAIT.equalsIgnoreCase(token.tokenString)) {
readIfThis(Tokens.X_IDENTIFIER);
}
}
}