This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new b9ee8a6  [LOG4J2-2762] [JDBC] MS-SQL Server JDBC driver throws 
SQLServerException when inserting a null value for a VARBINARY column.
b9ee8a6 is described below

commit b9ee8a65b4d753a9231af14bcf51e16abf2e4efe
Author: Gary Gregory <[email protected]>
AuthorDate: Sat Jan 18 10:27:16 2020 -0500

    [LOG4J2-2762] [JDBC] MS-SQL Server JDBC driver throws SQLServerException
    when inserting a null value for a VARBINARY column.
---
 .../log4j/core/appender/db/jdbc/JdbcDatabaseManager.java | 16 ++++++++--------
 src/changes/changes.xml                                  |  3 +++
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
index 1a279d0..9bc2a3f 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java
@@ -747,7 +747,13 @@ public final class JdbcDatabaseManager extends 
AbstractDatabaseManager {
      * Sets the given Object in the prepared statement. The value is truncated 
if needed.
      */
     private void setStatementObject(final int j, final String nameKey, final 
Object value) throws SQLException {
-        statement.setObject(j, truncate(nameKey, value));
+        if (value == null) {
+            // [LOG4J2-2762] [JDBC] MS-SQL Server JDBC driver throws 
SQLServerException when inserting a null value for a VARBINARY column.
+            // Calling setNull() instead of setObject() for null values fixes 
[LOG4J2-2762]. 
+            this.statement.setNull(j, columnMetaData.get(nameKey).getType());
+        } else {
+            statement.setObject(j, truncate(nameKey, value));
+        }
     }
 
     @Override
@@ -818,13 +824,7 @@ public final class JdbcDatabaseManager extends 
AbstractDatabaseManager {
                             } else {
                                 final Object value = 
TypeConverters.convert(layout.toSerializable(event),
                                         mapping.getType(), null);
-                                if (value == null) {
-                                    // TODO We might need to always initialize 
the columnMetaData to specify the
-                                    // type.
-                                    this.statement.setNull(j++, Types.NULL);
-                                } else {
-                                    setStatementObject(j++, 
mapping.getNameKey(), value);
-                                }
+                                setStatementObject(j++, mapping.getNameKey(), 
value);
                             }
                         }
                     }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ec0f846..5bf8594 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -66,6 +66,9 @@
       <action issue="LOG4J2-2575" dev="rgoers" type="fix" due-to="Nathan 
Friess">
         CronExpression.getBeforeTime() would sometimes return incorrect result.
       </action>
+      <action issue="LOG4J2-2762" dev="ggregory" type="fix" due-to="Gary 
Gregory">
+        [JDBC] MS-SQL Server JDBC driver throws SQLServerException when 
inserting a null value for a VARBINARY column.
+      </action>
     </release>
     <release version="2.13.0" date="2019-12-11" description="GA Release 
2.13.0">
       <action issue="LOG4J2-2058" dev="rgoers" type="fix">

Reply via email to