diff --git a/src/main/java/ru/yandex/clickhouse/ClickHousePreparedStatementImpl.java b/src/main/java/ru/yandex/clickhouse/ClickHousePreparedStatementImpl.java index 72aa4ef8d..e5e1fae0c 100644 --- a/src/main/java/ru/yandex/clickhouse/ClickHousePreparedStatementImpl.java +++ b/src/main/java/ru/yandex/clickhouse/ClickHousePreparedStatementImpl.java @@ -25,6 +25,7 @@ public class ClickHousePreparedStatementImpl extends ClickHouseStatementImpl implements ClickHousePreparedStatement { static final String PARAM_MARKER = "?"; + static final String NULL_MARKER = "\\N"; private static final Pattern VALUES = Pattern.compile("(?i)VALUES[\\s]*\\("); @@ -82,6 +83,8 @@ private String buildSql() throws SQLException { String pValue = getParameter(i - 1); if (PARAM_MARKER.equals(pValue)) { sb.append(binds[p++].getRegularValue()); + } else if (NULL_MARKER.equals(pValue)) { + sb.append("NULL"); } else { sb.append(pValue); } diff --git a/src/main/java/ru/yandex/clickhouse/PreparedStatementParser.java b/src/main/java/ru/yandex/clickhouse/PreparedStatementParser.java index d932f63c3..8225b5456 100644 --- a/src/main/java/ru/yandex/clickhouse/PreparedStatementParser.java +++ b/src/main/java/ru/yandex/clickhouse/PreparedStatementParser.java @@ -173,7 +173,7 @@ private static String typeTransformParameterValue(String paramValue) { return "0"; } if ("NULL".equalsIgnoreCase(paramValue)) { - return "\\N"; + return ClickHousePreparedStatementImpl.NULL_MARKER; } return paramValue; } diff --git a/src/test/java/ru/yandex/clickhouse/integration/ClickHousePreparedStatementTest.java b/src/test/java/ru/yandex/clickhouse/integration/ClickHousePreparedStatementTest.java index 864461d61..c290b6dff 100644 --- a/src/test/java/ru/yandex/clickhouse/integration/ClickHousePreparedStatementTest.java +++ b/src/test/java/ru/yandex/clickhouse/integration/ClickHousePreparedStatementTest.java @@ -640,6 +640,25 @@ public void testArrayDateTime() throws Exception { Assert.assertEquals(result[1].getTime(), 1560698526598L); } + @Test + public void testStaticNullValue() throws Exception { + connection.createStatement().execute( + "DROP TABLE IF EXISTS test.static_null_value"); + connection.createStatement().execute( + "CREATE TABLE IF NOT EXISTS test.static_null_value" + + "(foo Nullable(String), bar Nullable(String)) " + + "ENGINE = TinyLog" + ); + PreparedStatement ps0 = connection.prepareStatement( + "INSERT INTO test.static_null_value(foo) VALUES (null)"); + ps0.executeUpdate(); + + ps0 = connection.prepareStatement( + "INSERT INTO test.static_null_value(foo, bar) VALUES (null, ?)"); + ps0.setNull(1, Types.VARCHAR); + ps0.executeUpdate(); + } + private static byte[] randomEncodedUUID() { UUID uuid = UUID.randomUUID(); return ByteBuffer.allocate(16)