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 e57d6a3b0 CAY-2815 Incorrect translation of aliased expression
e57d6a3b0 is described below

commit e57d6a3b08965b06869bab64e513b228cbc00674
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Mon Oct 2 18:06:34 2023 +0400

    CAY-2815 Incorrect translation of aliased expression
    
    (cherry picked from commit 5f5b304ffce8c3e95d23c1f65c861d7365433ad8)
---
 RELEASE-NOTES.txt                                                | 1 +
 .../apache/cayenne/access/sqlbuilder/FunctionNodeBuilder.java    | 8 ++++++++
 .../apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java    | 9 ++++++++-
 .../apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java   | 2 +-
 .../org/apache/cayenne/access/sqlbuilder/sqltree/NodeType.java   | 3 ++-
 .../org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java | 5 +++++
 .../org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java  | 4 ++--
 7 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 10b3227e4..ab27b4664 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -19,6 +19,7 @@ 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
+CAY-2815 Incorrect translation of aliased expression
 
 ----------------------------------
 Release: 4.2
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/FunctionNodeBuilder.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/FunctionNodeBuilder.java
index 5146431a6..0623965b9 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/FunctionNodeBuilder.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/FunctionNodeBuilder.java
@@ -42,6 +42,14 @@ public class FunctionNodeBuilder implements ExpressionTrait {
         return this;
     }
 
+    public OrderingNodeBuilder desc() {
+        return new OrderingNodeBuilder(this).desc();
+    }
+
+    public OrderingNodeBuilder asc() {
+        return new OrderingNodeBuilder(this).asc();
+    }
+
     @Override
     public Node build() {
         Node functionNode = new FunctionNode(functionName, alias, true);
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
index f6cf638e9..63a92e7f6 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/AliasedNode.java
@@ -61,7 +61,7 @@ public class AliasedNode extends Node {
         if(skipContent()){
             return;
         }
-        buffer.append(" AS ").append(alias);
+        buffer.append(" ").append(alias);
     }
 
     public String getAlias() {
@@ -77,6 +77,13 @@ public class AliasedNode extends Node {
             }
             parent = parent.getParent();
         }
+
+        // check if we have subselect as a child
+        for(Node child : children) {
+            if(child.getType() == NodeType.SELECT) {
+                return false;
+            }
+        }
         return true;
     }
 }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
index 390287ae5..8920c860b 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/FunctionNode.java
@@ -89,7 +89,7 @@ public class FunctionNode extends Node {
         }
 
         if (alias != null) {
-            buffer.append(" AS ").appendQuoted(alias);
+            buffer.append(" ").appendQuoted(alias);
         }
     }
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NodeType.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NodeType.java
index f463c077d..c02019af7 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NodeType.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/NodeType.java
@@ -39,5 +39,6 @@ public enum NodeType {
     UPDATE_SET,
     INSERT_COLUMNS,
     INSERT_VALUES,
-    ORDER_BY
+    ORDER_BY,
+    SELECT
 }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
index 0afc84042..7871ca03a 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/SelectNode.java
@@ -45,4 +45,9 @@ public class SelectNode extends Node {
     public Node copy() {
         return new SelectNode();
     }
+
+    @Override
+    public NodeType getType() {
+        return NodeType.SELECT;
+    }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
index 2631944a0..3da73da82 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/sqlbuilder/SelectBuilderTest.java
@@ -123,11 +123,11 @@ public class SelectBuilderTest extends BaseSqlBuilderTest 
 {
                 )
                 .groupBy(table("a").column("ARTIST_ID"))
                 
.having(not(count(table("p").column("PAINTING_TITLE")).gt(value(3))))
-                .orderBy(column("p_count").desc(), column("a_id").asc())
+                
.orderBy(count(table("p").column("PAINTING_TITLE")).as("p_count").desc(), 
column("a_id").asc())
                 .build();
         assertThat(node, instanceOf(SelectNode.class));
         assertSQL("SELECT DISTINCT" +
-                    " a.ARTIST_ID a_id, COUNT( p.PAINTING_TITLE ) AS p_count" +
+                    " a.ARTIST_ID a_id, COUNT( p.PAINTING_TITLE ) p_count" +
                 " FROM ARTIST a" +
                 " LEFT JOIN PAINTING p ON ( a.ARTIST_ID = p.ARTIST_ID ) AND ( 
p.ESTIMATED_PRICE > 10 )" +
                 " WHERE ( ( ( a.ARTIST_NAME = 'Picasso' )" +

Reply via email to