Проблемы с совместимостью HSQLDB с postgres - PullRequest
0 голосов
/ 05 мая 2018

Мой запрос Postgres включает SELECT FOR UPDATE.

Запрос:

UPDATE TABLE_NAME SET COL1 = 'C1' WHERE COL2 IN 
(SELECT COL2 FROM TABLE_NAME WHERE COL3 = 'C3' LIMIT 1 FOR UPDATE SKIP LOCKED)

Использование HSQLDB для тестирования. У него нет поддержки FOR UPDATE. Обновлен с HSQLDB2 = 2.2 до 2.3.3 до 2.4.0. Но безуспешно. Пожалуйста, предложите какой-нибудь обходной путь или я что-то упустил.

Также добавлено это:

sql.syntax pgs=true;

Исключение:

java.lang.reflect.UndeclaredThrowableException at com.sun.proxy. $ Proxy43.update (неизвестный источник) Причина: java.lang.reflect.InvocationTargetException Причина: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; неверная грамматика SQL [UPDATE TABLE_NAME установлено COL1 знак равно где COL2 in (выберите COL2 из TABLE_NAME, где COL3 =? предел? ДЛЯ Пропущенного обновления)); вложенное исключение java.sql.SQLSyntaxErrorException: неожиданный токен: FOR required:) в org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate (SQLExceptionSubclassTranslator.java:91) в org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate (AbstractFallbackSQLExceptionTranslator.java:73) в org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate (AbstractFallbackSQLExceptionTranslator.java:82) в org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:655) в org.springframework.jdbc.core.JdbcTemplate.update (JdbcTemplate.java:876) в org.springframework.jdbc.core.JdbcTemplate.update (JdbcTemplate.java:937) в org.springframework.jdbc.core.JdbcTemplate.update (JdbcTemplate.java:942) Вызвано: java.sql.SQLSyntaxErrorException: неожиданный токен: FOR обязательно:) в org.hsqldb.jdbc.Util.sqlException (неизвестный источник) в org.hsqldb.jdbc.Util.sqlException (неизвестный источник) в org.hsqldb.jdbc.JDBCPreparedStatement. (Неизвестный источник) в org.hsqldb.jdbc.JDBCConnection.prepareStatement (неизвестный источник) в com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement (NewProxyConnection.java:387) в org.springframework.jdbc.core.JdbcTemplate $ SimplePreparedStatementCreator.createPreparedStatement (JdbcTemplate.java:1530) в org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:633) Вызвано: org.hsqldb.HsqlException: неожиданный токен: FOR required:) в org.hsqldb.error.Error.parseError (неизвестный источник) в org.hsqldb.ParserBase.unexpectedTokenRequire (неизвестный источник) в org.hsqldb.ParserBase.readThis (Неизвестный источник) в org.hsqldb.ParserDQL.XreadInPredicateRightPart (Неизвестный источник) в org.hsqldb.ParserDQL.XreadPredicateRightPart (неизвестный источник) в org.hsqldb.ParserDQL.XreadBooleanPrimaryOrNull (неизвестный источник) в org.hsqldb.ParserDQL.XreadBooleanTestOrNull (неизвестный источник) в org.hsqldb.ParserDQL.XreadBooleanFactorOrNull (неизвестный источник) в org.hsqldb.ParserDQL.XreadBooleanTermOrNull (неизвестный источник) в org.hsqldb.ParserDQL.XreadBooleanValueExpression (неизвестный источник) в org.hsqldb.ParserDML.compileUpdateStatement (неизвестный источник) в org.hsqldb.ParserCommand.compilePart (неизвестный источник) в org.hsqldb.ParserCommand.compileStatement (неизвестный источник) в org.hsqldb.Session.compileStatement (неизвестный источник) в org.hsqldb.StatementManager.compile (неизвестный источник) в org.hsqldb.Session.execute (неизвестный источник)

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Если упомянутое вами sql.syntax pgs=true; является свойством URL, оно должно иметь подчеркивание, а не пробел, вот так: sql.syntax_pgs=true;

Однако, если вы хотите установить режим совместимости как запрос к базе данных, вы можете выполнить: SET DATABASE SQL SYNTAX PGS TRUE

0 голосов
/ 05 мая 2018

Этот синтаксис запроса специфичен для поддержки блокировки строк в PostgreSQL. Вы можете изменить запрос для HSQLDB как:

UPDATE TABLE_NAME SET COL1 = 'C1' WHERE COL2 IN 
(SELECT COL2 FROM TABLE_NAME WHERE COL3 = 'C3' LIMIT 1)

На самом деле этот упрощенный запрос делает то же самое в HSQLDB, но может иметь разные результаты при использовании с PostgreSQL:

UPDATE TABLE_NAME SET COL1 = 'C1' WHERE COL3 = 'C3'
...