2015-08-20 4 views
0

Кажется, что NOWAIT не поддерживается HSQLDB в синтаксисе Oracle. версияhsqldb Режим Oracle выбрать для обновления NOWAIT

HSQLDB: 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) 
  1. Кто-нибудь знает, поддерживает ли HSQLDB это?
  2. Любые идеи, как избежать этого исключения без изменения исходного SQL. Я могу игнорировать функциональность NOWAIT в своих модульных тестах, но просто не могу изменить SQL. Дополнительная информация: мы используем spring-jbdc и JdbcTemplate и думаем о том, чтобы перехватить это, чтобы заменить sqls на NOWAIT как взлома в тестовой настройке JUnit.

ответ

2

Нашел ответ на мой вопрос, наконец, после копания исходного кода hsqldb на sourceforge.

Версия 2.3.3 HSQLDB НЕ поддерживает NOWAIT.

Я задал этот вопрос на своем дискуссионном форуме и поднял вопрос, однако его не похоже на GitHub, где вы можете создать проблему, чтобы формальный выпуск/запрос не был открыт.

Я получаю вместе с плохим взломом, теперь изменяясам код org.hsqldb.ParserDQL, чтобы просто игнорировать NOWAIT в SQL-запросе для обновления.

Если у кого-то есть лучший ответ, я приму их ответ.

UPDATE: (август-24-2015)

получил подтверждение от HSQLDB форума, NOWAIT будут игнорироваться. Тем временем я отправляю фрагмент кода, чтобы игнорировать NOWAIT, который я получил с форума sourceforge HSQLDB. Вы можете подождать следующей версии 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); 
      } 
     } 
    }