This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch STABLE-4.2
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
new 2a9debc1c CAY-2813 Regression: Constants.CI_PROPERTY flag is no longer
working for MySQL
2a9debc1c is described below
commit 2a9debc1c84d4f82bc688114f7f993f1d0193e6f
Author: Nikita Timofeev
AuthorDate: Wed Aug 23 22:32:01 2023 +0300
CAY-2813 Regression: Constants.CI_PROPERTY flag is no longer working for
MySQL
(cherry picked from commit 983c51cd1f322ccbaa0468afe693adf938c3c1fe)
---
RELEASE-NOTES.txt | 1 +
.../select/TypeAwareSQLTreeProcessor.java | 3 +-
.../org/apache/cayenne/dba/mysql/MySQLAdapter.java | 2 +-
.../cayenne/dba/mysql/MySQLTreeProcessor.java | 14 +---
.../cayenne/dba/mysql/sqltree/MysqlLikeNode.java | 2 +-
.../access/sqlbuilder/BaseSqlBuilderTest.java | 10 +++---
.../cayenne/dba/mysql/MySQLTreeProcessorTest.java | 42 ++
7 files changed, 61 insertions(+), 13 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 1954a0dc8..10b3227e4 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -18,6 +18,7 @@ Bug Fixes:
CAY-2806 Incorrect processing of unicode escape syntax in JSON
CAY-2809 Cayenne Expression grammar doesn't allow custom function as an
argument for string functions
CAY-2810 Can't use custom operator expression with aggregate functions
+CAY-2813 Regression: Constants.CI_PROPERTY flag is no longer working for MySQL
--
Release: 4.2
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TypeAwareSQLTreeProcessor.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TypeAwareSQLTreeProcessor.java
index 7e48aed3f..b1f36b312 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TypeAwareSQLTreeProcessor.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/TypeAwareSQLTreeProcessor.java
@@ -92,7 +92,8 @@ public class TypeAwareSQLTreeProcessor extends
SimpleNodeTreeVisitor implements
protected DbAttribute getColumnAttribute(ColumnNode node) {
DbAttribute attribute = node.getAttribute();
-if(attribute.getType() == Types.OTHER
+if(attribute != null
+&& attribute.getType() == Types.OTHER
&& node.getParent() != null
&& node.getParent().getType() == NodeType.RESULT) {
return attribute;
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
index 1573379ff..9a2acfef5 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
@@ -112,7 +112,7 @@ public class MySQLAdapter extends JdbcAdapter {
*/
@Override
public SQLTreeProcessor getSqlTreeProcessor() {
- return MySQLTreeProcessor.getInstance();
+ return
MySQLTreeProcessor.getInstance(caseInsensitiveCollations);
}
/**
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLTreeProcessor.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLTreeProcessor.java
index f8243f5e8..e5ab32556 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLTreeProcessor.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLTreeProcessor.java
@@ -38,14 +38,18 @@ import org.apache.cayenne.value.Wkt;
*/
public class MySQLTreeProcessor extends TypeAwareSQLTreeProcessor {
-private static final MySQLTreeProcessor INSTANCE = new
MySQLTreeProcessor();
+private static final MySQLTreeProcessor INSTANCE_CI = new
MySQLTreeProcessor(true);
+private static final MySQLTreeProcessor INSTANCE_CS = new
MySQLTreeProcessor(false);
-public static MySQLTreeProcessor getInstance() {
-return INSTANCE;
+public static MySQLTreeProcessor getInstance(boolean
caseInsensitiveCollations) {
+return caseInsensitiveCollations ? INSTANCE_CI : INSTANCE_CS;
}
-protected MySQLTreeProcessor() {
-registerProcessor(NodeType.LIKE, (ChildProcessor)
this::onLikeNode);
+protected MySQLTreeProcessor(boolean ciCollations) {
+if(ciCollations) {
+// For case insensitive collations we need to use `LIKE BINARY`
operator to keep strict `LIKE` semantics
+registerProcessor(NodeType.LIKE, (ChildProcessor)
this::onLikeNode);
+}
registerProcessor(NodeType.LIMIT_OFFSET,
(ChildProcessor) this::onLimitOffsetNode);
registerProcessor(NodeType.FUNCTION, (ChildProcessor)