METAMODEL-1127: Fixed setting of null Map on postgres Fixes apache/metamodel#135
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/11710afe Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/11710afe Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/11710afe Branch: refs/heads/5.x Commit: 11710afe2d92d816a5cf850eb87a19e6e3af4ee1 Parents: c32a2bb Author: Kasper Sørensen <[email protected]> Authored: Tue Nov 1 09:04:33 2016 +0100 Committer: Dennis Du Krøger <[email protected]> Committed: Tue Nov 1 09:04:33 2016 +0100 ---------------------------------------------------------------------- CHANGES.md | 3 +- .../jdbc/dialects/AbstractQueryRewriter.java | 2 +- .../jdbc/dialects/DefaultQueryRewriter.java | 4 ++ .../jdbc/dialects/PostgresqlQueryRewriter.java | 6 ++- .../dialects/PostgresqlQueryRewriterTest.java | 49 ++++++++++++++++++++ 5 files changed, 60 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/11710afe/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 236602e..0ee551c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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. http://git-wip-us.apache.org/repos/asf/metamodel/blob/11710afe/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java ---------------------------------------------------------------------- diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java index 5ce4445..98c8369 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/AbstractQueryRewriter.java @@ -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; http://git-wip-us.apache.org/repos/asf/metamodel/blob/11710afe/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DefaultQueryRewriter.java ---------------------------------------------------------------------- diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DefaultQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DefaultQueryRewriter.java index fcefb9f..0dec7c1 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DefaultQueryRewriter.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DefaultQueryRewriter.java @@ -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<>( http://git-wip-us.apache.org/repos/asf/metamodel/blob/11710afe/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java ---------------------------------------------------------------------- diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java index 531306f..7fe03cb 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java @@ -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); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/11710afe/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java ---------------------------------------------------------------------- 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 index 0000000..d7ecb3a --- /dev/null +++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/PostgresqlQueryRewriterTest.java @@ -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); + } +}
