You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2019/05/04 15:01:05 UTC

[cayenne] 03/04: Do not use TRIM() in JOIN clauses and inside other function calls

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 9ef777667da5bb33e308b80a2d27443e574e2788
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Sat May 4 17:15:28 2019 +0300

    Do not use TRIM() in JOIN clauses and inside other function calls
---
 .../access/sqlbuilder/sqltree/TrimmingColumnNode.java       | 13 ++++++++++++-
 .../apache/cayenne/exp/parser/ASTFunctionCallStringIT.java  |  2 +-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
index c4c252b..b57e536 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/TrimmingColumnNode.java
@@ -38,7 +38,7 @@ public class TrimmingColumnNode extends Node {
     public QuotingAppendable append(QuotingAppendable buffer) {
         boolean isResult = isResultNode();
         if(columnNode.getAlias() == null || isResult) {
-            if(isCharType()) {
+            if(isCharType() && isAllowedForTrimming()) {
                 appendRtrim(buffer);
                 appendAlias(buffer, isResult);
             } else if(isComparisionWithClob()) {
@@ -72,6 +72,17 @@ public class TrimmingColumnNode extends Node {
                 && columnNode.getAttribute().getType() == Types.CHAR;
     }
 
+    protected boolean isAllowedForTrimming() {
+        Node parent = getParent();
+        while(parent != null) {
+            if(parent.getType() == NodeType.JOIN || parent.getType() == NodeType.FUNCTION) {
+                return false;
+            }
+            parent = parent.getParent();
+        }
+        return true;
+    }
+
     protected boolean isResultNode() {
         Node parent = getParent();
         while(parent != null) {
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallStringIT.java b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallStringIT.java
index 3a8742d..361c5b6 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallStringIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTFunctionCallStringIT.java
@@ -88,7 +88,7 @@ public class ASTFunctionCallStringIT extends ServerCase {
     public void testASTConcat() throws Exception {
         Artist a1 = createArtist("Pablo");
         Artist a2 = ObjectSelect.query(Artist.class)
-                .where(Artist.ARTIST_NAME.concat(" ", "Picasso").eq("Pablo Picasso")).selectOne(context);
+                .where(Artist.ARTIST_NAME.trim().concat(" ", "Picasso").eq("Pablo Picasso")).selectOne(context);
         assertEquals(a1, a2);
     }