如果您在使用Liquibase时尝试执行脚本以在H2(面向PostgreSQL的上下文(上创建函数索引,则会发生可疑错误。
脚本本身看起来是这样的:
<changeSet id="2" author="...">
<createIndex tableName="test_table" indexName="test_table_id_idx">
<column name="(date_trunc('day', create_date))"/>
</createIndex>
</changeSet>
错误消息:
Syntax error in SQL statement "CREATE INDEX TEST_TABLE_ID_IDX ON TEST_TABLE(([*]DATE_TRUNC('day', CREATE_DATE)))"; expected "identifier";
SQL statement: CREATE INDEX test_table_id_idx ON test_table((date_trunc('day', create_date))) [42001-200]
GitHub 上的PoC
老实说,我不知道剧本中出现了这样一个奇怪的补充(关于这个[*]
(。也许H2不知道你需要使用哪个领域,而是用维尔卡或类似的东西代替。
是的,我知道H2和真正的PostgreSQL实现中可能存在的冲突和差异(如果这样的话,在PostgreSQL脚本上执行正确(,但我想了解是什么导致了脚本的这种变化。
[*]
标记发现语法错误的位置。H2不支持对表达式进行索引,只能对列进行索引。
H2支持计算列上的索引,因此可以使用函数添加计算列,对其进行索引,并在查询中使用此计算列而不是基列上的函数,在这种情况下可以使用此索引。但我认为,如果你的主要数据库系统是PostgreSQL,这不是你的意图。如果您只在某些测试中使用H2,那么从H2的变更集中删除创建此类不兼容索引是更合理的。