MariaDB 10.3.6: ColumnSnapshotGenerator.readDefaultValue() failed with NumberFormatException on parsing value "NULL"
Description
Environment
Liquibase 3.3.1
MariaDB 10.3.6
Ubuntu 16.04
Java 1.8.0_131
Activity
Show:
Bojan Milenkoski August 22, 2019 at 12:23 PM
Same issue here (older version of Liquibase):
Liquibase 3.1.1
MariaDB 10.4.7
OpenJDK 1.8.0_212
Details
Details
Reporter
Valeriy Fezler
Valeriy FezlerComponents
Affects versions
Priority
Created May 16, 2018 at 5:21 PM
Updated August 22, 2019 at 12:23 PM
With help of Liquibase 3.3.1 on MariaDB 10.3.6 we are creating some table with column definition:
... <column name="issued_field" type="BOOLEAN"/> ...
It successfully creates table with column:
MariaDB [DB]> describe tableName; +----------------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------------+--------------+------+-----+---------+-------+ ... | issued_field | bit(1) | YES | | NULL | | ... +----------------------------+--------------+------+-----+---------+-------+
But on next DB migration step with precondition check:
... <preConditions onFail="MARK_RAN"> <not> <columnExists tableName="someAnotherTable" columnName="some_field"/> </not> </preConditions> ...
updating process is failing with error:
Reason: liquibase.exception.MigrationFailedException: Migration failed for change set upgrade.xml::0110::migration: Reason: upgrade.xml : liquibase.precondition.core.ColumnExistsPrecondition@32cfbd5b : For input string: "NULL" at liquibase.changelog.ChangeSet.execute(ChangeSet.java:514) at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:43) at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73) at liquibase.Liquibase.update(Liquibase.java:200) at liquibase.Liquibase.update(Liquibase.java:181) at liquibase.Liquibase.update(Liquibase.java:174) ... Caused by: liquibase.exception.PreconditionErrorException: Precondition Error at liquibase.precondition.core.ColumnExistsPrecondition.check(ColumnExistsPrecondition.java:81) at liquibase.precondition.core.NotPrecondition.check(NotPrecondition.java:38) at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:43) at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:201) at liquibase.changelog.ChangeSet.execute(ChangeSet.java:471) ... 79 common frames omitted Caused by: liquibase.exception.DatabaseException: java.lang.NumberFormatException: For input string: "NULL" at liquibase.snapshot.jvm.ColumnSnapshotGenerator.snapshotObject(ColumnSnapshotGenerator.java:69) at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:60) at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:50) at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:163) at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:241) at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:195) at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:177) at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:241) at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:263) at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:195) at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:177) at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:60) at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:37) at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:25) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:126) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:119) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:107) at liquibase.snapshot.SnapshotGeneratorFactory.has(SnapshotGeneratorFactory.java:97) at liquibase.precondition.core.ColumnExistsPrecondition.check(ColumnExistsPrecondition.java:77) ... 83 common frames omitted Caused by: java.lang.NumberFormatException: For input string: "NULL" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.<init>(Integer.java:867) at liquibase.util.SqlUtil.parseValue(SqlUtil.java:129) at liquibase.snapshot.jvm.ColumnSnapshotGenerator.readDefaultValue(ColumnSnapshotGenerator.java:345) at liquibase.snapshot.jvm.ColumnSnapshotGenerator.readColumn(ColumnSnapshotGenerator.java:200) at liquibase.snapshot.jvm.ColumnSnapshotGenerator.snapshotObject(ColumnSnapshotGenerator.java:45) ... 101 common frames omitted
During debug this issue I may confirm that columnMetadataResultSet.get("COLUMN_DEF") returned "NULL" string value by some unknown reason.
But I can not reproduce this issue on MariaDB 10.1.31 and during debug I saw that default value was just null value instead of string "NULL".
So, looks like we need fix similar to CORE-2133, DB2 sees empty string default values as "NULL", especially in oracle-compatibility mode.