提交 ce2af391 编写于 作者: S serge-rider

PostgreSQL < 8.4 support fix (data types)

上级 49a7946e
......@@ -121,13 +121,16 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> 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);
......
......@@ -56,35 +56,43 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache<GenericStruc
super(owner);
}
private boolean supportsTypeCategory() {
return owner.getDataSource().isServerVersionAtLeast(8, 4);
}
@Override
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull GenericStructContainer owner) throws SQLException
{
boolean supportsCategory = supportsTypeCategory();
return session.prepareStatement(
"SELECT t.oid as typid,tn.nspname typnsname,t.* \n" +
"FROM pg_catalog.pg_type t , pg_catalog.pg_namespace tn\n" +
"WHERE tn.oid=t.typnamespace \n" +
"AND t.typtype<>'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<GenericStruc
valueType = Types.OTHER;
break;
}
} else {
String typType = null;
try {
typType = JDBCUtils.safeGetString(dbResult, "typtype");
} catch (IllegalArgumentException e) {
log.debug(e);
}
if ("c".equals(typType)) {
valueType = Types.STRUCT;
} else if ("d".equals(typType)) {
valueType = Types.DISTINCT;
} else if ("e".equals(typType)) {
valueType = Types.VARCHAR;
} else {
valueType = Types.OTHER;
}
}
return new JDBCDataType<>(owner, valueType, name,null,false,true,typeLength,-1,-1);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册