From af3df6bd117efa2384f81a79728a1906da766c78 Mon Sep 17 00:00:00 2001 From: Helen Xu Date: Mon, 26 Nov 2012 22:02:44 +0000 Subject: [PATCH] OPENJPA-2282 do not append escape clause by default. git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1413890 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/openjpa/jdbc/sql/DBDictionary.java | 2 +- .../jdbc/sql/JDataStoreDictionary.java | 1 + .../openjpa/jdbc/sql/MySQLDictionary.java | 1 + .../openjpa/jdbc/sql/OracleDictionary.java | 1 - .../openjpa/jdbc/sql/PostgresDictionary.java | 1 + .../expressions/TestEJBQLCondExpression.java | 22 ++++++++++++++----- .../doc/manual/migration_considerations.xml | 19 ++++++++++++++++ .../src/doc/manual/ref_guide_dbsetup.xml | 2 +- 8 files changed, 41 insertions(+), 8 deletions(-) diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java index 353a8396b..7f0503711 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java @@ -247,7 +247,7 @@ public class DBDictionary public boolean requiresTargetForDelete = false; public boolean allowsAliasInBulkClause = true; public boolean supportsMultipleNontransactionalResultSets = true; - public boolean requiresSearchStringEscapeForLike = true; + public boolean requiresSearchStringEscapeForLike = false; public String searchStringEscape = "\\"; public boolean requiresCastForMathFunctions = false; public boolean requiresCastForComparisons = false; diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/JDataStoreDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/JDataStoreDictionary.java index 7d6945120..2a5c95bcc 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/JDataStoreDictionary.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/JDataStoreDictionary.java @@ -64,6 +64,7 @@ public class JDataStoreDictionary "SHORT", "INT", "LONG", "DOUBLE PRECISION", "BOOLEAN", })); + requiresSearchStringEscapeForLike = true; searchStringEscape = ""; } diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java index 309c74a43..459a67beb 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java @@ -149,6 +149,7 @@ public class MySQLDictionary "INDEX", })); + requiresSearchStringEscapeForLike = true; // MySQL requires double-escape for strings searchStringEscape = "\\\\"; diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java index ec05e201e..57c5f13a8 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java @@ -216,7 +216,6 @@ public class OracleDictionary super.setBatchLimit(defaultBatchLimit); selectWordSet.add("WITH"); reportsSuccessNoInfoOnBatchUpdates = true; - requiresSearchStringEscapeForLike = false; } @Override diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java index 8cb754640..2fbf7b6fb 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java @@ -767,6 +767,7 @@ public class PostgresDictionary } // Old PostgreSQL requires double-escape for strings. if ((maj <= 8 || (maj == 9 && min == 0))) { + requiresSearchStringEscapeForLike = true; searchStringEscape = "\\\\"; } } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java index 4d7bd9587..092f54c0f 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java @@ -42,13 +42,16 @@ public class TestEJBQLCondExpression extends AbstractTestCase { new Address("24 Mink", "ANTIOCH", "USA", "94513"), new Address("23 Ogbete", "CoalCamp", "NIGERIA", "00000"), new Address("10 Wilshire", "Worcester", "CANADA", "80080"), - new Address("23 Bellflower", "Ogui", "NIGERIA", "02000") }; + new Address("23 Bellflower", "Ogui", "NIGERIA", "02000"), + new Address("24 Bellflower", "Ogui", "NIGERIA", "02000")}; + CompUser user1 = createUser("Seetha", "MAC", add[0], 40, true); CompUser user2 = createUser("Shannon", "PC", add[1], 36, false); CompUser user3 = createUser("Ugo", "PC", add[2], 19, true); CompUser user4 = createUser("Jacob", "LINUX", add[3], 10, true); CompUser user5 = createUser("Famzy", "UNIX", add[4], 29, false); + CompUser user6 = createUser("tes\\ter", "Test", add[5], 10, true); em.persist(user1); userid1 = user1.getUserid(); @@ -60,6 +63,7 @@ public class TestEJBQLCondExpression extends AbstractTestCase { userid4 = user4.getUserid(); em.persist(user5); userid5 = user5.getUserid(); + em.persist(user6); endTx(em); endEm(em); @@ -72,7 +76,7 @@ public class TestEJBQLCondExpression extends AbstractTestCase { List result = em.createQuery(query).getResultList(); assertNotNull("the list is null", result); - assertEquals("the size of the list is not 5", 5, result.size()); + assertEquals("the size of the list is not 6", 6, result.size()); endEm(em); } @@ -113,7 +117,7 @@ public class TestEJBQLCondExpression extends AbstractTestCase { List result = em.createQuery(query).getResultList(); assertNotNull("the list is null", result); - assertEquals(3, result.size()); + assertEquals(4, result.size()); assertTrue("seetha is not in the list", result.contains("Seetha")); assertTrue("jacob is not in the list", result.contains("Jacob")); assertTrue("famzy is not in the list", result.contains("Famzy")); @@ -154,7 +158,15 @@ public class TestEJBQLCondExpression extends AbstractTestCase { assertNotNull(result); assertEquals(1, result.size()); + + query = "SELECT o.computerName FROM CompUser o WHERE o.name " + + "LIKE 'tes\\%'"; + result = em.createQuery(query).getResultList(); + + assertNotNull(result); + assertEquals(1, result.size()); + query = "SELECT o.name FROM CompUser o WHERE o.name LIKE '_J%'"; result = em.createQuery(query).getResultList(); @@ -226,7 +238,7 @@ public class TestEJBQLCondExpression extends AbstractTestCase { List result = em.createQuery(query).getResultList(); assertNotNull("the list is null", result); - assertEquals("they are not equal", 5, result.size()); + assertEquals("they are not equal", 6, result.size()); endEm(em); } @@ -245,7 +257,7 @@ public class TestEJBQLCondExpression extends AbstractTestCase { List result = em.createQuery(query).getResultList(); assertNotNull("the list is null", result); - assertEquals("they are not equal", 5, result.size()); + assertEquals("they are not equal", 6, result.size()); assertTrue("Seetha is not list", result.contains("Seetha")); assertTrue("Shannon is not list", result.contains("Shannon")); assertTrue("jacob is not list", result.contains("Jacob")); diff --git a/openjpa-project/src/doc/manual/migration_considerations.xml b/openjpa-project/src/doc/manual/migration_considerations.xml index 2f63f2d55..9bb00fe2b 100644 --- a/openjpa-project/src/doc/manual/migration_considerations.xml +++ b/openjpa-project/src/doc/manual/migration_considerations.xml @@ -524,6 +524,25 @@ the javax.persistence.Column annotation. +
+ + RequiresSearchStringEscapeForLike DBDictionary Property + + + + In previous releases, the default value for the property RequiresSearchStringEscapeForLike is true and caused the + unexpected escape clause appended to the SQL statement. + For example, user created a named query like this: + SELECT o.computerName FROM CompUser o WHERE o.name LIKE ? + At run time the following query is generated: + SELECT t0.computerName FROM CompUser t0 WHERE (t0.name LIKE ? ESCAPE '\') + ESCAPE '\' shouldn't be appended to the query. + + + From the 2.3.0 release, RequiresSearchStringEscapeForLike property is set to false by default. You can configure + RequiresSearchStringEscapeForLike property to be true if the old behavior is desired. + +
diff --git a/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml b/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml index 55430c97d..073497d91 100644 --- a/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml +++ b/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml @@ -2243,7 +2243,7 @@ languages, such as JDOQL. Defaults to "\\" RequiresSearchStringEscapeForLike: When true, the database requires an escape string for queries that use LIKE. The escape string can be specified using -searchStringEscape. Defaults to true. +searchStringEscape. Defaults to false.