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 <[email protected]>
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' )" +