From 135eb21cff384605969d4e773d03ff6a92d718fc Mon Sep 17 00:00:00 2001 From: Igor Melnichenko Date: Wed, 5 Aug 2026 01:46:47 +0300 Subject: [PATCH] Include nested issues in Issue equality equals and hashCode ignored the nested issues, so two issues that differed only in their children compared equal. --- core/src/main/java/tech/ydb/core/Issue.java | 5 +++- .../test/java/tech/ydb/core/IssueTest.java | 28 ++++++++++++++++++- .../ydb/query/impl/QueryIntegrationTest.java | 8 ++++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/tech/ydb/core/Issue.java b/core/src/main/java/tech/ydb/core/Issue.java index ddf4c0b65..6ef63b325 100644 --- a/core/src/main/java/tech/ydb/core/Issue.java +++ b/core/src/main/java/tech/ydb/core/Issue.java @@ -1,6 +1,7 @@ package tech.ydb.core; import java.io.Serializable; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -146,7 +147,8 @@ public boolean equals(Object o) { && Objects.equals(position, issue.position) && Objects.equals(endPosition, issue.endPosition) && Objects.equals(message, issue.message) - && severity == issue.severity; + && severity == issue.severity + && Arrays.equals(issues, issue.issues); } @Override @@ -156,6 +158,7 @@ public int hashCode() { result = 31 * result + code; result = 31 * result + message.hashCode(); result = 31 * result + severity.hashCode(); + result = 31 * result + Arrays.hashCode(issues); return result; } diff --git a/core/src/test/java/tech/ydb/core/IssueTest.java b/core/src/test/java/tech/ydb/core/IssueTest.java index b47d62c44..64f9569bb 100644 --- a/core/src/test/java/tech/ydb/core/IssueTest.java +++ b/core/src/test/java/tech/ydb/core/IssueTest.java @@ -1,9 +1,10 @@ package tech.ydb.core; -import tech.ydb.core.Issue.Position; import org.junit.Assert; import org.junit.Test; +import tech.ydb.core.Issue.Position; + /** * @author Sergey Polovko @@ -37,4 +38,29 @@ public void testToString() { " 11:22: #4 message (S_WARNING)\n" + " 11:22 at file.cpp: #5 message (S_WARNING)", x.toString()); } + + @Test + public void testEquals() { + Issue nested1 = Issue.of(1, "nested 1", Issue.Severity.WARNING); + Issue nested2 = Issue.of(2, "nested 2", Issue.Severity.WARNING); + + Issue plain = Issue.of(7, "cause", Issue.Severity.FATAL); + Issue samePlain = Issue.of(7, "cause", Issue.Severity.FATAL); + + Assert.assertEquals(plain, samePlain); + Assert.assertEquals(plain.hashCode(), samePlain.hashCode()); + Assert.assertNotEquals(plain, Issue.of(8, "root cause", Issue.Severity.FATAL)); + Assert.assertNotEquals(plain, null); + + Issue withNested = Issue.of(Position.EMPTY, Position.EMPTY, 7, "cause", Issue.Severity.FATAL, nested1); + Issue withSameNested = Issue.of(Position.EMPTY, Position.EMPTY, 7, "cause", Issue.Severity.FATAL, nested1); + Issue withOtherNested = Issue.of(Position.EMPTY, Position.EMPTY, 7, "cause", Issue.Severity.FATAL, nested2); + + Assert.assertEquals(withNested, withSameNested); + Assert.assertEquals(withNested.hashCode(), withSameNested.hashCode()); + + // issues differing only in their nested issues are different issues + Assert.assertNotEquals(withNested, withOtherNested); + Assert.assertNotEquals(withNested, plain); + } } diff --git a/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java b/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java index f45a22ac1..5655254b4 100644 --- a/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java +++ b/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java @@ -610,9 +610,13 @@ public void testNoTxStatement() { Assert.assertFalse(result.isSuccess()); Assert.assertEquals(StatusCode.PRECONDITION_FAILED, result.getStatus().getCode()); - Issue issue = Issue.of(2012, + Issue issue = Issue.of( + Issue.Position.EMPTY, + Issue.Position.EMPTY, + 2012, "Constraint violated. Table: `" + ydbTransport.getDatabase() + "/" + TEST_TABLE + "`.", - Issue.Severity.ERROR + Issue.Severity.ERROR, + Issue.of(2012, "Conflict with existing key.", Issue.Severity.ERROR) ); Assert.assertArrayEquals(new Issue[] { issue }, result.getStatus().getIssues());