[jOOQ/jOOQ#10741] NullPointerException in SQLite Meta.migrateTo() when using DatabaseMetaData backed Meta containing FK referencing wrong identifier case

This commit is contained in:
Lukas Eder 2020-10-15 10:56:24 +02:00
parent de8b04f942
commit 7405536f7c
2 changed files with 37 additions and 2 deletions

View File

@ -142,4 +142,24 @@ abstract class AbstractNamed extends AbstractQueryPart implements Named {
return unqualified;
}
static final <N extends Named> N findIgnoreCase(String name, Iterable<? extends N> in) {
for (N n : in)
if (n.getName().equalsIgnoreCase(name))
return n;
return null;
}
static final <N extends Named> N findIgnoreCase(Name name, Iterable<? extends N> in) {
N unqualified = null;
for (N n : in)
if (n.getQualifiedName().equalsIgnoreCase(name))
return n;
else if (unqualified == null && n.getUnqualifiedName().equalsIgnoreCase(name.unqualifiedName()))
unqualified = n;
return unqualified;
}
}

View File

@ -48,6 +48,7 @@ import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
import static org.jooq.SQLDialect.SQLITE;
// ...
import static org.jooq.impl.AbstractNamed.findIgnoreCase;
import static org.jooq.impl.DSL.condition;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.Tools.EMPTY_SORTFIELD;
@ -184,6 +185,20 @@ final class MetaImpl extends AbstractMeta {
return result;
}
final Table<?> lookupTable(Schema schema, String tableName) {
switch (family()) {
// [#10741] A workaround for SQLite's case insensitivity where the
// case of declared vs referenced identifiers may differ
// [#2656] TODO: Solve this more thoroughly and globally
case SQLITE:
return findIgnoreCase(tableName, schema.getTables());
default:
return schema.getTable(tableName);
}
}
@Override
final List<Schema> getSchemas0() {
List<Schema> result = new ArrayList<>();
@ -688,7 +703,7 @@ final class MetaImpl extends AbstractMeta {
String fkName = entry.getKey().get(3, String.class);
String pkName = entry.getKey().get(4, String.class);
Table<Record> pkTable = (Table<Record>) schema.getTable(entry.getKey().get(2, String.class));
Table<Record> pkTable = (Table<Record>) lookupTable(schema, entry.getKey().get(2, String.class));
TableField<Record, ?>[] pkFields = new TableField[entry.getValue().size()];
TableField<Record, ?>[] fkFields = new TableField[entry.getValue().size()];
@ -982,7 +997,7 @@ final class MetaImpl extends AbstractMeta {
// [#7377] The schema may be null instead of "" in some dialects
Schema schema = schemas.get(defaultString(key.get(1, String.class)));
Table<Record> fkTable = (Table<Record>) schema.getTable(key.get(2, String.class));
Table<Record> fkTable = (Table<Record>) lookupTable(schema, key.get(2, String.class));
String fkName = key.get(3, String.class);
TableField<Record, ?>[] fkFields = new TableField[value.size()];
TableField<Record, ?>[] pkFields = new TableField[value.size()];