I get the following error from time to time when migrationg a local postgresql database, but the error occurs much more frequently when connecting via a network to the postgres database running on a small embedded platform (e.g. raspberry pi).
I have tried both liquibase 3.1.1 and also 3.1.2-SNAPSHOT.
Caused by: liquibase.exception.LockException: java.lang.NullPointerException
at liquibase.lockservice.StandardLockService.acquireLock(StandardLockService.java:209) at liquibase.lockservice.StandardLockService.waitForLock(StandardLockService.java:148) at liquibase.Liquibase.update(Liquibase.java:189)
at liquibase.Liquibase.update(Liquibase.java:181)
at com.vaisala.jx.database.DatabaseMigrator.migrate(DatabaseMigrator.java:100)
… 4 common frames omitted
Caused by: java.lang.NullPointerException: null
at liquibase.sqlgenerator.core.CreateTableGenerator.generateSql(CreateTableGenerator.java:106)
at liquibase.sqlgenerator.core.CreateTableGenerator.generateSql(CreateTableGenerator.java:27)
at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30)
at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:198)
at liquibase.sqlgenerator.core.CreateDatabaseChangeLogLockTableGenerator.generateSql(CreateDatabaseChangeLogLockTableGenerator.java:36)
at liquibase.sqlgenerator.core.CreateDatabaseChangeLogLockTableGenerator.generateSql(CreateDatabaseChangeLogLockTableGenerator.java:19)
at liquibase.sqlgenerator.SqlGeneratorChain.generateSql(SqlGeneratorChain.java:30)
at liquibase.sqlgenerator.SqlGeneratorFactory.generateSql(SqlGeneratorFactory.java:198)
at liquibase.executor.AbstractExecutor.applyVisitors(AbstractExecutor.java:22)
at liquibase.executor.jvm.JdbcExecutor.access$500(JdbcExecutor.java:35)
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:284)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:54)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:106)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:96)
at liquibase.lockservice.StandardLockService.init(StandardLockService.java:83)
at liquibase.lockservice.StandardLockService.acquireLock(StandardLockService.java:182)
… 8 common frames omitted
Interestingly, if I run the code in debug mode, stepping throught the problematic statemets, it seems to work fine, perhaps suggetsing a timing problem?
I added a couple of additional log comments around the problem area (CreateTableGenerator.java, lines ~62)
System.out.println("map of statement types " + statement.getColumnTypes().toString());
while (columnIterator.hasNext()) {
String column = columnIterator.next();
DatabaseDataType columnType = statement.getColumnTypes().get(column).toDatabaseDataType(database);
System.out.println("column " + column + " columnType " + columnType);
and got this output:
map of statement types {LOCKGRANTED=datetime, LOCKED=boolean, LOCKEDBY=varchar(255), ID=int}
column ID columnType INT
column LOCKED columnType null
… NPE …
i.e. the LOCKED columnType is boolean in the map, but null when converted to databaseDataType, which implies that under some circumstances the toDatabaseDataType method returns null:
public DatabaseDataType toDatabaseDataType(Database database) {
DatabaseDataType type = new DatabaseDataType(name.toUpperCase(), getParameters());
type.addAdditionalInformation(additionalInformation);
return type;
}
note that this method doesn’t appear to use the database parameter.
Have to admit that at this point I am confused, especially as the code works as you would expect when single-stepping through in debug mode. Any help much appreciated