lowka commented on code in PR #2611:
URL: https://github.com/apache/ignite-3/pull/2611#discussion_r1347042200


##########
modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java:
##########
@@ -347,30 +352,94 @@ public void ddlInTransaction() {
         assertEquals(0, ((IgniteImpl) 
CLUSTER_NODES.get(0)).txManager().pending());
     }
 
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-20342";)
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "INSERT INTO tst VALUES (2, ?)",
+            "SELECT * FROM tst WHERE id = ? "
+    })
+    public void runtimeErrorInDmlCausesTransactionToFail(String query) {
+        sql("CREATE TABLE tst(id INTEGER PRIMARY KEY, val INTEGER)");
+
+        sql("INSERT INTO tst VALUES (?,?)", 1, 1);
+
+        try (Session ses = igniteSql().createSession()) {
+            Transaction tx = igniteTx().begin();
+            String dmlQuery = "UPDATE tst SET val = val/(val - ?) + 1";
+
+            assertThrowsSqlException(
+                    Sql.RUNTIME_ERR,
+                    "/ by zero",
+                    () -> ses.execute(tx, dmlQuery, 1).affectedRows());
+
+            IgniteException err = assertThrows(IgniteException.class, () -> {
+                ResultSet<SqlRow> rs = ses.execute(tx, query, 2);
+                if (rs.hasRowSet()) {
+                    assertTrue(rs.hasNext());
+                } else {
+                    assertTrue(rs.wasApplied());
+                }
+            });
+
+            assertEquals(Transactions.TX_FAILED_READ_WRITE_OPERATION_ERR, 
err.code(), err.toString());
+        }
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "INSERT INTO tst VALUES (2, ?)",
+            "SELECT * FROM tst WHERE id = ? "
+    })
+    public void runtimeErrorInQueryCausesTransactionToFail(String query) {
+        sql("CREATE TABLE tst(id INTEGER PRIMARY KEY, val INTEGER)");
+
+        sql("INSERT INTO tst VALUES (?,?)", 1, 1);
+
+        try (Session ses = igniteSql().createSession()) {
+            Transaction tx = igniteTx().begin();
+
+            assertThrowsSqlException(
+                    Sql.RUNTIME_ERR,
+                    "/ by zero",
+                    () -> ses.execute(tx, "SELECT val/? FROM tst WHERE id=?", 
0, 1).next());
+
+            IgniteException err = assertThrows(IgniteException.class, () -> {
+                ResultSet<SqlRow> rs = ses.execute(tx, query, 2);
+                if (rs.hasRowSet()) {
+                    assertTrue(rs.hasNext());
+                } else {
+                    assertTrue(rs.wasApplied());
+                }
+            });
+
+            assertEquals(Transactions.TX_FAILED_READ_WRITE_OPERATION_ERR, 
err.code(), err.toString());
+        }
+    }
+
     @Test
-    public void runtimeErrorInTransaction() {
-        int size = 100;
-        sql("CREATE TABLE tst(id INT PRIMARY KEY, val INT)");
-        for (int i = 0; i < size; i++) {
-            sql("INSERT INTO tst VALUES (?,?)", i, i);
+    @Disabled("https://issues.apache.org/jira/browse/IGNITE-20534";)
+    public void testLockIsNotReleasedAfterTxRollback() {
+        Ignite ignite = CLUSTER_NODES.get(0);
+        IgniteSql sql = ignite.sql();
+
+        try (Session ses = ignite.sql().createSession()) {
+            ses.execute(null, "CREATE TABLE IF NOT EXISTS tst(id INTEGER 
PRIMARY KEY, val INTEGER)").affectedRows();
         }
 
-        Session ses = igniteSql().createSession();
-        Transaction tx = igniteTx().begin();
+        try (Session session = sql.createSession()) {
+            Transaction tx = ignite.transactions().begin();
 
-        try {
-            String sqlText = "UPDATE tst SET val = val/(val - ?) + " + size;
+            assertThrows(RuntimeException.class, () -> session.execute(tx, 
"SELECT 1/0"));
 
-            for (int i = 0; i < size; i++) {
-                int param = i;
-                assertThrowsSqlException(
-                        Sql.RUNTIME_ERR,
-                        "/ by zero",
-                        () -> ses.execute(tx, sqlText, param));
+            tx.rollback();
+
+            session.execute(tx, "INSERT INTO tst VALUES (1, 1)");

Review Comment:
   What is an implicit rollback? There is no implicit rollbacks - transaction 
is rollbacked explicitly (user code calls a rollback), when error happens 
(internally in SQL engine), or is not rollbacked at all.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to