From e885c6a9bda961209004a74fce9f6b5df2a67cda Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Fri, 27 Dec 2019 15:57:14 +0300 Subject: [PATCH] #6026 Treat empty strings as NULL datetime/number --- .../data/OracleTimestampValueHandler.java | 3 +- .../impl/data/DateTimeCustomValueHandler.java | 7 +++-- .../handlers/JDBCDateTimeValueHandler.java | 2 +- .../data/handlers/JDBCNumberValueHandler.java | 7 ++++- .../resultset/ResultSetFilterPanel.java | 30 ++++++++++--------- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java index 531c1cdbc2..5de53d12c4 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java @@ -16,6 +16,7 @@ */ package org.jkiss.dbeaver.ext.oracle.data; +import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.oracle.model.OracleConstants; @@ -50,7 +51,7 @@ public class OracleTimestampValueHandler extends JDBCDateTimeValueHandler { } @Override - public Object getValueFromObject(DBCSession session, DBSTypedObject type, Object object, boolean copy) throws DBCException { + public Object getValueFromObject(@NotNull DBCSession session, @NotNull DBSTypedObject type, Object object, boolean copy) throws DBCException { if (object != null) { String className = object.getClass().getName(); if (className.startsWith(OracleConstants.TIMESTAMP_CLASS_NAME)) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/DateTimeCustomValueHandler.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/DateTimeCustomValueHandler.java index f1e8700595..d9752a47c9 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/DateTimeCustomValueHandler.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/data/DateTimeCustomValueHandler.java @@ -27,7 +27,6 @@ import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.impl.data.formatters.DefaultDataFormatter; import org.jkiss.dbeaver.model.struct.DBSTypedObject; -import java.sql.SQLException; import java.text.ParseException; import java.util.Date; @@ -54,12 +53,16 @@ public abstract class DateTimeCustomValueHandler extends DateTimeValueHandler { } else if (object instanceof Date) { return copy ? ((Date)object).clone() : object; } else if (object instanceof String) { + String strValue = (String)object; + if (strValue.isEmpty()) { + // NULL date + return null; + } if (session != null && session.getDataSource().getContainer().getPreferenceStore().getBoolean(ModelPreferences.RESULT_NATIVE_DATETIME_FORMAT)) { // Do not use formatter for native format return object; } - String strValue = (String)object; try { return getFormatter(type).parseValue(strValue, null); } catch (ParseException e) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCDateTimeValueHandler.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCDateTimeValueHandler.java index b4be9bb4c6..edd71d0c0b 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCDateTimeValueHandler.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCDateTimeValueHandler.java @@ -56,7 +56,7 @@ public class JDBCDateTimeValueHandler extends DateTimeCustomValueHandler { } @Override - public Object getValueFromObject(DBCSession session, DBSTypedObject type, Object object, boolean copy) throws DBCException { + public Object getValueFromObject(@NotNull DBCSession session, @NotNull DBSTypedObject type, Object object, boolean copy) throws DBCException { Object value = super.getValueFromObject(session, type, object, copy); if (value instanceof Date) { switch (type.getTypeID()) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java index 43c4489ec8..3710bb8475 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/jdbc/data/handlers/JDBCNumberValueHandler.java @@ -313,7 +313,12 @@ public class JDBCNumberValueHandler extends JDBCAbstractValueHandler implements } else if (object instanceof Number) { return object; } else if (object instanceof String) { - return DBValueFormatting.convertStringToNumber((String) object, getNumberType(type), formatter); + String strValue = (String) object; + if (strValue.isEmpty()) { + // Empty string means NULL value + return null; + } + return DBValueFormatting.convertStringToNumber(strValue, getNumberType(type), formatter); } else if (object instanceof Boolean) { return (Boolean) object ? 1 : 0; } else { diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java index 47a9e54ca3..5dc69c50e2 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterPanel.java @@ -381,21 +381,23 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider { String displayName = getActiveSourceQuery(); - if (prevQuery == null || !prevQuery.equals(displayName)) { - loadFiltersHistory(displayName); - prevQuery = displayName; - } - Pattern mlCommentsPattern = Pattern.compile("/\\*.*\\*/", Pattern.DOTALL); - Matcher m = mlCommentsPattern.matcher(displayName); - if (m.find()) { - displayName = m.replaceAll(""); - } + if (displayName != null) { + if (prevQuery == null || !prevQuery.equals(displayName)) { + loadFiltersHistory(displayName); + prevQuery = displayName; + } + Pattern mlCommentsPattern = Pattern.compile("/\\*.*\\*/", Pattern.DOTALL); + Matcher m = mlCommentsPattern.matcher(displayName); + if (m.find()) { + displayName = m.replaceAll(""); + } - displayName = displayName.replaceAll("--.+", ""); - displayName = CommonUtils.compactWhiteSpaces(displayName); - activeDisplayName = CommonUtils.notEmpty(CommonUtils.truncateString(displayName, 200)); - if (CommonUtils.isEmpty(activeDisplayName)) { - activeDisplayName = ResultSetViewer.DEFAULT_QUERY_TEXT; + displayName = displayName.replaceAll("--.+", ""); + displayName = CommonUtils.compactWhiteSpaces(displayName); + activeDisplayName = CommonUtils.notEmpty(CommonUtils.truncateString(displayName, 200)); + if (CommonUtils.isEmpty(activeDisplayName)) { + activeDisplayName = ResultSetViewer.DEFAULT_QUERY_TEXT; + } } } -- GitLab