From ce2af39127991904595cb7254d7606e0569339f1 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Tue, 3 Apr 2018 00:59:39 +0300 Subject: [PATCH] PostgreSQL < 8.4 support fix (data types) --- .../ext/postgresql/model/PostgreDataType.java | 15 ++++--- .../model/PostgreGenericTypeCache.java | 42 +++++++++++++++---- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java index 59517f3ec6..90dd1deb34 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataType.java @@ -121,13 +121,16 @@ public class PostgreDataType extends JDBCDataType implements Post log.debug("Invalid type type [" + typTypeStr + "] - " + e.getMessage()); } this.typeCategory = PostgreTypeCategory.X; - String typCategoryStr = JDBCUtils.safeGetString(dbResult, "typcategory"); - try { - if (typCategoryStr != null && !typCategoryStr.isEmpty()) { - this.typeCategory = PostgreTypeCategory.valueOf(typCategoryStr.toUpperCase(Locale.ENGLISH)); + boolean supportsCategory = session.getDataSource().isServerVersionAtLeast(8, 4); + if (supportsCategory) { + String typCategoryStr = JDBCUtils.safeGetString(dbResult, "typcategory"); + try { + if (typCategoryStr != null && !typCategoryStr.isEmpty()) { + this.typeCategory = PostgreTypeCategory.valueOf(typCategoryStr.toUpperCase(Locale.ENGLISH)); + } + } catch (Throwable e) { + log.debug("Invalid type category [" + typCategoryStr + "] - " + e.getMessage()); } - } catch (Throwable e) { - log.debug("Invalid type category [" + typCategoryStr + "] - " + e.getMessage()); } this.dataKind = JDBCDataSource.getDataKind(getName(), valueType); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java index 04e2d7f923..5913500b58 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreGenericTypeCache.java @@ -56,35 +56,43 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache'c' AND t.typcategory not in ('A','P')\n" + - "ORDER by t.oid"); + "FROM pg_catalog.pg_type t , pg_catalog.pg_namespace tn\n" + + "WHERE tn.oid=t.typnamespace \n" + + "AND t.typtype<>'c'" + (supportsCategory ? " AND t.typcategory not in ('A','P')" : "") + + "\nORDER by t.oid"); } @Override protected JDBCDataType fetchObject(@NotNull JDBCSession session, @NotNull GenericStructContainer owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { + boolean supportsTypeCategory = supportsTypeCategory(); String name = JDBCUtils.safeGetString(dbResult, "typname"); if (CommonUtils.isEmpty(name)) { return null; } int typeLength = JDBCUtils.safeGetInt(dbResult, "typlen"); PostgreTypeCategory typeCategory = PostgreTypeCategory.X; - try { - typeCategory = PostgreTypeCategory.valueOf(JDBCUtils.safeGetString(dbResult, "typcategory")); - } catch (IllegalArgumentException e) { - log.debug(e); + if (supportsTypeCategory) { + try { + typeCategory = PostgreTypeCategory.valueOf(JDBCUtils.safeGetString(dbResult, "typcategory")); + } catch (IllegalArgumentException e) { + log.debug(e); + } } int valueType; if (ArrayUtils.contains(OID_TYPES, name) || name.equals(PostgreConstants.TYPE_HSTORE)) { valueType = Types.VARCHAR; - } else { + } else if (supportsTypeCategory) { switch (typeCategory) { case A: case P: @@ -153,6 +161,22 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache(owner, valueType, name,null,false,true,typeLength,-1,-1); -- GitLab