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 7d1787b92 CAY-2879 Negative number for non parameterized ObjectSelect 
query not processed correctly
7d1787b92 is described below

commit 7d1787b9298b26f8f8345e5ef843305df3bc39bc
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Fri Jan 31 14:53:37 2025 +0400

    CAY-2879 Negative number for non parameterized ObjectSelect query not 
processed correctly
---
 RELEASE-NOTES.txt                                  |  1 +
 .../translator/select/QualifierTranslator.java     |  5 +--
 .../translator/select/QualifierTranslatorIT.java   | 20 +++++++++++
 .../translator/select/QualifierTranslatorTest.java |  5 +--
 .../apache/cayenne/exp/parser/ASTNegateTest.java   | 41 ++++++++++++++++++++++
 5 files changed, 68 insertions(+), 4 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index df5400aec..536ed09fe 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -22,6 +22,7 @@ Bug Fixes:
 CAY-2866 DefaultDataDomainFlushAction breaks on circular relationship update
 CAY-2868 Regression: DefaultDbRowOpSorter shouldn't sort update operations
 CAY-2871 QualifierTranslator breaks on a relationship with a compound FK
+CAY-2879 Negative number for non parameterized ObjectSelect query not 
processed correctly
 
 ----------------------------------
 Release: 4.2.1
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
index 8147f31fa..37717fcbc 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
@@ -175,7 +175,6 @@ class QualifierTranslator implements TraversalHandler {
             case SUBTRACT:
             case MULTIPLY:
             case DIVIDE:
-            case NEGATIVE:
             case BITWISE_AND:
             case BITWISE_LEFT_SHIFT:
             case BITWISE_OR:
@@ -188,7 +187,9 @@ class QualifierTranslator implements TraversalHandler {
             case GREATER_THAN:
             case GREATER_THAN_EQUAL_TO:
                 return new OpExpressionNode(expToStr(node.getType()));
-
+            case NEGATIVE:
+                // we need to add minus sign as a prefix, not a separator
+                return new FunctionNode(expToStr(node.getType()), null, false);
             case TRUE:
             case FALSE:
             case ASTERISK:
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
index 15f1bd32a..785107c37 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java
@@ -25,6 +25,7 @@ import 
org.apache.cayenne.access.sqlbuilder.StringBuilderAppendable;
 import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
@@ -109,4 +110,23 @@ public class QualifierTranslatorIT extends ServerCase {
         assertEquals(" ( ( t0.F_KEY1 = 'PK1' ) AND ( t0.F_KEY2 = 'PK2' ) ) OR 
( ( t0.F_KEY1 = 'PK3' ) AND ( t0.F_KEY2 = 'PK4' ) )", visitor.getSQLString());
     }
 
+    @Test
+    public void testCAY_2879() {
+        ObjectSelect<CompoundFkTestEntity> query = 
ObjectSelect.query(CompoundFkTestEntity.class)
+                .where(ExpressionFactory.exp("name = -1"));
+
+        DefaultSelectTranslator translator
+                = new DefaultSelectTranslator(query, 
runtime.getDataDomain().getDefaultNode().getAdapter(), 
context.getEntityResolver());
+
+        QualifierTranslator qualifierTranslator = 
translator.getContext().getQualifierTranslator();
+
+        Node node = qualifierTranslator.translate(query.getWhere());
+
+        SQLGenerationVisitor visitor = new SQLGenerationVisitor(new 
StringBuilderAppendable());
+        node.visit(visitor);
+
+        assertEquals(" t0.NAME = - 1", visitor.getSQLString());
+
+    }
+
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
index aa8aeb7c4..e7d7b1570 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java
@@ -307,8 +307,9 @@ public class QualifierTranslatorTest {
 
         {
             Node op = translate("-2");
-            assertThat(op, instanceOf(OpExpressionNode.class));
-            assertEquals("-", ((OpExpressionNode)op).getOp());
+            assertThat(op, instanceOf(FunctionNode.class));
+            assertEquals("-", ((FunctionNode)op).getFunctionName());
+            assertNull(((FunctionNode) op).getAlias());
             assertEquals(1, op.getChildrenCount());
         }
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTNegateTest.java 
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTNegateTest.java
new file mode 100644
index 000000000..9e692e5cc
--- /dev/null
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTNegateTest.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.exp.parser;
+
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class ASTNegateTest {
+
+    @Test
+    public void testParse() {
+        // we don't have negative numbers, it's a combination of ASTNegate and 
Scalar
+        Expression exp = ExpressionFactory.exp("-1");
+        Object operand = exp.getOperand(0);
+
+        assertTrue(exp instanceof ASTNegate);
+        assertEquals(1, operand);
+        assertEquals("-1", exp.toString());
+    }
+
+}
\ No newline at end of file

Reply via email to