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' )" +