diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/SQLServerConstants.java b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/SQLServerConstants.java index 872eb21f185d8dc5153a5556e260284d0993094c..64a77369c9d6f8897c86ff92d092b137b6990514 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/SQLServerConstants.java +++ b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/SQLServerConstants.java @@ -30,6 +30,12 @@ public class SQLServerConstants { public static final String DEFAULT_SCHEMA_NAME = "dbo"; + public static final String TYPE_DATETIME = "datetime"; + public static final String TYPE_DATETIME2 = "datetime2"; + public static final String TYPE_SMALLDATETIME = "smalldatetime"; + public static final String TYPE_DATETIMEOFFSET = "datetimeoffset"; + + public static final String PROP_CONNECTION_WINDOWS_AUTH = DBConstants.INTERNAL_PROP_PREFIX + "connection-windows-auth@"; public static final String PROP_SHOW_ALL_SCHEMAS = DBConstants.INTERNAL_PROP_PREFIX + "show-all-schemas@"; public static final String PROP_CONNECTION_INTEGRATED_SECURITY = "integratedSecurity"; diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDataSource.java b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDataSource.java index c1bc40a08cc403da5e9461cbb04dc89bafbaaf86..d27aa4be1d081c337cf8924afb9a06dc2e0ac3b5 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDataSource.java +++ b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDataSource.java @@ -21,11 +21,14 @@ import org.jkiss.dbeaver.ext.generic.model.GenericDataSource; import org.jkiss.dbeaver.ext.mssql.SQLServerConstants; import org.jkiss.dbeaver.ext.mssql.SQLServerUtils; import org.jkiss.dbeaver.model.DBConstants; +import org.jkiss.dbeaver.model.DBPDataKind; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.utils.CommonUtils; +import java.sql.Types; + public class SQLServerDataSource extends GenericDataSource { public SQLServerDataSource(DBRProgressMonitor monitor, DBPDataSourceContainer container) @@ -51,6 +54,21 @@ public class SQLServerDataSource extends GenericDataSource { return super.getDataSourceFeature(featureId); } + @Override + public DBPDataKind resolveDataKind(String typeName, int valueType) { + if (valueType == Types.VARCHAR) { + // Workaround for jTDS driver (#3555) + switch (typeName) { + case SQLServerConstants.TYPE_DATETIME: + case SQLServerConstants.TYPE_DATETIME2: + case SQLServerConstants.TYPE_SMALLDATETIME: + case SQLServerConstants.TYPE_DATETIMEOFFSET: + return DBPDataKind.DATETIME; + } + } + return super.resolveDataKind(typeName, valueType); + } + ////////////////////////////////////////////////////////// // Databases @@ -78,4 +96,5 @@ public class SQLServerDataSource extends GenericDataSource { return super.getConnectionUserPassword(connectionInfo); } } + } diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDialect.java b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDialect.java index 9098cbe7e24be410d3cbba313d9b1a653608a936..0e8552b4fc4872d6b339e758062ef26e924183d6 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDialect.java +++ b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerDialect.java @@ -29,6 +29,7 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameter; import org.jkiss.dbeaver.runtime.sql.SQLRuleProvider; import org.jkiss.utils.CommonUtils; +import java.sql.Types; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -84,6 +85,10 @@ public class SQLServerDialect extends GenericSQLDialect implements SQLRuleProvid if (dataKind == DBPDataKind.DATETIME) { Integer scale = column.getScale(); if (scale != null) { + if (column.getTypeID() == Types.VARCHAR && scale == 0) { + // Bug in jTDS. Scale is always zero so just ignore it (#3555) + return null; + } return "(" + scale + ')'; } }