Обратная косая черта в предложении INSERT Jooq/PostgreSQL

Я пытаюсь использовать 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:

  1. Является ли желаемое поведение и нет обходного пути, кроме удвоения всех входящих обратных косых черт, которые обрабатывает мое приложение?
  2. Это желаемое поведение, но есть изменение конфигурации, которое я могу сделать, чтобы Jooq обрабатывал обратную косую черту аналогично одинарным кавычкам?
  3. Это ошибка?
  4. Что я делаю неправильно?

Спасибо


person Tarmo    schedule 26.12.2014    source источник


Ответы (2)


Вы используете PostgreSQL 8.x. В этой версии система по умолчанию принимала экранированные строковые литералы с обратной косой чертой даже без предшествующего E.

Чтобы избежать этого, вы должны установить переменную конфигурации сервера standard_conforming_strings в ON.

Конечно, настоятельно рекомендуется перейти на версию PostgreSQL выше 8.x, так как версии 8.x устарели и больше не поддерживаются.

person RealSkeptic    schedule 26.12.2014
comment
Будет ли этот боковой флаг Postgre влиять на то, как Jooq форматирует строку параметра, отправляемую в базу данных? Самое странное, что Jooq форматирует одинарные кавычки, но не обратную косую черту. - person Tarmo; 27.12.2014
comment
@Tarmo: jOOQ явно не поддерживает PostgreSQL 8.x со всеми причудами, которые существовали, когда эта версия была свежей. Другими словами, jOOQ не знает об этом конкретном поведении. - person Lukas Eder; 27.12.2014
comment
Лукас Эдер прав. Что касается jOOQ, обратная косая черта внутри строки не является специальным символом. Включив параметр конфигурации, о котором я упоминал, вы сделаете PostgreSQL 8.x совместимой с предыдущими версиями. - person RealSkeptic; 27.12.2014