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