This is an automated email from the ASF dual-hosted git repository.

sk0x50 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 29f34fa292 IGNITE-19534 Fix error code duplication in the error 
message (#2107)
29f34fa292 is described below

commit 29f34fa292b76baa60bd6f3805d5ca9bea6b8e34
Author: Slava Koptilin <[email protected]>
AuthorDate: Thu Jun 1 12:32:47 2023 +0300

    IGNITE-19534 Fix error code duplication in the error message (#2107)
    
    Co-authored-by: Pavel Tupitsyn <[email protected]>
---
 .../apache/ignite/lang/IgniteCheckedException.java | 17 ++++--
 .../org/apache/ignite/lang/IgniteException.java    | 18 ++++--
 .../apache/ignite/lang/IgniteExceptionTest.java    | 71 +++++++++++++++++++---
 .../client/handler/ItClientHandlerMetricsTest.java |  2 +-
 .../handler/ClientInboundMessageHandler.java       |  5 ++
 .../java/org/apache/ignite/lang/ErrorGroup.java    |  3 +-
 .../lang/IgniteInternalCheckedException.java       | 19 +++---
 .../ignite/lang/IgniteInternalException.java       | 17 ++++--
 .../org/apache/ignite/lang/ErrorGroupTest.java     |  5 +-
 .../cpp/tests/client-test/compute_test.cpp         |  9 +--
 .../dotnet/Apache.Ignite.Tests/Sql/SqlTests.cs     | 21 +++----
 .../dotnet/Apache.Ignite/Internal/Table/Tables.cs  |  1 -
 .../apache/ignite/internal/sqllogic/Statement.java |  9 ++-
 .../internal/sql/engine/message/ErrorMessage.java  |  2 +
 14 files changed, 143 insertions(+), 56 deletions(-)

diff --git 
a/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java 
b/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java
index 1066afc6b0..30c5521511 100755
--- 
a/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java
@@ -20,7 +20,6 @@ package org.apache.ignite.lang;
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
 import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
-import static org.apache.ignite.lang.ErrorGroup.errorMessageFromCause;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
 import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 
@@ -66,8 +65,6 @@ public class IgniteCheckedException extends Exception {
      * @param code Full error code.
      */
     public IgniteCheckedException(UUID traceId, int code) {
-        super(errorMessage(traceId, code, null));
-
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
         this.code = code;
@@ -91,7 +88,7 @@ public class IgniteCheckedException extends Exception {
      * @param message Detailed message.
      */
     public IgniteCheckedException(UUID traceId, int code, String message) {
-        super(errorMessage(traceId, code, message));
+        super(message);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -116,7 +113,7 @@ public class IgniteCheckedException extends Exception {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteCheckedException(UUID traceId, int code, Throwable cause) {
-        super(errorMessageFromCause(traceId, code, cause), cause);
+        super((cause != null) ? cause.getLocalizedMessage() : null, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -143,7 +140,7 @@ public class IgniteCheckedException extends Exception {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteCheckedException(UUID traceId, int code, String message, 
Throwable cause) {
-        super(errorMessage(traceId, code, message), cause);
+        super(message, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -211,4 +208,12 @@ public class IgniteCheckedException extends Exception {
     public UUID traceId() {
         return traceId;
     }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        String s = getClass().getName();
+        String message = errorMessage(traceId, groupName, code, 
getLocalizedMessage());
+        return (message != null) ? (s + ": " + message) : s;
+    }
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java 
b/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java
index 3c8bc331b3..d9262b909d 100644
--- a/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java
+++ b/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java
@@ -20,7 +20,6 @@ package org.apache.ignite.lang;
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
 import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
-import static org.apache.ignite.lang.ErrorGroup.errorMessageFromCause;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
 import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
@@ -110,8 +109,6 @@ public class IgniteException extends RuntimeException {
      * @param code Full error code.
      */
     public IgniteException(UUID traceId, int code) {
-        super(errorMessage(traceId, code, null));
-
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
         this.code = code;
@@ -135,7 +132,7 @@ public class IgniteException extends RuntimeException {
      * @param message Detailed message.
      */
     public IgniteException(UUID traceId, int code, String message) {
-        super(errorMessage(traceId, code, message));
+        super(message);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -160,7 +157,7 @@ public class IgniteException extends RuntimeException {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteException(UUID traceId, int code, Throwable cause) {
-        super(errorMessageFromCause(traceId, code, cause), cause);
+        super((cause != null) ? cause.getLocalizedMessage() : null, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -187,7 +184,7 @@ public class IgniteException extends RuntimeException {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteException(UUID traceId, int code, String message, Throwable 
cause) {
-        super(errorMessage(traceId, code, message), cause);
+        super(message, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -255,6 +252,14 @@ public class IgniteException extends RuntimeException {
         return traceId;
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        String s = getClass().getName();
+        String message = errorMessage(traceId, groupName, code, 
getLocalizedMessage());
+        return (message != null) ? (s + ": " + message) : s;
+    }
+
     /**
      * Wraps an exception in an IgniteException, extracting {@link #traceId} 
and {@link #code} when the specified exception or one of its
      * causes is an IgniteException itself.
@@ -271,6 +276,7 @@ public class IgniteException extends RuntimeException {
             IgniteException iex = (IgniteException) e;
 
             try {
+                // TODO https://issues.apache.org/jira/browse/IGNITE-19535
                 Constructor<?> ctor = 
e.getClass().getDeclaredConstructor(UUID.class, int.class, String.class, 
Throwable.class);
 
                 return (IgniteException) ctor.newInstance(iex.traceId(), 
iex.code(), e.getMessage(), e);
diff --git 
a/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionTest.java 
b/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionTest.java
index 0daf396fd9..289ddbfbe5 100644
--- a/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionTest.java
+++ b/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionTest.java
@@ -17,13 +17,13 @@
 
 package org.apache.ignite.lang;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
+import static org.apache.ignite.lang.ErrorGroup.errorMessage;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertSame;
 
 import java.util.UUID;
 import java.util.concurrent.CompletionException;
+import org.apache.ignite.lang.ErrorGroups.Common;
 import org.apache.ignite.lang.ErrorGroups.Table;
 import org.junit.jupiter.api.Test;
 
@@ -32,34 +32,89 @@ import org.junit.jupiter.api.Test;
  */
 public class IgniteExceptionTest {
     @Test
-    public void testWrapUncheckedException() {
-        var originalEx = new CustomTestException(UUID.randomUUID(), 
Table.TABLE_NOT_FOUND_ERR, "Error foo bar", null);
+    public void testWrapPublicUncheckedException() {
+        var originalMessage = "Error foo bar";
+        var originalTraceId = UUID.randomUUID();
+        var expectedFullMessage = CustomTestException.class.getName() + ": "
+                + errorMessage(originalTraceId, Table.TABLE_NOT_FOUND_ERR, 
originalMessage);
+
+        var originalEx = new CustomTestException(originalTraceId, 
Table.TABLE_NOT_FOUND_ERR, originalMessage, null);
         var wrappedEx = new CompletionException(originalEx);
         var res = IgniteException.wrap(wrappedEx);
 
-        assertThat(res.getMessage(), containsString("Error foo bar"));
         assertEquals(originalEx.traceId(), res.traceId());
         assertEquals(originalEx.code(), res.code());
         assertEquals(originalEx.getClass(), res.getClass());
         assertSame(originalEx, res.getCause());
+        assertEquals(originalMessage, res.getMessage());
+        assertEquals(expectedFullMessage, res.toString());
     }
 
     @Test
-    public void testWrapCheckedException() {
-        var originalEx = new 
IgniteCheckedException(Table.COLUMN_ALREADY_EXISTS_ERR, "Msg.");
+    public void testWrapPublicCheckedException() {
+        var originalMessage = "Msg";
+        var originalTraceId = UUID.randomUUID();
+        var expectedFullMessage = IgniteException.class.getName() + ": "
+                + errorMessage(originalTraceId, 
Table.COLUMN_ALREADY_EXISTS_ERR, originalMessage);
+
+        var originalEx = new IgniteCheckedException(originalTraceId, 
Table.COLUMN_ALREADY_EXISTS_ERR, originalMessage);
         var wrappedEx = new CompletionException(originalEx);
         var res = IgniteException.wrap(wrappedEx);
 
-        assertThat(res.getMessage(), containsString("Msg."));
         assertEquals(originalEx.traceId(), res.traceId());
         assertEquals(originalEx.code(), res.code());
         assertSame(originalEx, res.getCause());
+        assertEquals(originalMessage, res.getMessage());
+        assertEquals(expectedFullMessage, res.toString());
+    }
+
+    @Test
+    public void testWrapInternalException() {
+        var originalMessage = "Unexpected error.";
+        var originalTraceId = UUID.randomUUID();
+
+        var originalEx = new IgniteInternalException(originalTraceId, 
Common.INTERNAL_ERR, originalMessage);
+        var wrappedEx = new CompletionException(originalEx);
+        var res = IgniteException.wrap(wrappedEx);
+
+        assertEquals(Common.INTERNAL_ERR, res.code());
+        assertSame(originalEx, res.getCause());
+        assertEquals(originalMessage, res.getMessage());
+    }
+
+    @Test
+    public void testWrapInternalCheckedException() {
+        var originalMessage = "Unexpected error.";
+        var originalTraceId = UUID.randomUUID();
+
+        var originalEx = new IgniteInternalCheckedException(originalTraceId, 
Common.INTERNAL_ERR, originalMessage);
+        var wrappedEx = new CompletionException(originalEx);
+        var res = IgniteException.wrap(wrappedEx);
+
+        assertEquals(Common.INTERNAL_ERR, res.code());
+        assertSame(originalEx, res.getCause());
+        assertEquals(originalMessage, res.getMessage());
+    }
+
+    @Test
+    public void testDuplicateErrorCode() {
+        var originalEx = new CustomTestException(Table.TABLE_NOT_FOUND_ERR, 
"Error foo bar", null);
+        var wrappedEx = new CustomTestException(originalEx.traceId(), 
originalEx.code(), originalEx.getMessage(), originalEx);
+
+        assertEquals(originalEx.traceId(), wrappedEx.traceId());
+        assertEquals(originalEx.code(), wrappedEx.code());
+        assertSame(originalEx, wrappedEx.getCause());
+        assertEquals(originalEx.getMessage(), wrappedEx.getMessage());
     }
 
     /**
      * Custom exception for tests.
      */
     public static class CustomTestException extends IgniteException {
+        public CustomTestException(int code, String message, Throwable cause) {
+            super(code, message, cause);
+        }
+
         public CustomTestException(UUID traceId, int code, String message, 
Throwable cause) {
             super(traceId, code, message, cause);
         }
diff --git 
a/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/ItClientHandlerMetricsTest.java
 
b/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/ItClientHandlerMetricsTest.java
index 3e24fe65da..62e0e67e13 100644
--- 
a/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/ItClientHandlerMetricsTest.java
+++ 
b/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/ItClientHandlerMetricsTest.java
@@ -147,7 +147,7 @@ public class ItClientHandlerMetricsTest {
         ItClientHandlerTestUtils.connectAndHandshake(serverModule, false, 
true);
 
         assertTrue(
-                IgniteTestUtils.waitForCondition(() -> 
testServer.metrics().bytesSent() == 216, 1000),
+                IgniteTestUtils.waitForCondition(() -> 
testServer.metrics().bytesSent() == 158, 1000),
                 () -> "bytesSent: " + testServer.metrics().bytesSent());
 
         assertTrue(
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
index 2e45d1ab85..80e0ac3a1b 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
@@ -103,6 +103,7 @@ import 
org.apache.ignite.internal.security.authentication.UsernamePasswordReques
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
 import org.apache.ignite.internal.util.ExceptionUtils;
+import org.apache.ignite.lang.IgniteCheckedException;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.IgniteInternalCheckedException;
 import org.apache.ignite.network.ClusterNode;
@@ -393,6 +394,10 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter im
             IgniteException iex = (IgniteException) err;
             packer.packUuid(iex.traceId());
             packer.packInt(iex.code());
+        } else if (err instanceof IgniteCheckedException) {
+            IgniteCheckedException iex = (IgniteCheckedException) err;
+            packer.packUuid(iex.traceId());
+            packer.packInt(iex.code());
         } else {
             packer.packUuid(UUID.randomUUID());
             packer.packInt(INTERNAL_ERR);
diff --git a/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroup.java 
b/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroup.java
index bda68a0247..47e854284a 100755
--- a/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroup.java
+++ b/modules/core/src/main/java/org/apache/ignite/lang/ErrorGroup.java
@@ -203,7 +203,8 @@ public class ErrorGroup {
      * @return New error message with predefined prefix.
      */
     public static String errorMessage(UUID traceId, String groupName, int 
code, String message) {
-        return ERR_PREFIX + groupName + '-' + extractErrorCode(code) + " 
TraceId:" + traceId + ((message != null) ? ' ' + message : "");
+        return ERR_PREFIX + groupName + '-' + extractErrorCode(code) + " 
TraceId:" + traceId
+                + ((message != null && !message.isEmpty()) ? ' ' + message : 
"");
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java
 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java
index 52733b294f..ba715a59e7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java
@@ -20,7 +20,6 @@ package org.apache.ignite.lang;
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
 import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
-import static org.apache.ignite.lang.ErrorGroup.errorMessageFromCause;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
 import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
@@ -68,8 +67,6 @@ public class IgniteInternalCheckedException extends Exception 
{
      * @param code Full error code.
      */
     public IgniteInternalCheckedException(UUID traceId, int code) {
-        super(errorMessage(traceId, code, null));
-
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
         this.code = code;
@@ -93,7 +90,7 @@ public class IgniteInternalCheckedException extends Exception 
{
      * @param message Detail message.
      */
     public IgniteInternalCheckedException(UUID traceId, int code, String 
message) {
-        super(errorMessage(traceId, code, message));
+        super(message);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -118,7 +115,7 @@ public class IgniteInternalCheckedException extends 
Exception {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteInternalCheckedException(UUID traceId, int code, Throwable 
cause) {
-        super(errorMessageFromCause(traceId, code, cause), cause);
+        super((cause != null) ? cause.getLocalizedMessage() : null, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -145,7 +142,7 @@ public class IgniteInternalCheckedException extends 
Exception {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteInternalCheckedException(UUID traceId, int code, String 
message, Throwable cause) {
-        super(errorMessage(traceId, code, message), cause);
+        super(message, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -168,7 +165,7 @@ public class IgniteInternalCheckedException extends 
Exception {
             @Nullable Throwable cause,
             boolean writableStackTrace
     ) {
-        super(errorMessage(traceId, code, message), cause, true, 
writableStackTrace);
+        super(message, cause, true, writableStackTrace);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -287,4 +284,12 @@ public class IgniteInternalCheckedException extends 
Exception {
     public UUID traceId() {
         return traceId;
     }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        String s = getClass().getName();
+        String message = errorMessage(traceId, groupName, code, 
getLocalizedMessage());
+        return (message != null) ? (s + ": " + message) : s;
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
index fb10cdbbbe..6e36871254 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
@@ -20,7 +20,6 @@ package org.apache.ignite.lang;
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
 import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
-import static org.apache.ignite.lang.ErrorGroup.errorMessageFromCause;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
 import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
@@ -68,8 +67,6 @@ public class IgniteInternalException extends RuntimeException 
{
      * @param code Full error code.
      */
     public IgniteInternalException(UUID traceId, int code) {
-        super(errorMessage(traceId, code, null));
-
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
         this.code = code;
@@ -93,7 +90,7 @@ public class IgniteInternalException extends RuntimeException 
{
      * @param message Detail message.
      */
     public IgniteInternalException(UUID traceId, int code, String message) {
-        super(errorMessage(traceId, code, message));
+        super(message);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -118,7 +115,7 @@ public class IgniteInternalException extends 
RuntimeException {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteInternalException(UUID traceId, int code, @Nullable Throwable 
cause) {
-        super(errorMessageFromCause(traceId, code, cause), cause);
+        super((cause != null) ? cause.getLocalizedMessage() : null, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -145,7 +142,7 @@ public class IgniteInternalException extends 
RuntimeException {
      * @param cause Optional nested exception (can be {@code null}).
      */
     public IgniteInternalException(UUID traceId, int code, String message, 
@Nullable Throwable cause) {
-        super(errorMessage(traceId, code, message), cause);
+        super(message, cause);
 
         this.traceId = traceId;
         this.groupName = errorGroupByCode((extractGroupCode(code))).name();
@@ -264,4 +261,12 @@ public class IgniteInternalException extends 
RuntimeException {
     public UUID traceId() {
         return traceId;
     }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        String s = getClass().getName();
+        String message = errorMessage(traceId, groupName, code, 
getLocalizedMessage());
+        return (message != null) ? (s + ": " + message) : s;
+    }
 }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java 
b/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java
index a1c8bb61b2..33e670c04c 100644
--- a/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java
@@ -77,9 +77,12 @@ class ErrorGroupTest {
 
         // When
         String errorMessage = origin.getMessage();
+        String detailedMessage = origin.toString();
 
         // Then error code and traceId are not duplicated
-        assertThat(errorMessage, equalTo("IGN-CMN-65535 
TraceId:24103638-d079-4a19-a8f6-ca9c23662908 I'm the\n reason\n"));
+        assertThat(errorMessage, equalTo("I'm the\n reason\n"));
+        assertThat(detailedMessage, 
equalTo("org.apache.ignite.lang.IgniteInternalException: "
+                + "IGN-CMN-65535 TraceId:24103638-d079-4a19-a8f6-ca9c23662908 
I'm the\n reason\n"));
     }
 
     @SuppressWarnings({"rawtypes", "OptionalGetWithoutIsPresent"})
diff --git a/modules/platforms/cpp/tests/client-test/compute_test.cpp 
b/modules/platforms/cpp/tests/client-test/compute_test.cpp
index e7f28a1ab4..cdeedbd8fe 100644
--- a/modules/platforms/cpp/tests/client-test/compute_test.cpp
+++ b/modules/platforms/cpp/tests/client-test/compute_test.cpp
@@ -172,10 +172,11 @@ TEST_F(compute_test, job_error_propagates_to_client) {
                 m_client.get_compute().execute(cluster_nodes, ERROR_JOB, 
{"unused"});
             } catch (const ignite_error &e) {
                 EXPECT_THAT(e.what_str(), testing::HasSubstr("Custom job 
error"));
-                EXPECT_THAT(e.what_str(),
-                    testing::HasSubstr(
-                        
"org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest$CustomException"));
-                EXPECT_THAT(e.what_str(), testing::HasSubstr("IGN-TBL-3"));
+                // TODO https://issues.apache.org/jira/browse/IGNITE-19603
+                // EXPECT_THAT(e.what_str(),
+                //     testing::HasSubstr(
+                //         
"org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest$CustomException"));
+                // EXPECT_THAT(e.what_str(), testing::HasSubstr("IGN-TBL-3"));
                 throw;
             }
         },
diff --git a/modules/platforms/dotnet/Apache.Ignite.Tests/Sql/SqlTests.cs 
b/modules/platforms/dotnet/Apache.Ignite.Tests/Sql/SqlTests.cs
index 531172cb7e..a7699e1454 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Tests/Sql/SqlTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Tests/Sql/SqlTests.cs
@@ -344,10 +344,9 @@ namespace Apache.Ignite.Tests.Sql
             var ex = Assert.ThrowsAsync<TableAlreadyExistsException>(
                 async () => await Client.Sql.ExecuteAsync(null, "CREATE TABLE 
TEST(ID INT PRIMARY KEY)"));
 
-            StringAssert.EndsWith("Table already exists 
[name=\"PUBLIC\".\"TEST\"]", ex!.Message);
-            StringAssert.StartsWith("IGN-TBL-1", ex.Message);
-            StringAssert.StartsWith("IGN-TBL-1", ex.CodeAsString);
-            StringAssert.StartsWith("TBL", ex.GroupName);
+            Assert.AreEqual("Table already exists [name=\"PUBLIC\".\"TEST\"]", 
ex!.Message);
+            Assert.AreEqual("IGN-TBL-1", ex.CodeAsString);
+            Assert.AreEqual("TBL", ex.GroupName);
             Assert.AreEqual(ErrorGroups.Table.TableAlreadyExists, ex.Code);
         }
 
@@ -357,10 +356,9 @@ namespace Apache.Ignite.Tests.Sql
             var ex = Assert.ThrowsAsync<TableNotFoundException>(
                 async () => await Client.Sql.ExecuteAsync(null, "ALTER TABLE 
NOT_EXISTS_TABLE ADD COLUMN VAL1 VARCHAR"));
 
-            StringAssert.EndsWith("The table does not exist 
[name=\"PUBLIC\".\"NOT_EXISTS_TABLE\"]", ex!.Message);
-            StringAssert.StartsWith("IGN-TBL-2", ex.Message);
-            StringAssert.StartsWith("IGN-TBL-2", ex.CodeAsString);
-            StringAssert.StartsWith("TBL", ex.GroupName);
+            Assert.AreEqual("The table does not exist 
[name=\"PUBLIC\".\"NOT_EXISTS_TABLE\"]", ex!.Message);
+            Assert.AreEqual("IGN-TBL-2", ex.CodeAsString);
+            Assert.AreEqual("TBL", ex.GroupName);
             Assert.AreEqual(ErrorGroups.Table.TableNotFound, ex.Code);
         }
 
@@ -370,10 +368,9 @@ namespace Apache.Ignite.Tests.Sql
             var ex = Assert.ThrowsAsync<ColumnAlreadyExistsException>(
                 async () => await Client.Sql.ExecuteAsync(null, "ALTER TABLE 
TEST ADD COLUMN ID INT"));
 
-            StringAssert.EndsWith("Column already exists [name=\"ID\"]", 
ex!.Message);
-            StringAssert.StartsWith("IGN-TBL-3", ex.Message);
-            StringAssert.StartsWith("IGN-TBL-3", ex.CodeAsString);
-            StringAssert.StartsWith("TBL", ex.GroupName);
+            Assert.AreEqual("Column already exists [name=\"ID\"]", 
ex!.Message);
+            Assert.AreEqual("IGN-TBL-3", ex.CodeAsString);
+            Assert.AreEqual("TBL", ex.GroupName);
             Assert.AreEqual(ErrorGroups.Table.ColumnAlreadyExists, ex.Code);
         }
 
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Tables.cs 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Tables.cs
index aa61d0fb2e..cde9b136ba 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Tables.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Table/Tables.cs
@@ -17,7 +17,6 @@
 
 namespace Apache.Ignite.Internal.Table
 {
-    using System;
     using System.Collections.Concurrent;
     using System.Collections.Generic;
     using System.Threading.Tasks;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/Statement.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/Statement.java
index f1d6c1a6bb..c2e5a0e9bd 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/Statement.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sqllogic/Statement.java
@@ -17,6 +17,10 @@
 
 package org.apache.ignite.internal.sqllogic;
 
+import static org.hamcrest.CoreMatchers.any;
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.google.common.base.Strings;
@@ -24,7 +28,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import org.hamcrest.CoreMatchers;
 import org.jetbrains.annotations.Nullable;
 import org.junit.jupiter.api.Assertions;
 
@@ -146,11 +149,11 @@ final class Statement extends Command {
         }
 
         static ExpectedStatementStatus error() {
-            return new ExpectedStatementStatus(false, 
CoreMatchers.any(String.class));
+            return new ExpectedStatementStatus(false, 
anyOf(nullValue(String.class), any(String.class)));
         }
 
         static ExpectedStatementStatus error(String errorMessage) {
-            return new ExpectedStatementStatus(false, 
CoreMatchers.containsString(errorMessage));
+            return new ExpectedStatementStatus(false, 
containsString(errorMessage));
         }
 
         @Override
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
index 43900c918e..efcc218269 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
 import java.util.UUID;
 import org.apache.ignite.network.NetworkMessage;
 import org.apache.ignite.network.annotations.Transferable;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * ErrorMessage interface.
@@ -51,5 +52,6 @@ public interface ErrorMessage extends NetworkMessage, 
Serializable {
     /**
      * Gets original error message.
      */
+    @Nullable
     String message();
 }

Reply via email to