From 30bb27bdd5ef805262dc3bfcd087641f87d80994 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Mon, 23 Dec 2019 21:39:58 +0300 Subject: [PATCH] #7459 PG: data type meta info reading fix (floats vs integers) Former-commit-id: 8d32fcd9ecb39f0023dc66a61784217ac28422fb --- .../dbeaver/ext/postgresql/PostgreUtils.java | 40 ++++++++++--------- .../ext/postgresql/model/PostgreDataType.java | 4 +- .../model/data/PostgreStructValueHandler.java | 3 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java index dc7ae6487a..bfd6b30559 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreUtils.java @@ -484,25 +484,29 @@ public class PostgreUtils { if (CommonUtils.isEmpty(string)) { return convertStringToSimpleValue(session, itemType, string); } - switch (itemType.getTypeID()) { - case Types.BOOLEAN: - return string.length() > 0 && Character.toLowerCase(string.charAt(0)) == 't'; - case Types.TINYINT: - return Byte.parseByte(string); - case Types.SMALLINT: - return Short.parseShort(string); - case Types.INTEGER: - return Integer.parseInt(string); - case Types.BIGINT: - return Long.parseLong(string); - case Types.FLOAT: - return Float.parseFloat(string); - case Types.REAL: - case Types.DOUBLE: - return Double.parseDouble(string); - default: { - return convertStringToSimpleValue(session, itemType, string); + try { + switch (itemType.getTypeID()) { + case Types.BOOLEAN: + return string.length() > 0 && Character.toLowerCase(string.charAt(0)) == 't'; + case Types.TINYINT: + return Byte.parseByte(string); + case Types.SMALLINT: + return Short.parseShort(string); + case Types.INTEGER: + return Integer.parseInt(string); + case Types.BIGINT: + return Long.parseLong(string); + case Types.FLOAT: + return Float.parseFloat(string); + case Types.REAL: + case Types.DOUBLE: + return Double.parseDouble(string); + default: { + return convertStringToSimpleValue(session, itemType, string); + } } + } catch (NumberFormatException e) { + return string; } } 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 916b2fa0bc..37367b66ca 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 @@ -873,9 +873,11 @@ public class PostgreDataType extends JDBCDataType implements Post break; case N: valueType = Types.NUMERIC; + // Kind of a hack (#7459). Don't know any better way to distinguish floats from integers + String outputF = JDBCUtils.safeGetString(dbResult, "typoutput"); if (name.equals("numeric")) { valueType = Types.NUMERIC; - } else if (name.startsWith("float")) { + } else if (outputF != null && outputF.startsWith("float")) { switch (typeLength) { case 4: valueType = Types.FLOAT; diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreStructValueHandler.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreStructValueHandler.java index df943be851..2285af3966 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreStructValueHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreStructValueHandler.java @@ -77,7 +77,8 @@ public class PostgreStructValueHandler extends JDBCStructValueHandler { { PostgreDataType structType = PostgreUtils.findDataType(session, (PostgreDataSource)session.getDataSource(), type); if (structType == null) { - throw new DBCException("Can't resolve struct type '" + type.getTypeName() + "'"); + log.debug("Can't resolve struct type '" + type.getTypeName() + "'"); + return object; } try { if (object == null) { -- GitLab