From 8db8c85b69d003e5abc09c492d297b65620060ad Mon Sep 17 00:00:00 2001 From: arturgspb Date: Mon, 27 Mar 2017 11:46:55 +0300 Subject: [PATCH] SPR-15382 Spring Jdbc add Postgresql ?| and ?& operators support --- .../core/namedparam/NamedParameterUtils.java | 4 ++-- .../namedparam/NamedParameterUtilsTests.java | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java index cbde6f799df..6e47509b67b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java @@ -153,8 +153,8 @@ public abstract class NamedParameterUtils { } if (c == '?') { int j = i + 1; - if (j < statement.length && statement[j] == '?') { - // Postgres-style "??" operator should be skipped + if (j < statement.length && (statement[j] == '?' || statement[j] == '|' || statement[j] == '&')) { + // Postgres-style "??", "?|", "?&" operator should be skipped i = i + 2; continue; } diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java index acac10e94c7..d7c2b3f737b 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java @@ -189,6 +189,26 @@ public class NamedParameterUtilsTests { assertEquals(expectedSql, NamedParameterUtils.substituteNamedParameters(parsedSql, null)); } + @Test // SPR-15382 + public void parseSqlStatementWithPostgresAnyArrayStringsExistsOperator() throws Exception { + String expectedSql = "select '[\"3\", \"11\"]'::jsonb ?| '{1,3,11,12,17}'::text[]"; + String sql = "select '[\"3\", \"11\"]'::jsonb ?| '{1,3,11,12,17}'::text[]"; + + ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); + assertEquals(0, parsedSql.getTotalParameterCount()); + assertEquals(expectedSql, NamedParameterUtils.substituteNamedParameters(parsedSql, null)); + } + + @Test // SPR-15382 + public void parseSqlStatementWithPostgresAllArrayStringsExistsOperator() throws Exception { + String expectedSql = "select '[\"3\", \"11\"]'::jsonb ?& '{1,3,11,12,17}'::text[] AND ? = 'Back in Black'"; + String sql = "select '[\"3\", \"11\"]'::jsonb ?& '{1,3,11,12,17}'::text[] AND :album = 'Back in Black'"; + + ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql); + assertEquals(1, parsedSql.getTotalParameterCount()); + assertEquals(expectedSql, NamedParameterUtils.substituteNamedParameters(parsedSql, null)); + } + @Test // SPR-7476 public void parseSqlStatementWithEscapedColon() throws Exception { String expectedSql = "select '0\\:0' as a, foo from bar where baz < DATE(? 23:59:59) and baz = ?";