diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultAttributeDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultAttributeDefinition.java index 153b71faa5..b2166a4626 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultAttributeDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultAttributeDefinition.java @@ -50,7 +50,11 @@ public class DefaultAttributeDefinition extends AbstractTypedElementDefinition getEnums0() throws SQLException { @@ -877,14 +877,20 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat for (Identifier type : create() .select( PG_TYPE.pgNamespace().NSPNAME, - PG_TYPE.TYPNAME) + PG_TYPE.TYPNAME, + PG_DESCRIPTION.DESCRIPTION) .from(PG_TYPE) + .leftJoin(PG_DESCRIPTION) + .on(PG_TYPE.OID.eq(PG_DESCRIPTION.OBJOID)) + .and(PG_DESCRIPTION.CLASSOID.eq(field("'pg_type'::regclass", BIGINT))) + .and(PG_DESCRIPTION.OBJSUBID.eq(0)) .where(PG_TYPE.pgNamespace().NSPNAME.in(getInputSchemata())) .and(PG_TYPE.OID.in(select(PG_ENUM.ENUMTYPID).from(PG_ENUM))) .orderBy( PG_TYPE.pgNamespace().NSPNAME, PG_TYPE.TYPNAME) - .fetch(mapping(Identifier::new))) { + .fetch(mapping(Identifier::new)) + ) { DefaultEnumDefinition definition = null; for (String label : enumLabels(type.schema, type.name)) { @@ -892,7 +898,7 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat String typeName = String.valueOf(type.name); if (definition == null || !definition.getName().equals(typeName)) { - definition = new DefaultEnumDefinition(schema, typeName, null); + definition = new DefaultEnumDefinition(schema, typeName, type.comment); result.add(definition); } @@ -1080,18 +1086,21 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat if (exists(ATTRIBUTES)) { for (Identifier udt : create() .select( - ATTRIBUTES.UDT_SCHEMA, - ATTRIBUTES.UDT_NAME) - .from(ATTRIBUTES) - .where(ATTRIBUTES.UDT_SCHEMA.in(getInputSchemata())) - - // [#14621] Work around https://github.com/yugabyte/yugabyte-db/issues/16081 - .groupBy( - ATTRIBUTES.UDT_SCHEMA, - ATTRIBUTES.UDT_NAME) + PG_CLASS.pgNamespace().NSPNAME, + PG_CLASS.RELNAME, + PG_DESCRIPTION.DESCRIPTION) + .from(PG_CLASS) + .leftJoin(PG_TYPE) + .on(PG_CLASS.RELTYPE.eq(PG_TYPE.OID)) + .leftJoin(PG_DESCRIPTION) + .on(PG_TYPE.OID.eq(PG_DESCRIPTION.OBJOID)) + .and(PG_DESCRIPTION.CLASSOID.eq(field("'pg_type'::regclass", BIGINT))) + .and(PG_DESCRIPTION.OBJSUBID.eq(0)) + .where(PG_CLASS.RELKIND.eq(inline("c"))) + .and(PG_CLASS.pgNamespace().NSPNAME.in(getInputSchemata())) .orderBy( - ATTRIBUTES.UDT_SCHEMA, - ATTRIBUTES.UDT_NAME) + PG_CLASS.pgNamespace().NSPNAME, + PG_CLASS.RELNAME) .fetch(mapping(Identifier::new))) { SchemaDefinition schema = getSchema(udt.schema); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresUDTDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresUDTDefinition.java index 86a96f4d00..eef4f1c36f 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresUDTDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresUDTDefinition.java @@ -38,12 +38,17 @@ package org.jooq.meta.postgres; import static org.jooq.impl.DSL.coalesce; +import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.when; +import static org.jooq.impl.SQLDataType.BIGINT; import static org.jooq.meta.postgres.information_schema.Tables.ATTRIBUTES; import static org.jooq.meta.postgres.information_schema.Tables.DOMAINS; import static org.jooq.meta.postgres.pg_catalog.Tables.PG_ATTRIBUTE; +import static org.jooq.meta.postgres.pg_catalog.Tables.PG_CLASS; +import static org.jooq.meta.postgres.pg_catalog.Tables.PG_DESCRIPTION; +import static org.jooq.meta.postgres.pg_catalog.Tables.PG_TYPE; import java.sql.SQLException; import java.util.ArrayList; @@ -91,7 +96,8 @@ public class PostgresUDTDefinition extends AbstractUDTDefinition { a.IS_NULLABLE, a.ATTRIBUTE_DEFAULT, a.ATTRIBUTE_UDT_SCHEMA, - db.arrayUdtName(a.DATA_TYPE, a.ATTRIBUTE_UDT_NAME).as(a.ATTRIBUTE_UDT_NAME)) + db.arrayUdtName(a.DATA_TYPE, a.ATTRIBUTE_UDT_NAME).as(a.ATTRIBUTE_UDT_NAME), + PG_DESCRIPTION.DESCRIPTION) .from(a) .join(pg_a) .on(a.ATTRIBUTE_NAME.eq(pg_a.ATTNAME)) @@ -101,10 +107,14 @@ public class PostgresUDTDefinition extends AbstractUDTDefinition { .on(a.ATTRIBUTE_UDT_CATALOG.eq(d.DOMAIN_CATALOG)) .and(a.ATTRIBUTE_UDT_SCHEMA.eq(d.DOMAIN_SCHEMA)) .and(a.ATTRIBUTE_UDT_NAME.eq(d.DOMAIN_NAME)) + .leftJoin(PG_DESCRIPTION) + .on(pg_a.ATTRELID.eq(PG_DESCRIPTION.OBJOID)) + .and(PG_DESCRIPTION.CLASSOID.eq(field("'pg_class'::regclass", BIGINT))) + .and(PG_DESCRIPTION.OBJSUBID.eq(pg_a.ATTNUM.coerce(PG_DESCRIPTION.OBJSUBID))) .where(a.UDT_SCHEMA.equal(getSchema().getName())) .and(a.UDT_NAME.equal(getName())) - .orderBy(a.ORDINAL_POSITION)) { - + .orderBy(a.ORDINAL_POSITION) + ) { SchemaDefinition typeSchema = null; String schemaName = record.get(a.ATTRIBUTE_UDT_SCHEMA); @@ -130,7 +140,9 @@ public class PostgresUDTDefinition extends AbstractUDTDefinition { this, record.get(a.ATTRIBUTE_NAME), record.get(a.ORDINAL_POSITION), - type); + type, + record.get(PG_DESCRIPTION.DESCRIPTION) + ); result.add(column); }