From a5f0733f06d41676150ac33b8d0711b38d7a4bdb Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 20 Jan 2021 14:09:22 +0100 Subject: [PATCH] [jOOQ/jOOQ#11258] NullPointerException in MetaImpl.snapshot() when foreign key column order doesn't match unique key column order --- jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java | 7 ++++++- jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java | 7 ++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java index e850aff070..61f4476a3e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java @@ -43,9 +43,11 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Predicate; import org.jooq.Catalog; @@ -632,13 +634,16 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable } final UniqueKey lookupKey(Table in, UniqueKey uk) { + Set ukFields = new HashSet<>(uk.getFields()); + for (UniqueKey k : in.getKeys()) // [#10279] [#10281] Cannot use Key::equals here, because that is // name-based. 1) The name is irrelevant for this lookup, 2) some // key implementations (e.g. MetaPrimaryKey for H2) don't produce // the correct key name, but the index name. - if (k.getFields().equals(uk.getFields())) + // [#11258] Also, we need position agnostic comparison, using sets + if (ukFields.equals(new HashSet<>(k.getFields()))) return k; return null; diff --git a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java index 3dc4f7e7a2..50ec2032b4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java @@ -49,6 +49,7 @@ import org.jooq.Field; import org.jooq.ForeignKey; import org.jooq.Index; import org.jooq.Meta; +import org.jooq.Name; import org.jooq.QueryPart; import org.jooq.Record; import org.jooq.Schema; @@ -455,12 +456,12 @@ final class FilteredMeta extends AbstractMeta { continue fkLoop; TableField[] fields1 = fk.getFieldsArray(); - TableField[] fields2 = new TableField[fields1.length]; + TableField[] fields2 = new TableField[fields1.length]; for (int i = 0; i < fields2.length; i++) - fields2[i] = (TableField) field(fields1[i]); + fields2[i] = (TableField) uk.getTable().field(fields1[i]); - references.add(Internal.createForeignKey(uk, this, fk.getName(), fields2, fk.enforced())); + references.add(Internal.createForeignKey(this, fk.getQualifiedName(), fields1, uk, (TableField[]) fields2, fk.enforced())); } }