Skip to content

Generating sql changelog and complex check constraints fails with "Duplicate key" error #321

Description

@menathan

In a scenario where more complex check constraints are defined on a table, for example:

ALTER TABLE catalog.schema.table
ADD CONSTRAINT complex_constraint
CHECK (
       (column_a = 'x' AND column_b IN ('value_a', 'value_b', 'value_c')) 
    OR (column_a = 'y' AND column_b IN ('value_a', 'value_c')) 
    OR (column_a = 'z' AND column_b IN ('value_a', 'value_c'))
);

the generate changelog command throws following error, unable to finish the command successfully:

[2025-09-30 16:03:01] SEVERE [liquibase.integration] Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
liquibase.exception.CommandExecutionException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at liquibase.command.CommandScope.execute(CommandScope.java:258)
    at liquibase.integration.commandline.CommandRunner.call(CommandRunner.java:51)
    at liquibase.integration.commandline.CommandRunner.call(CommandRunner.java:21)
    at picocli.CommandLine.executeUserObject(CommandLine.java:2045)
    at picocli.CommandLine.access$1500(CommandLine.java:148)
    at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2457)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2419)
    at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)
    at picocli.CommandLine$RunLast.execute(CommandLine.java:2421)
    at picocli.CommandLine.execute(CommandLine.java:2174)
    at liquibase.integration.commandline.LiquibaseCommandLine.lambda$execute$2(LiquibaseCommandLine.java:404)
    at liquibase.Scope.child(Scope.java:200)
    at liquibase.Scope.child(Scope.java:176)
    at liquibase.integration.commandline.LiquibaseCommandLine.lambda$execute$3(LiquibaseCommandLine.java:379)
    at liquibase.Scope.child(Scope.java:200)
    at liquibase.Scope.child(Scope.java:176)
    at liquibase.integration.commandline.LiquibaseCommandLine.execute(LiquibaseCommandLine.java:376)
    at liquibase.integration.commandline.LiquibaseCommandLine.main(LiquibaseCommandLine.java:97)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    at liquibase.integration.commandline.LiquibaseLauncher.main(LiquibaseLauncher.java:116)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at liquibase.diff.output.changelog.DiffToChangeLog.print(DiffToChangeLog.java:235)
    at liquibase.diff.output.changelog.DiffToChangeLog.print(DiffToChangeLog.java:125)
    at liquibase.command.core.GenerateChangelogCommandStep.run(GenerateChangelogCommandStep.java:155)
    at liquibase.command.CommandScope.execute(CommandScope.java:220)
    ... 23 more
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at liquibase.diff.output.changelog.DiffToChangeLog$1.run(DiffToChangeLog.java:218)
    at liquibase.Scope.lambda$child$0(Scope.java:191)
    at liquibase.Scope.child(Scope.java:200)
    at liquibase.Scope.child(Scope.java:190)
    at liquibase.Scope.child(Scope.java:169)
    at liquibase.diff.output.changelog.DiffToChangeLog.print(DiffToChangeLog.java:171)
    ... 26 more
Caused by: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135)
    at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182)
    at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at liquibase.ext.databricks.diff.output.changelog.ChangedTblPropertiesUtil.convertToMapExcludingDeltaParameters(ChangedTblPropertiesUtil.java:116)
    at liquibase.ext.databricks.diff.output.changelog.ChangedTblPropertiesUtil.getFilteredTblProperties(ChangedTblPropertiesUtil.java:123)
    at liquibase.ext.databricks.diff.output.changelog.MissingTableChangeGeneratorDatabricks.fixMissing(MissingTableChangeGeneratorDatabricks.java:36)
    at liquibase.diff.output.changelog.ChangeGeneratorChain.fixMissing(ChangeGeneratorChain.java:44)
    at liquibase.diff.output.changelog.ChangeGeneratorFactory.fixMissing(ChangeGeneratorFactory.java:94)
    at liquibase.diff.output.changelog.DiffToChangeLog.generateChangeSets(DiffToChangeLog.java:334)
    at liquibase.diff.output.changelog.DiffToChangeLog.printNew(DiffToChangeLog.java:258)
    at liquibase.diff.output.changelog.DiffToChangeLog$1.run(DiffToChangeLog.java:177)
    ... 31 more


