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

ntimofeev pushed a commit to branch 5.0-FIX-CAY-2815-aliased-node
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 04ce7ff304e530dc136799984438783db89d5d95
Author: stariy95 <stari...@gmail.com>
AuthorDate: Wed Aug 30 13:15:29 2023 +0300

    CAY-2815 Incorrect translation of aliased expression
---
 RELEASE-NOTES.txt                                  |  3 ++-
 .../access/sqlbuilder/FunctionNodeBuilder.java     |  8 ++++++
 .../access/sqlbuilder/sqltree/AliasedNode.java     | 11 ++++++--
 .../access/sqlbuilder/sqltree/FunctionNode.java    |  2 +-
 .../access/sqlbuilder/sqltree/NodeType.java        |  3 ++-
 .../access/sqlbuilder/sqltree/SelectNode.java      |  5 ++++
 .../access/sqlbuilder/SelectBuilderTest.java       | 29 +++++++++++++++++++---
 7 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index a397506dc..23868ae11 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -60,4 +60,5 @@ CAY-2801 Incorrect equals() implementation in 
IdGenerationMarker could cause dat
 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
\ No newline at end of file
+CAY-2813 Regression: Constants.CI_PROPERTY flag is no longer working for MySQL
+CAY-2815 Incorrect translation of aliased expression
\ No newline at end of file
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..40f1efda5 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
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.access.sqlbuilder.sqltree;
 
-import org.apache.cayenne.access.sqlbuilder.NodeTreeVisitor;
+import  org.apache.cayenne.access.sqlbuilder.NodeTreeVisitor;
 import org.apache.cayenne.access.sqlbuilder.QuotingAppendable;
 
 /**
@@ -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 9d11f417a..dc94abb5a 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
@@ -120,7 +120,7 @@ public class SelectBuilderTest extends BaseSqlBuilderTest  {
                     "WHEN ( ( Quantity > 30 ) AND ( Quantity < 100 ) ) THEN 
'The quantity from 30 to 100' " +
                     "WHEN ( Quantity = 30 ) THEN 'The quantity is 30' " +
                     "ELSE 'The quantity is under 30' " +
-                    "END AS QuantityText " +
+                    "END QuantityText " +
                 "FROM OrderDetails", node);
     }
 
@@ -133,6 +133,29 @@ public class SelectBuilderTest extends BaseSqlBuilderTest  
{
                 .from(table("OrderDetails"));
     }
 
+    @Test
+    public void testQueryAlias() {
+        SelectBuilder innerSelect = select(table("p").column("PAINTING_TITLE"))
+                .from(table("PAINTING").as("p"));
+        Node node = select(table("t").column("*"))
+                .from(aliased(innerSelect, "t"))
+                .build();
+
+        assertThat(node, instanceOf(SelectNode.class));
+        assertSQL("SELECT t.* FROM (SELECT p.PAINTING_TITLE FROM PAINTING p) 
t", node);
+    }
+
+    @Test
+    public void testFunctionAlias() {
+        Node node = select(function("test", 
table("p").column("PAINTING_TITLE")).as("f"))
+                .from(table("PAINTING").as("p"))
+                .orderBy(function("test", 
table("p").column("PAINTING_TITLE")).as("f"))
+                .build();
+
+        assertThat(node, instanceOf(SelectNode.class));
+        assertSQL("SELECT test( p.PAINTING_TITLE ) f FROM PAINTING p ORDER BY 
f", node);
+    }
+
     @Test
     public void testComplexQuery() {
         Node node = select(
@@ -155,11 +178,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