METAMODEL-1127: Fixed setting of null Map on postgres
authorKasper Sørensen <i.am.kasper.sorensen@gmail.com>
Tue, 1 Nov 2016 08:04:33 +0000 (09:04 +0100)
committerDennis Du Krøger <dennis.dukroger@humaninference.com>
Tue, 1 Nov 2016 08:04:33 +0000 (09:04 +0100)
Fixes apache/metamodel#135

CHANGES.md
jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java
jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DefaultQueryRewriter.java
jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java [new file with mode: 0644]

index 236602e..0ee551c 100644 (file)
@@ -10,7 +10,8 @@
  * [METAMODEL-1119] - Worked around Hive JDBC driver issues, avoiding non-compliant metadata calls.
  * [METAMODEL-1123] - Fixed the treatment of a Salesforce.com 'currency' value as a number, not a string.
  * [METAMODEL-1124] - Fixed the date formatting of date values in MS SQL server.
-
+ * [METAMODEL-1127] - Fixed setting of null Map on postgres
 ### Apache MetaModel 4.5.4
 
  * [METAMODEL-1099] - Created a new DataContextFactory SPI and a extensible registry of implementations based on ServiceLoader.
index 5ce4445..98c8369 100644 (file)
@@ -63,7 +63,7 @@ import org.slf4j.LoggerFactory;
  */
 public abstract class AbstractQueryRewriter implements IQueryRewriter {
 
-    protected final Logger logger = LoggerFactory.getLogger(getClass());
+    private static final Logger logger = LoggerFactory.getLogger(AbstractQueryRewriter.class);
 
     private final JdbcDataContext _dataContext;
 
index fcefb9f..0dec7c1 100644 (file)
@@ -41,12 +41,16 @@ import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.query.SumAggregateFunction;
 import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Generic query rewriter that adds syntax enhancements that are only possible
  * to resolve just before execution time.
  */
 public class DefaultQueryRewriter extends AbstractQueryRewriter {
+    
+    private static final Logger logger = LoggerFactory.getLogger(DefaultQueryRewriter.class);
 
     private static final String SPECIAL_ALIAS_CHARACTERS = "- ,.|*%()!#¤/\\=?;:~";
     private static final Set<Class<? extends FunctionType>> SUPPORTED_FUNCTION_CLASSES = new HashSet<>(
index 531306f..7fe03cb 100644 (file)
@@ -83,7 +83,9 @@ public class PostgresqlQueryRewriter extends LimitOffsetQueryRewriter {
         case "json":
         case "jsonb":
             assert column.getType() == ColumnType.MAP;
-            if (value != null) {
+            if (value == null) {
+                st.setObject(valueIndex, null);
+            } else {
                 final PGobject pgo = new PGobject();
                 pgo.setType(column.getNativeType());
                 if (value instanceof Map) {
@@ -96,8 +98,8 @@ public class PostgresqlQueryRewriter extends LimitOffsetQueryRewriter {
                     pgo.setValue(value.toString());
                 }
                 st.setObject(valueIndex, pgo);
-                return;
             }
+            return;
         }
         super.setStatementParameter(st, valueIndex, column, value);
     }
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java
new file mode 100644 (file)
index 0000000..d7ecb3a
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.dialects;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+import org.apache.metamodel.schema.Column;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.MutableColumn;
+import org.easymock.EasyMock;
+import org.junit.Test;
+
+public class PostgresqlQueryRewriterTest {
+
+    @Test
+    public void testInsertNullMap() throws SQLException {
+        final PreparedStatement statementMock = EasyMock.createMock(PreparedStatement.class);
+
+        final PostgresqlQueryRewriter queryRewriter = new PostgresqlQueryRewriter(null);
+        final Column column = new MutableColumn("col").setType(ColumnType.MAP).setNativeType("jsonb");
+        final Object value = null;
+
+        // mock behaviour recording
+        statementMock.setObject(0, null);
+
+        EasyMock.replay(statementMock);
+
+        queryRewriter.setStatementParameter(statementMock, 0, column, value);
+
+        EasyMock.verify(statementMock);
+    }
+}