[#2917] Improve code generator compatibility with PostgreSQL 8.x by avoiding casting to enum types

This commit is contained in:
Lukas Eder 2013-12-28 13:36:28 +01:00
parent 6cf5fd1999
commit a06fd8d56f

View File

@ -73,6 +73,7 @@ import java.util.List;
import java.util.Map;
import org.jooq.DSLContext;
import org.jooq.Field;
import org.jooq.Name;
import org.jooq.Record;
import org.jooq.Record2;
@ -119,6 +120,7 @@ public class PostgresDatabase extends AbstractDatabase {
private static final JooqLogger log = JooqLogger.getLogger(PostgresDatabase.class);
private static Boolean is84;
private static Boolean canCastToEnumType;
@Override
protected void loadPrimaryKeys(DefaultRelations relations) throws SQLException {
@ -400,18 +402,8 @@ public class PostgresDatabase extends AbstractDatabase {
String nspname = type.getValue(PG_NAMESPACE.NSPNAME);
String typname = type.getValue(PG_TYPE.TYPNAME);
List<String> labels = create()
.select(PG_ENUM.ENUMLABEL)
.from(PG_ENUM)
.join(PG_TYPE).on(PG_ENUM.ENUMTYPID.eq(oid(PG_TYPE)))
.join(PG_NAMESPACE).on(PG_TYPE.TYPNAMESPACE.eq(oid(PG_NAMESPACE)))
.where(PG_NAMESPACE.NSPNAME.eq(nspname))
.and(PG_TYPE.TYPNAME.eq(typname))
.orderBy(field("{0}::{1}", PG_ENUM.ENUMLABEL, name(nspname, typname)))
.fetch(PG_ENUM.ENUMLABEL);
DefaultEnumDefinition definition = null;
for (String label : labels) {
for (String label : enumLabels(nspname, typname)) {
SchemaDefinition schema = getSchema(nspname);
String typeName = String.valueOf(typname);
@ -544,4 +536,34 @@ public class PostgresDatabase extends AbstractDatabase {
return is84;
}
private List<String> enumLabels(String nspname, String typname) {
Field<Object> cast = field("{0}::{1}", PG_ENUM.ENUMLABEL, name(nspname, typname));
if (canCastToEnumType == null) {
// [#2917] Older versions of PostgreSQL don't support the above cast
try {
canCastToEnumType = true;
return enumLabels(nspname, typname, cast);
}
catch (DataAccessException e) {
canCastToEnumType = false;
}
}
return canCastToEnumType ? enumLabels(nspname, typname, cast) : enumLabels(nspname, typname, PG_ENUM.ENUMLABEL);
}
private List<String> enumLabels(String nspname, String typname, Field<?> orderBy) {
return
create().select(PG_ENUM.ENUMLABEL)
.from(PG_ENUM)
.join(PG_TYPE).on(PG_ENUM.ENUMTYPID.eq(oid(PG_TYPE)))
.join(PG_NAMESPACE).on(PG_TYPE.TYPNAMESPACE.eq(oid(PG_NAMESPACE)))
.where(PG_NAMESPACE.NSPNAME.eq(nspname))
.and(PG_TYPE.TYPNAME.eq(typname))
.orderBy(orderBy)
.fetch(PG_ENUM.ENUMLABEL);
}
}