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

ppa 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 5370b3b85b IGNITE-20997 Sql. Improve the error message when attempting 
to divide by zero (#2951)
5370b3b85b is described below

commit 5370b3b85b2d7f4a793a81d180912ff7998306ce
Author: ygerzhedovich <41903880+ygerzhedov...@users.noreply.github.com>
AuthorDate: Wed Dec 13 14:05:10 2023 +0200

    IGNITE-20997 Sql. Improve the error message when attempting to divide by 
zero (#2951)
---
 .../org/apache/ignite/jdbc/ItJdbcTransactionTest.java    |  2 +-
 .../apache/ignite/internal/sql/api/ItSqlApiBaseTest.java | 10 +++++-----
 .../internal/sql/engine/ItSqlMultiStatementTest.java     |  2 +-
 .../internal/sql/engine/ItSqlMultiStatementTxTest.java   |  2 +-
 .../ignite/internal/sql/engine/util/IgniteMath.java      | 16 ++++++++++++++++
 5 files changed, 24 insertions(+), 8 deletions(-)

diff --git 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcTransactionTest.java
 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcTransactionTest.java
index 58c6888741..ad0d63dea6 100644
--- 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcTransactionTest.java
+++ 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/jdbc/ItJdbcTransactionTest.java
@@ -256,7 +256,7 @@ public class ItJdbcTransactionTest extends 
AbstractJdbcSelfTest {
             conn.setAutoCommit(false);
 
             try (Statement stmt = conn.createStatement()) {
-                assertThrowsSqlException("/ by zero", () -> 
stmt.executeQuery("SELECT 1/0").next());
+                assertThrowsSqlException("Division by zero", () -> 
stmt.executeQuery("SELECT 1/0").next());
 
                 assertThrowsSqlException("Transaction is already finished",
                         () -> {
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
index c0943e7fad..b4f57ee504 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlApiBaseTest.java
@@ -519,8 +519,8 @@ public abstract class ItSqlApiBaseTest extends 
BaseSqlIntegrationTest {
                 "CREATE TABLE TEST2 (VAL INT)");
 
         // Execute error.
-        checkSqlError(Sql.RUNTIME_ERR, "/ by zero", ses, "SELECT 1 / ?", 0);
-        checkSqlError(Sql.RUNTIME_ERR, "/ by zero", ses, "UPDATE TEST SET val0 
= val0/(val0 - ?) + " + ROW_COUNT, 0);
+        checkSqlError(Sql.RUNTIME_ERR, "Division by zero", ses, "SELECT 1 / 
?", 0);
+        checkSqlError(Sql.RUNTIME_ERR, "Division by zero", ses, "UPDATE TEST 
SET val0 = val0/(val0 - ?) + " + ROW_COUNT, 0);
         checkSqlError(Sql.RUNTIME_ERR, "negative substring length not 
allowed", ses, "SELECT SUBSTRING('foo', 1, -3)");
 
         // No result set error.
@@ -673,7 +673,7 @@ public abstract class ItSqlApiBaseTest extends 
BaseSqlIntegrationTest {
 
             assertThrowsSqlException(
                     Sql.RUNTIME_ERR,
-                    "/ by zero",
+                    "Division by zero",
                     () -> execute(tx, ses, dmlQuery, 1).affectedRows());
 
             IgniteException err = assertThrows(IgniteException.class, () -> {
@@ -704,7 +704,7 @@ public abstract class ItSqlApiBaseTest extends 
BaseSqlIntegrationTest {
 
             assertThrowsSqlException(
                     Sql.RUNTIME_ERR,
-                    "/ by zero",
+                    "Division by zero",
                     () -> execute(tx, ses, "SELECT val/? FROM tst WHERE id=?", 
0, 1));
 
             IgniteException err = assertThrows(IgniteException.class, () -> {
@@ -868,7 +868,7 @@ public abstract class ItSqlApiBaseTest extends 
BaseSqlIntegrationTest {
         try (Session session = sql.createSession()) {
             assertThrowsSqlException(
                     Sql.RUNTIME_ERR,
-                    "/ by zero",
+                    "Division by zero",
                     () -> executeScript(session,
                             "CREATE TABLE test (id INT PRIMARY KEY, step 
INTEGER); "
                                     + "INSERT INTO test VALUES(1, 0); "
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTest.java
index f48e0ccdf7..bcce32e083 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTest.java
@@ -141,7 +141,7 @@ public class ItSqlMultiStatementTest extends 
BaseSqlMultiStatementTest {
             cursor.closeAsync();
 
             CompletableFuture<AsyncSqlCursor<InternalSqlRow>> curFut0 = 
cursor.nextResult();
-            assertThrowsSqlException(RUNTIME_ERR, "/ by zero", () -> 
await(curFut0));
+            assertThrowsSqlException(RUNTIME_ERR, "Division by zero", () -> 
await(curFut0));
         }
 
         // Validation error.
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTxTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTxTest.java
index 92db578355..f6cf415100 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTxTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlMultiStatementTxTest.java
@@ -239,7 +239,7 @@ public class ItSqlMultiStatementTxTest extends 
BaseSqlMultiStatementTest {
                     + "COMMIT;"
             );
 
-            assertThrowsSqlException(RUNTIME_ERR, "/ by zero", () -> 
fetchAllCursors(cursor));
+            assertThrowsSqlException(RUNTIME_ERR, "Division by zero", () -> 
fetchAllCursors(cursor));
 
             verifyFinishedTxCount(1);
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMath.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMath.java
index 4b49020c4e..de069eb7c0 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMath.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMath.java
@@ -215,6 +215,9 @@ public class IgniteMath {
         if (y == -1) {
             return negateExact(x);
         }
+        if (y == 0) {
+            throwDivisionByZero();
+        }
 
         return x / y;
     }
@@ -224,6 +227,9 @@ public class IgniteMath {
         if (y == -1) {
             return negateExact(x);
         }
+        if (y == 0) {
+            throwDivisionByZero();
+        }
 
         return x / y;
     }
@@ -233,6 +239,9 @@ public class IgniteMath {
         if (y == -1) {
             return negateExact(x);
         }
+        if (y == 0) {
+            throwDivisionByZero();
+        }
 
         return (short) (x / y);
     }
@@ -242,10 +251,17 @@ public class IgniteMath {
         if (y == -1) {
             return negateExact(x);
         }
+        if (y == 0) {
+            throwDivisionByZero();
+        }
 
         return (byte) (x / y);
     }
 
+    private static void throwDivisionByZero() {
+        throw new SqlException(RUNTIME_ERR, "Division by zero");
+    }
+
     /** Cast value to {@code int}, throwing an exception if the result 
overflows an {@code int}. */
     public static int convertToIntExact(long x) {
         if ((int) x != x) {

Reply via email to