hsqldb Oracle 模式 select 用于更新 NOWAIT
hsqldb Oracle mode select for update NOWAIT
Oracle 语法中的 HSQLDB 似乎不支持 NOWAIT。
HSQL数据库版本:2.3.3
与
SET DATABASE SQL SYNTAX ORA TRUE;
SQL
上产生异常
select a, b, c from sometable where id=1 for update NOWAIT
异常
Caused by: org.hsqldb.HsqlException: unexpected token: NOWAIT
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
- 有谁知道 HSQLDB 不支持这个吗?
- 关于如何在不修改原始 SQL 的情况下避免此异常的任何想法。我可以忽略单元测试中的 NOWAIT 功能,但不能修改 SQL。附加信息:我们使用 spring-jbdc 和 JdbcTemplate 并考虑拦截它以将 sqls 替换为 NOWAIT 作为 JUnit 测试设置中的 hack。
在 sourceforge 上挖掘 hsqldb 源代码后,终于找到了我自己问题的答案。
HSQLDB 的 2.3.3 版不支持 NOWAIT。
我已经在他们的论坛中提出了这个问题并提出了这个问题,但是它不像 GitHub 你可以在其中创建一个问题所以没有正式的 Issue/Request 打开。
我正在与一个糟糕的 hack 相处,现在我自己修改 HSQLDB
代码 org.hsqldb.ParserDQL
class 以忽略 select-for-update [中的 NOWAIT SQL.
如果有人有更好的答案我会采纳他们的答案
更新:(2015 年 8 月 24 日)
从 HSQLDB 论坛收到确认,NOWAIT 将被忽略。同时,我发布了代码片段以忽略我从 HSQLDB sourceforge 论坛收到的 NOWAIT。您可能希望等待 HSQLDB 的下一个版本,而不是将其添加到您的代码库中(作为 hack)。
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);
}
}
}
Oracle 语法中的 HSQLDB 似乎不支持 NOWAIT。
HSQL数据库版本:2.3.3
与
SET DATABASE SQL SYNTAX ORA TRUE;
SQL
上产生异常select a, b, c from sometable where id=1 for update NOWAIT
异常
Caused by: org.hsqldb.HsqlException: unexpected token: NOWAIT
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
- 有谁知道 HSQLDB 不支持这个吗?
- 关于如何在不修改原始 SQL 的情况下避免此异常的任何想法。我可以忽略单元测试中的 NOWAIT 功能,但不能修改 SQL。附加信息:我们使用 spring-jbdc 和 JdbcTemplate 并考虑拦截它以将 sqls 替换为 NOWAIT 作为 JUnit 测试设置中的 hack。
在 sourceforge 上挖掘 hsqldb 源代码后,终于找到了我自己问题的答案。
HSQLDB 的 2.3.3 版不支持 NOWAIT。
我已经在他们的论坛中提出了这个问题并提出了这个问题,但是它不像 GitHub 你可以在其中创建一个问题所以没有正式的 Issue/Request 打开。
我正在与一个糟糕的 hack 相处,现在我自己修改 HSQLDB
代码 org.hsqldb.ParserDQL
class 以忽略 select-for-update [中的 NOWAIT SQL.
如果有人有更好的答案我会采纳他们的答案
更新:(2015 年 8 月 24 日)
从 HSQLDB 论坛收到确认,NOWAIT 将被忽略。同时,我发布了代码片段以忽略我从 HSQLDB sourceforge 论坛收到的 NOWAIT。您可能希望等待 HSQLDB 的下一个版本,而不是将其添加到您的代码库中(作为 hack)。
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);
}
}
}