diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractNamed.java b/jOOQ/src/main/java/org/jooq/impl/AbstractNamed.java index ac4799c912..451d4c29b6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractNamed.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractNamed.java @@ -142,4 +142,24 @@ abstract class AbstractNamed extends AbstractQueryPart implements Named { return unqualified; } + + static final N findIgnoreCase(String name, Iterable in) { + for (N n : in) + if (n.getName().equalsIgnoreCase(name)) + return n; + + return null; + } + + static final N findIgnoreCase(Name name, Iterable 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; + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index 6f977cd8f7..d256fe2de8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -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 getSchemas0() { List 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 pkTable = (Table) schema.getTable(entry.getKey().get(2, String.class)); + Table pkTable = (Table) lookupTable(schema, entry.getKey().get(2, String.class)); TableField[] pkFields = new TableField[entry.getValue().size()]; TableField[] 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 fkTable = (Table) schema.getTable(key.get(2, String.class)); + Table fkTable = (Table) lookupTable(schema, key.get(2, String.class)); String fkName = key.get(3, String.class); TableField[] fkFields = new TableField[value.size()]; TableField[] pkFields = new TableField[value.size()];