diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java index ae1a8a1b85..7cc69b785c 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java @@ -1066,9 +1066,8 @@ public class PostgresDatabase extends AbstractDatabase { return create().select(PG_ENUM.ENUMLABEL) .from(PG_ENUM) - .join(PG_TYPE).on(PG_ENUM.ENUMTYPID.eq(oid(PG_TYPE))) - .where(PG_TYPE.pgNamespace().NSPNAME.eq(nspname)) - .and(PG_TYPE.TYPNAME.eq(typname)) + .where(PG_ENUM.pgType().pgNamespace().NSPNAME.eq(nspname)) + .and(PG_ENUM.pgType().TYPNAME.eq(typname)) .orderBy(orderBy) .fetch(PG_ENUM.ENUMLABEL); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index 9ae0e70005..29058dd137 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -53,6 +53,7 @@ import static org.jooq.impl.Tools.BooleanDataKey.DATA_OMIT_CLAUSE_EVENT_EMISSION import java.sql.PreparedStatement; import java.util.ArrayDeque; +import java.util.Arrays; import java.util.BitSet; import java.util.Deque; import java.util.LinkedHashMap; @@ -804,5 +805,10 @@ abstract class AbstractContext> extends AbstractScope imple ScopeStackElement(int scopeLevel) { this.scopeLevel = scopeLevel; } + + @Override + public String toString() { + return Arrays.toString(positions) + ": " + joinNode; + } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index 5b416f985a..c3169ebbf8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -154,7 +154,7 @@ final class CreateTableImpl extends AbstractRowCountQuery implements private static final Set SUPPORT_TEMPORARY = SQLDialect.supportedBy(MARIADB, MYSQL, POSTGRES); private static final Set EMULATE_COMMENT_IN_BLOCK = SQLDialect.supportedBy(FIREBIRD, POSTGRES); private static final Set REQUIRE_EXECUTE_IMMEDIATE = SQLDialect.supportedBy(FIREBIRD); - private static final Set NO_SUPPORT_NULLABLE_PRIMARY_KEY = SQLDialect.supportedBy(MYSQL); + private static final Set NO_SUPPORT_NULLABLE_PRIMARY_KEY = SQLDialect.supportedBy(MARIADB, MYSQL); @@ -553,10 +553,10 @@ final class CreateTableImpl extends AbstractRowCountQuery implements private final DataType columnType(Context ctx, int i) { DataType type = columnTypes.get(i); - + if (NO_SUPPORT_NULLABLE_PRIMARY_KEY.contains(ctx.dialect()) && type.nullability() == Nullability.DEFAULT && isPrimaryKey(i)) type = type.nullable(false); - + return type; } @@ -567,7 +567,7 @@ final class CreateTableImpl extends AbstractRowCountQuery implements for (Field field : ((ConstraintImpl) constraint).$primaryKey()) if (field.equals(columnFields.get(i))) return true; - + return false; } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index f1196affbc..91be9f4708 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -179,12 +179,13 @@ public class TableImpl extends AbstractTable { this(name, schema, child, path, aliased, parameters, comment, TableOptions.table()); } + @SuppressWarnings({ "rawtypes", "unchecked" }) public TableImpl(Name name, Schema schema, Table child, ForeignKey path, Table aliased, Field[] parameters, Comment comment, TableOptions options) { super(options, name, schema, comment); this.fields = new Fields<>(); this.child = child; - this.childPath = path; + this.childPath = path == null ? null : Tools.aliasedKey((ForeignKey) path, child, this); if (aliased != null) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 7804aa3ff9..15a502f54d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -239,6 +239,7 @@ import org.jooq.EnumType; import org.jooq.ExecuteContext; import org.jooq.ExecuteListener; import org.jooq.Field; +import org.jooq.ForeignKey; import org.jooq.JSON; import org.jooq.JSONB; import org.jooq.Name; @@ -264,6 +265,7 @@ import org.jooq.Select; import org.jooq.SelectFieldOrAsterisk; import org.jooq.SortField; import org.jooq.Table; +import org.jooq.TableField; import org.jooq.TableRecord; import org.jooq.UDT; import org.jooq.UDTRecord; @@ -1391,6 +1393,19 @@ final class Tools { return result; } + static ReferenceImpl aliasedKey(ForeignKey key, Table child, Table parent) { + + // [#10603] [#5050] TODO: Solve aliasing constraints more generically + return new ReferenceImpl<>( + child, + key.getQualifiedName(), + Tools.fieldsByName(child, key.getFieldsArray()), + key.getKey(), + Tools.fieldsByName(parent, key.getKeyFieldsArray()), + key.enforced() + ); + } + static final Field[] aliasedFields(Field[] fields) { if (fields == null) return null; @@ -1420,6 +1435,23 @@ final class Tools { return result; } + @SuppressWarnings("unchecked") + static final TableField[] fieldsByName(Table tableName, Field[] fieldNames) { + if (fieldNames == null) + return null; + + TableField[] result = new TableField[fieldNames.length]; + + if (tableName == null) + for (int i = 0; i < fieldNames.length; i++) + result[i] = (TableField) DSL.field(fieldNames[i].getUnqualifiedName(), fieldNames[i].getDataType()); + else + for (int i = 0; i < fieldNames.length; i++) + result[i] = (TableField) DSL.field(tableName.getQualifiedName().append(fieldNames[i].getUnqualifiedName()), fieldNames[i].getDataType()); + + return result; + } + static final Field[] fieldsByName(Name tableName, Name[] fieldNames) { if (fieldNames == null) return null;