强制对 HSQLDB 中的列名进行非歧义引用
Enforcing non-ambiguous references to column names in HSQLDB
我有一个 HQL 查询在 PostgreSQL 上失败,因为 order by 子句包含一个不明确的列引用。我了解问题的原因以及如何解决它,但是,当 运行 针对内存中的 HSQLDB 数据库时,测试相同查询和 order by 子句的单元测试没有错误地通过。我想确保 CI 构建中 HSQLDB 上的所有单元测试 运行 如果它们在其他查询中遇到类似问题,都会失败。
阅读 HSQLDB 指南 (http://hsqldb.org/doc/2.0/guide/guide.pdf) 发现有几个默认情况下禁用的设置,启用它们将强制检查 DB 对象和查询是否符合 SQL标准。
我相信我需要的设置是 JDBC 连接 URL 上的 sql.enforce_refs=true
,以便在遇到不明确的引用时测试失败。
我更新了我的 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 没有强制执行检查。
我没有发现关于此设置的任何问题报告,我使用的是最新的 HSQLDB 版本(当前为 2.5.0)。
我的问题是我想通过连接 URL 设置强制执行此检查,以便在 CI 构建执行单元测试时检测这些问题,但设置似乎没有工作,所以我想知道这是否是一个已知问题,或者我是否做错了什么,或者其他人是否设法以不同的方式启用了此检查?
(我真的不想执行 SET DATABASE...
命令来启用此检查)。
非常感谢,罗布
编辑:2019 年 4 月 11 日
包含示例 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 的作者(除了在这里更改 table / 实体 class 名称)并且在我看来 left outer join
是不必要。正如我所说,SQL 并不是很重要,问题是能够检测 SQL / HQL(代码库中有很多)中的模糊引用问题。
Hibernate 生成的查询有 f.ID as ID1_98_
。 ORDER BY id
子句在严格 SQL 中应该失败,因为它重命名了 ID
列。
10 多年前,HSQLDB 接受了此查询以与其他一些数据库兼容。近年来,增加了兼容性设置以允许严格检查。 sql.enforce_refs
涵盖了 select 列表中有两个名为 ID
的列的情况,但不涵盖这种情况。我们可能会在下一个版本中添加这种情况。
关于使用HSQLDB进行数据库应用程序测试,您仍需要不时运行使用预期目标进行测试,以避免误报结果。
我有一个 HQL 查询在 PostgreSQL 上失败,因为 order by 子句包含一个不明确的列引用。我了解问题的原因以及如何解决它,但是,当 运行 针对内存中的 HSQLDB 数据库时,测试相同查询和 order by 子句的单元测试没有错误地通过。我想确保 CI 构建中 HSQLDB 上的所有单元测试 运行 如果它们在其他查询中遇到类似问题,都会失败。
阅读 HSQLDB 指南 (http://hsqldb.org/doc/2.0/guide/guide.pdf) 发现有几个默认情况下禁用的设置,启用它们将强制检查 DB 对象和查询是否符合 SQL标准。
我相信我需要的设置是 JDBC 连接 URL 上的 sql.enforce_refs=true
,以便在遇到不明确的引用时测试失败。
我更新了我的 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 没有强制执行检查。 我没有发现关于此设置的任何问题报告,我使用的是最新的 HSQLDB 版本(当前为 2.5.0)。
我的问题是我想通过连接 URL 设置强制执行此检查,以便在 CI 构建执行单元测试时检测这些问题,但设置似乎没有工作,所以我想知道这是否是一个已知问题,或者我是否做错了什么,或者其他人是否设法以不同的方式启用了此检查?
(我真的不想执行 SET DATABASE...
命令来启用此检查)。
非常感谢,罗布
编辑:2019 年 4 月 11 日
包含示例 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 的作者(除了在这里更改 table / 实体 class 名称)并且在我看来 left outer join
是不必要。正如我所说,SQL 并不是很重要,问题是能够检测 SQL / HQL(代码库中有很多)中的模糊引用问题。
Hibernate 生成的查询有 f.ID as ID1_98_
。 ORDER BY id
子句在严格 SQL 中应该失败,因为它重命名了 ID
列。
10 多年前,HSQLDB 接受了此查询以与其他一些数据库兼容。近年来,增加了兼容性设置以允许严格检查。 sql.enforce_refs
涵盖了 select 列表中有两个名为 ID
的列的情况,但不涵盖这种情况。我们可能会在下一个版本中添加这种情况。
关于使用HSQLDB进行数据库应用程序测试,您仍需要不时运行使用预期目标进行测试,以避免误报结果。