diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java index 1ab1f86bff..436f78b9fc 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -85,12 +85,18 @@ public abstract class NamedParameterUtils { int escapes = 0; int i = 0; while (i < statement.length) { - int skipToPosition = skipCommentsAndQuotes(statement, i); - if (i != skipToPosition) { - if (skipToPosition >= statement.length) { + int skipToPosition = i; + while (i < statement.length) { + skipToPosition = skipCommentsAndQuotes(statement, i); + if (i == skipToPosition) { break; } - i = skipToPosition; + else { + i = skipToPosition; + } + } + if (i >= statement.length) { + break; } char c = statement[i]; if (c == ':' || c == '&') { diff --git a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java index ed4c54e0ee..48875c60f0 100644 --- a/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java +++ b/org.springframework.jdbc/src/test/java/org/springframework/jdbc/core/namedparam/NamedParameterUtilsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -268,4 +268,30 @@ public class NamedParameterUtilsTests { assertEquals(expectedSql, newSql); } + /* + * SPR-8280 + */ + @Test + public void parseSqlStatementWithQuotedSingleQuote() { + String sql = "SELECT ':foo'':doo', :xxx FROM DUAL"; + ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql); + assertEquals(1, psql.getTotalParameterCount()); + assertEquals("xxx", psql.getParameterNames().get(0)); + } + + @Test + public void parseSqlStatementWithQuotesAndCommentBefore() { + String sql = "SELECT /*:doo*/':foo', :xxx FROM DUAL"; + ParsedSql psql = NamedParameterUtils.parseSqlStatement(sql); + assertEquals(1, psql.getTotalParameterCount()); + assertEquals("xxx", psql.getParameterNames().get(0)); + } + + @Test + public void parseSqlStatementWithQuotesAndCommentAfter() { + String sql2 = "SELECT ':foo'/*:doo*/, :xxx FROM DUAL"; + ParsedSql psql2 = NamedParameterUtils.parseSqlStatement(sql2); + assertEquals(1, psql2.getTotalParameterCount()); + assertEquals("xxx", psql2.getParameterNames().get(0)); + } }