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
This commit is contained in:
Helen Xu 2012-11-26 22:02:44 +00:00
parent 404d9491f5
commit af3df6bd11
8 changed files with 41 additions and 8 deletions

View File

@ -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;

View File

@ -64,6 +64,7 @@ public class JDataStoreDictionary
"SHORT", "INT", "LONG", "DOUBLE PRECISION", "BOOLEAN",
}));
requiresSearchStringEscapeForLike = true;
searchStringEscape = "";
}

View File

@ -149,6 +149,7 @@ public class MySQLDictionary
"INDEX",
}));
requiresSearchStringEscapeForLike = true;
// MySQL requires double-escape for strings
searchStringEscape = "\\\\";

View File

@ -216,7 +216,6 @@ public class OracleDictionary
super.setBatchLimit(defaultBatchLimit);
selectWordSet.add("WITH");
reportsSuccessNoInfoOnBatchUpdates = true;
requiresSearchStringEscapeForLike = false;
}
@Override

View File

@ -767,6 +767,7 @@ public class PostgresDictionary
}
// Old PostgreSQL requires double-escape for strings.
if ((maj <= 8 || (maj == 9 && min == 0))) {
requiresSearchStringEscapeForLike = true;
searchStringEscape = "\\\\";
}
}

View File

@ -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"));
@ -155,6 +159,14 @@ 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"));

View File

@ -524,6 +524,25 @@
the <literal>javax.persistence.Column</literal> annotation.
</para>
</section>
<section id="jpa_2.3_RequiresSearchStringEscapeForLike">
<title>
RequiresSearchStringEscapeForLike DBDictionary Property
</title>
<!-- See OPENJPA-2282 for details. -->
<para>
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:
<programlisting> SELECT o.computerName FROM CompUser o WHERE o.name LIKE ?</programlisting>
At run time the following query is generated:
<programlisting> SELECT t0.computerName FROM CompUser t0 WHERE (t0.name LIKE ? ESCAPE '\')</programlisting>
ESCAPE '\' shouldn't be appended to the query.
</para>
<para>
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.
</para>
</section>
</section>
</section>
</appendix>

View File

@ -2243,7 +2243,7 @@ languages, such as JDOQL. Defaults to <literal>"\\"</literal>
<literal>RequiresSearchStringEscapeForLike</literal>:
When true, the database requires an escape string for queries that use
<literal>LIKE</literal>. The escape string can be specified using
<literal>searchStringEscape</literal>. Defaults to <literal>true</literal>.
<literal>searchStringEscape</literal>. Defaults to <literal>false</literal>.
</para>
</listitem>
<listitem id="DBDictionary.SelectWords">