Я пытаюсь использовать Jooq для выполнения INSERT в базе данных PostgreSQL. Запрос завершается ошибкой, если строка содержит символ обратной косой черты с кодом состояния SQL: 42601, что означает СИНТАКСИЧЕСКУЮ ОШИБКУ.
- Джук: 3.4.4
- драйвер postgresql: 8.4-702.jdbc4
- PostgreSQL: «PostgreSQL 8.4.20 на x86_64-redhat-linux-gnu, скомпилированный GCC gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-разрядная версия»
- JDK 1.8.0_25
- Набор инструментов Spring 3.6.0.РЕЛИЗ
База данных:
CREATE TABLE datahub.test (
body TEXT NOT NULL
);
Код Jooq, сгенерированный с помощью maven:
- jooq-codegen-maven версии 3.4.4
- генератор.имя: org.jooq.util.DefaultGenerator
- генератор.база данных.имя: org.jooq.util.postgres.PostgresDatabase
Модульный тест
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/spring-config.xml"})
public class BatchExceptionJooqTest {
private static Logger log = LogManager.getLogger(BatchExceptionJooqTest.class);
@Autowired
private DSLContext db;
@Test
public void runBasicJooqTest(){
try{
final List<InsertQuery<TestRecord>> batchUpdate = Lists.newLinkedList();
InsertQuery<TestRecord> insertQuery = db.insertQuery(TEST);
insertQuery.addValue(TEST.BODY, "It's a bit more complicated than just doing copy and paste... :\\");
batchUpdate.add(insertQuery);
db.batch(batchUpdate).execute();
}catch(Exception e){
log.error(e);
}
}
}
Проблема
Тест не проходит с исключением:
26.12.2014, 17:11:16,490 [основная] ОШИБКА BatchExceptionJooqTest: 36: runBasicJooqTest - org.jooq.exception.DataAccessException: SQL [null]; Пакетная вставка 0 в "datahub". "тестовые" ("тело") значения ("Это немного сложнее, чем просто копирование и вставка... :\") была прервана. Вызовите getNextException, чтобы увидеть причину.
Тест проходит, если вместо String: "It's a bit more complicated than just doing copy and paste... :\\"
использовать String: "It's a bit more complicated than just doing copy and paste... :\\\\"
. Это кажется немного непоследовательным по сравнению с тем, что происходит с одинарной кавычкой во время операции. Он корректно дублируется, чтобы пройти парсер SQL. Не так с обратной косой чертой.
Я где-то читал, что экранирование обратной косой черты другой обратной косой чертой не является частью стандарта SQL, и в последнее время Postgre изменил свое поведение по умолчанию. Однако мне не совсем понятен смысл руководства, стр. 4.1.2.2. - похоже, это указывает на то, что двойная обратная косая черта должна работать, и у jooq нет причин не делать этого.
Итак... может кто-нибудь объяснить, если описанная ситуация в Jooq:
- Является ли желаемое поведение и нет обходного пути, кроме удвоения всех входящих обратных косых черт, которые обрабатывает мое приложение?
- Это желаемое поведение, но есть изменение конфигурации, которое я могу сделать, чтобы Jooq обрабатывал обратную косую черту аналогично одинарным кавычкам?
- Это ошибка?
- Что я делаю неправильно?
Спасибо