Unexpected error running Liquibase: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')

liquibase.exception.CommandExecutionException: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at liquibase.command.CommandScope.execute(CommandScope.java:258)
    at liquibase.integration.commandline.CommandRunner.call(CommandRunner.java:51)
    at liquibase.integration.commandline.CommandRunner.call(CommandRunner.java:21)
    at picocli.CommandLine.executeUserObject(CommandLine.java:2045)
    at picocli.CommandLine.access$1500(CommandLine.java:148)
    at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2457)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2419)
    at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)
    at picocli.CommandLine$RunLast.execute(CommandLine.java:2421)
    at picocli.CommandLine.execute(CommandLine.java:2174)
    at liquibase.integration.commandline.LiquibaseCommandLine.lambda$execute$2(LiquibaseCommandLine.java:404)
    at liquibase.Scope.child(Scope.java:200)
    at liquibase.Scope.child(Scope.java:176)
    at liquibase.integration.commandline.LiquibaseCommandLine.lambda$execute$3(LiquibaseCommandLine.java:379)
    at liquibase.Scope.child(Scope.java:200)
    at liquibase.Scope.child(Scope.java:176)
    at liquibase.integration.commandline.LiquibaseCommandLine.execute(LiquibaseCommandLine.java:376)
    at liquibase.integration.commandline.LiquibaseCommandLine.main(LiquibaseCommandLine.java:97)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    at liquibase.integration.commandline.LiquibaseLauncher.main(LiquibaseLauncher.java:116)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at liquibase.diff.output.changelog.DiffToChangeLog.print(DiffToChangeLog.java:235)
    at liquibase.diff.output.changelog.DiffToChangeLog.print(DiffToChangeLog.java:125)
    at liquibase.command.core.GenerateChangelogCommandStep.run(GenerateChangelogCommandStep.java:155)
    at liquibase.command.CommandScope.execute(CommandScope.java:220)
    ... 23 more
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at liquibase.diff.output.changelog.DiffToChangeLog$1.run(DiffToChangeLog.java:218)
    at liquibase.Scope.lambda$child$0(Scope.java:191)
    at liquibase.Scope.child(Scope.java:200)
    at liquibase.Scope.child(Scope.java:190)
    at liquibase.Scope.child(Scope.java:169)
    at liquibase.diff.output.changelog.DiffToChangeLog.print(DiffToChangeLog.java:171)
    ... 26 more
Caused by: java.lang.IllegalStateException: Duplicate key 'value_c')) OR (column_a (attempted merging values 'y' AND column_b IN ('value_a' and 'z' AND column_b IN ('value_a')
    at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135)
    at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182)
    at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at liquibase.ext.databricks.diff.output.changelog.ChangedTblPropertiesUtil.convertToMapExcludingDeltaParameters(ChangedTblPropertiesUtil.java:116)
    at liquibase.ext.databricks.diff.output.changelog.ChangedTblPropertiesUtil.getFilteredTblProperties(ChangedTblPropertiesUtil.java:123)
    at liquibase.ext.databricks.diff.output.changelog.MissingTableChangeGeneratorDatabricks.fixMissing(MissingTableChangeGeneratorDatabricks.java:36)
    at liquibase.diff.output.changelog.ChangeGeneratorChain.fixMissing(ChangeGeneratorChain.java:44)
    at liquibase.diff.output.changelog.ChangeGeneratorFactory.fixMissing(ChangeGeneratorFactory.java:94)
    at liquibase.diff.output.changelog.DiffToChangeLog.generateChangeSets(DiffToChangeLog.java:334)
    at liquibase.diff.output.changelog.DiffToChangeLog.printNew(DiffToChangeLog.java:258)
    at liquibase.diff.output.changelog.DiffToChangeLog$1.run(DiffToChangeLog.java:177)
    ... 31 more
make: *** [liquibase-generate-changelog] Error 1

System:

  • Liquibase Databricks extension 1.4.2
  • Liquibase Open Source 4.33.0
  • Databricks JDBC driver 2.7.4.1015

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions