Обеспечение не двусмысленных ссылок на имена столбцов в HSQLDB - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть HQL-запрос, который не выполняется в PostgreSQL, так как предложение order by содержит неоднозначную ссылку на столбец. Я понимаю причину проблемы и как ее устранить, однако модульные тесты, проверяющие один и тот же запрос и порядок по пунктам, проходят без ошибок при работе с базой данных HSQLDB в памяти. Я хочу убедиться, что все мои модульные тесты, выполняющиеся на HSQLDB в сборках CI, не будут работать, если они столкнутся с похожими проблемами в других запросах.

Чтение руководства HSQLDB (http://hsqldb.org/doc/2.0/guide/guide.pdf) показывает, что есть несколько настроек, которыеотключено по умолчанию, где их включение будет принудительно проверять соответствие объекта и запросов БД стандартам SQL.

Я считаю, что мне нужно установить значение sql.enforce_refs=true в URL-адресе подключения JDBC, чтобы тест не прошел, когдавстречается неоднозначная ссылка.

Я обновил свой URL, теперь он выглядит следующим образом.

jdbc.url=jdbc:hsqldb:mem:testdb;shutdown=false;sql.enforce_refs=true;sql.restrict_exec=true;sql.enforce_type=true

(Примечание: я также включил sql.enforce_names=true, но это вызвало многосбоев, которые я еще не исследовал).

Проблема, с которой я столкнулся, заключается в том, что даже с этими настройками в URL-адресе подключения тесты продолжают проходить. Похоже, HSQLDB не выполняет проверку. IЯ не обнаружил никаких проблем, связанных с этим параметром, и я использую последнюю версию HSQLDB (в настоящее время 2.5.0).

Моя проблема в том, что я хочу применить эту проверку viпараметр URL-адреса подключения, чтобы обнаружить эти проблемы в то время, когда сборка CI выполняет модульные тесты, и кажется, что параметр не работает, поэтому я хотел бы знать, является ли это известной проблемой илисделал что-то не так, или если кому-то еще удалось включить эту проверку по-другому? (Я действительно не хочу выполнять команду SET DATABASE..., чтобы включить эту проверку).

Большое спасибо, Роб


Редактировать: 4/11/19

Пример SQL включен, чтобы помочь с решением проблем. Обратите внимание, что моя проблема не в этом SQL, а в использовании параметров в строке подключения HSQLDB для обнаружения такого рода проблем SQL при выполнении тестов в сборке CI.

    select
        f.ID as ID1_98_,
        f.PROP_A as PROP_A2_98_,
        f.CLOSE_DATE as CLOSE_DA3_98_,
    from
        FOO f 
    left outer join
        FOO_SUB_TYPE fst 
            on f.FOO_SUB_TYPE_FK=fst.ID 
    left outer join
        FOO_TYPE ft 
            on fst.ID=ft.ID 
    where
        ?=f.WIBBLE_FK 
    order by
        id ASC nulls last

SQL генерируетсяиз Hibernate HQL, как показано ниже:

from Foo f
left outer join f.fooSubType as fst
where (:wibbleId = f.wibble.id)

Я не являюсь автором HQL / SQL (за исключением изменения имен таблиц / классов сущностей здесь), и, на мой взгляд, left outer join не требуется. Как я уже сказал, SQL на самом деле не очень важен, проблема заключается в том, чтобы обнаружить проблему неоднозначных ссылок в SQL / HQL (которых в кодовой базе много).

1 Ответ

1 голос
/ 07 ноября 2019

Запрос, сгенерированный Hibernate, имеет f.ID as ID1_98_. Предложение ORDER BY id не должно выполняться в строгом SQL, поскольку оно переименовано в столбец ID.

Более 10 лет назад HSQLDB принял этот запрос на совместимость с некоторыми другими базами данных. В последние годы в настройки совместимости были добавлены строгие проверки. sql.enforce_refs охватывает случай, когда в списке выбора есть два столбца с именем ID, но не охватывает этот случай. Мы можем добавить этот случай в следующую версию.

Что касается использования HSQLDB для тестирования приложений базы данных, вам все равно необходимо время от времени запускать тесты с намеченной целью, чтобы избежать ложноположительных результатов.

...