液基和功能指数

Liquibase and functional index

如果您在使用 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]

PoC on GitHub

老实说,我不知道从哪里出现了这样一个奇怪的脚本补充(关于这个 [*])。也许 H2 不明白你需要使用哪个字段并替换 Vilcard 或类似的东西。

是的,我知道 H2 和真正的 PostgreSQL 的实现可能存在冲突和差异(如果那样的话,在 PostgreSQL 脚本上正确执行),但我想了解是什么导致了这种变化的产生剧本。

来自 H2 的错误消息中的

[*] 标记了发现语法错误的位置。 H2 不支持表达式索引,您只能索引列。

H2 支持计算列上的索引,因此可以使用您的函数添加计算列,对其进行索引,并在查询中使用此计算列而不是基列上的函数,在这种情况下可以使用此索引.但我认为如果您的主要数据库系统是 PostgreSQL,那不是您的意图。如果您仅将 H2 用于某些测试,则从 H2 的变更集中删除此类不兼容索引的创建更为合理。