17db96d56Sopenharmony_ci# pysqlite2/test/transactions.py: tests transactions
27db96d56Sopenharmony_ci#
37db96d56Sopenharmony_ci# Copyright (C) 2005-2007 Gerhard Häring <gh@ghaering.de>
47db96d56Sopenharmony_ci#
57db96d56Sopenharmony_ci# This file is part of pysqlite.
67db96d56Sopenharmony_ci#
77db96d56Sopenharmony_ci# This software is provided 'as-is', without any express or implied
87db96d56Sopenharmony_ci# warranty.  In no event will the authors be held liable for any damages
97db96d56Sopenharmony_ci# arising from the use of this software.
107db96d56Sopenharmony_ci#
117db96d56Sopenharmony_ci# Permission is granted to anyone to use this software for any purpose,
127db96d56Sopenharmony_ci# including commercial applications, and to alter it and redistribute it
137db96d56Sopenharmony_ci# freely, subject to the following restrictions:
147db96d56Sopenharmony_ci#
157db96d56Sopenharmony_ci# 1. The origin of this software must not be misrepresented; you must not
167db96d56Sopenharmony_ci#    claim that you wrote the original software. If you use this software
177db96d56Sopenharmony_ci#    in a product, an acknowledgment in the product documentation would be
187db96d56Sopenharmony_ci#    appreciated but is not required.
197db96d56Sopenharmony_ci# 2. Altered source versions must be plainly marked as such, and must not be
207db96d56Sopenharmony_ci#    misrepresented as being the original software.
217db96d56Sopenharmony_ci# 3. This notice may not be removed or altered from any source distribution.
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciimport os, unittest
247db96d56Sopenharmony_ciimport sqlite3 as sqlite
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cifrom test.support import LOOPBACK_TIMEOUT
277db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, unlink
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_cifrom test.test_sqlite3.test_dbapi import memory_database
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ciTIMEOUT = LOOPBACK_TIMEOUT / 10
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ciclass TransactionTests(unittest.TestCase):
367db96d56Sopenharmony_ci    def setUp(self):
377db96d56Sopenharmony_ci        self.con1 = sqlite.connect(TESTFN, timeout=TIMEOUT)
387db96d56Sopenharmony_ci        self.cur1 = self.con1.cursor()
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci        self.con2 = sqlite.connect(TESTFN, timeout=TIMEOUT)
417db96d56Sopenharmony_ci        self.cur2 = self.con2.cursor()
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci    def tearDown(self):
447db96d56Sopenharmony_ci        try:
457db96d56Sopenharmony_ci            self.cur1.close()
467db96d56Sopenharmony_ci            self.con1.close()
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci            self.cur2.close()
497db96d56Sopenharmony_ci            self.con2.close()
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci        finally:
527db96d56Sopenharmony_ci            unlink(TESTFN)
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    def test_dml_does_not_auto_commit_before(self):
557db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
567db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
577db96d56Sopenharmony_ci        self.cur1.execute("create table test2(j)")
587db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
597db96d56Sopenharmony_ci        res = self.cur2.fetchall()
607db96d56Sopenharmony_ci        self.assertEqual(len(res), 0)
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci    def test_insert_starts_transaction(self):
637db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
647db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
657db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
667db96d56Sopenharmony_ci        res = self.cur2.fetchall()
677db96d56Sopenharmony_ci        self.assertEqual(len(res), 0)
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci    def test_update_starts_transaction(self):
707db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
717db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
727db96d56Sopenharmony_ci        self.con1.commit()
737db96d56Sopenharmony_ci        self.cur1.execute("update test set i=6")
747db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
757db96d56Sopenharmony_ci        res = self.cur2.fetchone()[0]
767db96d56Sopenharmony_ci        self.assertEqual(res, 5)
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    def test_delete_starts_transaction(self):
797db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
807db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
817db96d56Sopenharmony_ci        self.con1.commit()
827db96d56Sopenharmony_ci        self.cur1.execute("delete from test")
837db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
847db96d56Sopenharmony_ci        res = self.cur2.fetchall()
857db96d56Sopenharmony_ci        self.assertEqual(len(res), 1)
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    def test_replace_starts_transaction(self):
887db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
897db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
907db96d56Sopenharmony_ci        self.con1.commit()
917db96d56Sopenharmony_ci        self.cur1.execute("replace into test(i) values (6)")
927db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
937db96d56Sopenharmony_ci        res = self.cur2.fetchall()
947db96d56Sopenharmony_ci        self.assertEqual(len(res), 1)
957db96d56Sopenharmony_ci        self.assertEqual(res[0][0], 5)
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci    def test_toggle_auto_commit(self):
987db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
997db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
1007db96d56Sopenharmony_ci        self.con1.isolation_level = None
1017db96d56Sopenharmony_ci        self.assertEqual(self.con1.isolation_level, None)
1027db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
1037db96d56Sopenharmony_ci        res = self.cur2.fetchall()
1047db96d56Sopenharmony_ci        self.assertEqual(len(res), 1)
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci        self.con1.isolation_level = "DEFERRED"
1077db96d56Sopenharmony_ci        self.assertEqual(self.con1.isolation_level , "DEFERRED")
1087db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
1097db96d56Sopenharmony_ci        self.cur2.execute("select i from test")
1107db96d56Sopenharmony_ci        res = self.cur2.fetchall()
1117db96d56Sopenharmony_ci        self.assertEqual(len(res), 1)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci    def test_raise_timeout(self):
1147db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
1157db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
1167db96d56Sopenharmony_ci        with self.assertRaises(sqlite.OperationalError):
1177db96d56Sopenharmony_ci            self.cur2.execute("insert into test(i) values (5)")
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    def test_locking(self):
1207db96d56Sopenharmony_ci        """
1217db96d56Sopenharmony_ci        This tests the improved concurrency with pysqlite 2.3.4. You needed
1227db96d56Sopenharmony_ci        to roll back con2 before you could commit con1.
1237db96d56Sopenharmony_ci        """
1247db96d56Sopenharmony_ci        self.cur1.execute("create table test(i)")
1257db96d56Sopenharmony_ci        self.cur1.execute("insert into test(i) values (5)")
1267db96d56Sopenharmony_ci        with self.assertRaises(sqlite.OperationalError):
1277db96d56Sopenharmony_ci            self.cur2.execute("insert into test(i) values (5)")
1287db96d56Sopenharmony_ci        # NO self.con2.rollback() HERE!!!
1297db96d56Sopenharmony_ci        self.con1.commit()
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci    def test_rollback_cursor_consistency(self):
1327db96d56Sopenharmony_ci        """Check that cursors behave correctly after rollback."""
1337db96d56Sopenharmony_ci        con = sqlite.connect(":memory:")
1347db96d56Sopenharmony_ci        cur = con.cursor()
1357db96d56Sopenharmony_ci        cur.execute("create table test(x)")
1367db96d56Sopenharmony_ci        cur.execute("insert into test(x) values (5)")
1377db96d56Sopenharmony_ci        cur.execute("select 1 union select 2 union select 3")
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci        con.rollback()
1407db96d56Sopenharmony_ci        self.assertEqual(cur.fetchall(), [(1,), (2,), (3,)])
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci    def test_multiple_cursors_and_iternext(self):
1437db96d56Sopenharmony_ci        # gh-94028: statements are cleared and reset in cursor iternext.
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci        # Provoke the gh-94028 by using a cursor cache.
1467db96d56Sopenharmony_ci        CURSORS = {}
1477db96d56Sopenharmony_ci        def sql(cx, sql, *args):
1487db96d56Sopenharmony_ci            cu = cx.cursor()
1497db96d56Sopenharmony_ci            cu.execute(sql, args)
1507db96d56Sopenharmony_ci            CURSORS[id(sql)] = cu
1517db96d56Sopenharmony_ci            return cu
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci        self.con1.execute("create table t(t)")
1547db96d56Sopenharmony_ci        sql(self.con1, "insert into t values (?), (?), (?)", "u1", "u2", "u3")
1557db96d56Sopenharmony_ci        self.con1.commit()
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci        # On second connection, verify rows are visible, then delete them.
1587db96d56Sopenharmony_ci        count = sql(self.con2, "select count(*) from t").fetchone()[0]
1597db96d56Sopenharmony_ci        self.assertEqual(count, 3)
1607db96d56Sopenharmony_ci        changes = sql(self.con2, "delete from t").rowcount
1617db96d56Sopenharmony_ci        self.assertEqual(changes, 3)
1627db96d56Sopenharmony_ci        self.con2.commit()
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci        # Back in original connection, create 2 new users.
1657db96d56Sopenharmony_ci        sql(self.con1, "insert into t values (?)", "u4")
1667db96d56Sopenharmony_ci        sql(self.con1, "insert into t values (?)", "u5")
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci        # The second connection cannot see uncommitted changes.
1697db96d56Sopenharmony_ci        count = sql(self.con2, "select count(*) from t").fetchone()[0]
1707db96d56Sopenharmony_ci        self.assertEqual(count, 0)
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci        # First connection can see its own changes.
1737db96d56Sopenharmony_ci        count = sql(self.con1, "select count(*) from t").fetchone()[0]
1747db96d56Sopenharmony_ci        self.assertEqual(count, 2)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci        # The second connection can now see the changes.
1777db96d56Sopenharmony_ci        self.con1.commit()
1787db96d56Sopenharmony_ci        count = sql(self.con2, "select count(*) from t").fetchone()[0]
1797db96d56Sopenharmony_ci        self.assertEqual(count, 2)
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ciclass RollbackTests(unittest.TestCase):
1837db96d56Sopenharmony_ci    """bpo-44092: sqlite3 now leaves it to SQLite to resolve rollback issues"""
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    def setUp(self):
1867db96d56Sopenharmony_ci        self.con = sqlite.connect(":memory:")
1877db96d56Sopenharmony_ci        self.cur1 = self.con.cursor()
1887db96d56Sopenharmony_ci        self.cur2 = self.con.cursor()
1897db96d56Sopenharmony_ci        with self.con:
1907db96d56Sopenharmony_ci            self.con.execute("create table t(c)");
1917db96d56Sopenharmony_ci            self.con.executemany("insert into t values(?)", [(0,), (1,), (2,)])
1927db96d56Sopenharmony_ci        self.cur1.execute("begin transaction")
1937db96d56Sopenharmony_ci        select = "select c from t"
1947db96d56Sopenharmony_ci        self.cur1.execute(select)
1957db96d56Sopenharmony_ci        self.con.rollback()
1967db96d56Sopenharmony_ci        self.res = self.cur2.execute(select)  # Reusing stmt from cache
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci    def tearDown(self):
1997db96d56Sopenharmony_ci        self.con.close()
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci    def _check_rows(self):
2027db96d56Sopenharmony_ci        for i, row in enumerate(self.res):
2037db96d56Sopenharmony_ci            self.assertEqual(row[0], i)
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci    def test_no_duplicate_rows_after_rollback_del_cursor(self):
2067db96d56Sopenharmony_ci        del self.cur1
2077db96d56Sopenharmony_ci        self._check_rows()
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci    def test_no_duplicate_rows_after_rollback_close_cursor(self):
2107db96d56Sopenharmony_ci        self.cur1.close()
2117db96d56Sopenharmony_ci        self._check_rows()
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci    def test_no_duplicate_rows_after_rollback_new_query(self):
2147db96d56Sopenharmony_ci        self.cur1.execute("select c from t where c = 1")
2157db96d56Sopenharmony_ci        self._check_rows()
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ciclass SpecialCommandTests(unittest.TestCase):
2207db96d56Sopenharmony_ci    def setUp(self):
2217db96d56Sopenharmony_ci        self.con = sqlite.connect(":memory:")
2227db96d56Sopenharmony_ci        self.cur = self.con.cursor()
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci    def test_drop_table(self):
2257db96d56Sopenharmony_ci        self.cur.execute("create table test(i)")
2267db96d56Sopenharmony_ci        self.cur.execute("insert into test(i) values (5)")
2277db96d56Sopenharmony_ci        self.cur.execute("drop table test")
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci    def test_pragma(self):
2307db96d56Sopenharmony_ci        self.cur.execute("create table test(i)")
2317db96d56Sopenharmony_ci        self.cur.execute("insert into test(i) values (5)")
2327db96d56Sopenharmony_ci        self.cur.execute("pragma count_changes=1")
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci    def tearDown(self):
2357db96d56Sopenharmony_ci        self.cur.close()
2367db96d56Sopenharmony_ci        self.con.close()
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ciclass TransactionalDDL(unittest.TestCase):
2407db96d56Sopenharmony_ci    def setUp(self):
2417db96d56Sopenharmony_ci        self.con = sqlite.connect(":memory:")
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci    def test_ddl_does_not_autostart_transaction(self):
2447db96d56Sopenharmony_ci        # For backwards compatibility reasons, DDL statements should not
2457db96d56Sopenharmony_ci        # implicitly start a transaction.
2467db96d56Sopenharmony_ci        self.con.execute("create table test(i)")
2477db96d56Sopenharmony_ci        self.con.rollback()
2487db96d56Sopenharmony_ci        result = self.con.execute("select * from test").fetchall()
2497db96d56Sopenharmony_ci        self.assertEqual(result, [])
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci    def test_immediate_transactional_ddl(self):
2527db96d56Sopenharmony_ci        # You can achieve transactional DDL by issuing a BEGIN
2537db96d56Sopenharmony_ci        # statement manually.
2547db96d56Sopenharmony_ci        self.con.execute("begin immediate")
2557db96d56Sopenharmony_ci        self.con.execute("create table test(i)")
2567db96d56Sopenharmony_ci        self.con.rollback()
2577db96d56Sopenharmony_ci        with self.assertRaises(sqlite.OperationalError):
2587db96d56Sopenharmony_ci            self.con.execute("select * from test")
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def test_transactional_ddl(self):
2617db96d56Sopenharmony_ci        # You can achieve transactional DDL by issuing a BEGIN
2627db96d56Sopenharmony_ci        # statement manually.
2637db96d56Sopenharmony_ci        self.con.execute("begin")
2647db96d56Sopenharmony_ci        self.con.execute("create table test(i)")
2657db96d56Sopenharmony_ci        self.con.rollback()
2667db96d56Sopenharmony_ci        with self.assertRaises(sqlite.OperationalError):
2677db96d56Sopenharmony_ci            self.con.execute("select * from test")
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci    def tearDown(self):
2707db96d56Sopenharmony_ci        self.con.close()
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ciclass IsolationLevelFromInit(unittest.TestCase):
2747db96d56Sopenharmony_ci    CREATE = "create table t(t)"
2757db96d56Sopenharmony_ci    INSERT = "insert into t values(1)"
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci    def setUp(self):
2787db96d56Sopenharmony_ci        self.traced = []
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci    def _run_test(self, cx):
2817db96d56Sopenharmony_ci        cx.execute(self.CREATE)
2827db96d56Sopenharmony_ci        cx.set_trace_callback(lambda stmt: self.traced.append(stmt))
2837db96d56Sopenharmony_ci        with cx:
2847db96d56Sopenharmony_ci            cx.execute(self.INSERT)
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci    def test_isolation_level_default(self):
2877db96d56Sopenharmony_ci        with memory_database() as cx:
2887db96d56Sopenharmony_ci            self._run_test(cx)
2897db96d56Sopenharmony_ci            self.assertEqual(self.traced, ["BEGIN ", self.INSERT, "COMMIT"])
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci    def test_isolation_level_begin(self):
2927db96d56Sopenharmony_ci        with memory_database(isolation_level="") as cx:
2937db96d56Sopenharmony_ci            self._run_test(cx)
2947db96d56Sopenharmony_ci            self.assertEqual(self.traced, ["BEGIN ", self.INSERT, "COMMIT"])
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    def test_isolation_level_deferred(self):
2977db96d56Sopenharmony_ci        with memory_database(isolation_level="DEFERRED") as cx:
2987db96d56Sopenharmony_ci            self._run_test(cx)
2997db96d56Sopenharmony_ci            self.assertEqual(self.traced, ["BEGIN DEFERRED", self.INSERT, "COMMIT"])
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci    def test_isolation_level_immediate(self):
3027db96d56Sopenharmony_ci        with memory_database(isolation_level="IMMEDIATE") as cx:
3037db96d56Sopenharmony_ci            self._run_test(cx)
3047db96d56Sopenharmony_ci            self.assertEqual(self.traced,
3057db96d56Sopenharmony_ci                             ["BEGIN IMMEDIATE", self.INSERT, "COMMIT"])
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci    def test_isolation_level_exclusive(self):
3087db96d56Sopenharmony_ci        with memory_database(isolation_level="EXCLUSIVE") as cx:
3097db96d56Sopenharmony_ci            self._run_test(cx)
3107db96d56Sopenharmony_ci            self.assertEqual(self.traced,
3117db96d56Sopenharmony_ci                             ["BEGIN EXCLUSIVE", self.INSERT, "COMMIT"])
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci    def test_isolation_level_none(self):
3147db96d56Sopenharmony_ci        with memory_database(isolation_level=None) as cx:
3157db96d56Sopenharmony_ci            self._run_test(cx)
3167db96d56Sopenharmony_ci            self.assertEqual(self.traced, [self.INSERT])
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ciclass IsolationLevelPostInit(unittest.TestCase):
3207db96d56Sopenharmony_ci    QUERY = "insert into t values(1)"
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci    def setUp(self):
3237db96d56Sopenharmony_ci        self.cx = sqlite.connect(":memory:")
3247db96d56Sopenharmony_ci        self.cx.execute("create table t(t)")
3257db96d56Sopenharmony_ci        self.traced = []
3267db96d56Sopenharmony_ci        self.cx.set_trace_callback(lambda stmt: self.traced.append(stmt))
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci    def tearDown(self):
3297db96d56Sopenharmony_ci        self.cx.close()
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci    def test_isolation_level_default(self):
3327db96d56Sopenharmony_ci        with self.cx:
3337db96d56Sopenharmony_ci            self.cx.execute(self.QUERY)
3347db96d56Sopenharmony_ci        self.assertEqual(self.traced, ["BEGIN ", self.QUERY, "COMMIT"])
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci    def test_isolation_level_begin(self):
3377db96d56Sopenharmony_ci        self.cx.isolation_level = ""
3387db96d56Sopenharmony_ci        with self.cx:
3397db96d56Sopenharmony_ci            self.cx.execute(self.QUERY)
3407db96d56Sopenharmony_ci        self.assertEqual(self.traced, ["BEGIN ", self.QUERY, "COMMIT"])
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci    def test_isolation_level_deferrred(self):
3437db96d56Sopenharmony_ci        self.cx.isolation_level = "DEFERRED"
3447db96d56Sopenharmony_ci        with self.cx:
3457db96d56Sopenharmony_ci            self.cx.execute(self.QUERY)
3467db96d56Sopenharmony_ci        self.assertEqual(self.traced, ["BEGIN DEFERRED", self.QUERY, "COMMIT"])
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci    def test_isolation_level_immediate(self):
3497db96d56Sopenharmony_ci        self.cx.isolation_level = "IMMEDIATE"
3507db96d56Sopenharmony_ci        with self.cx:
3517db96d56Sopenharmony_ci            self.cx.execute(self.QUERY)
3527db96d56Sopenharmony_ci        self.assertEqual(self.traced,
3537db96d56Sopenharmony_ci                         ["BEGIN IMMEDIATE", self.QUERY, "COMMIT"])
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci    def test_isolation_level_exclusive(self):
3567db96d56Sopenharmony_ci        self.cx.isolation_level = "EXCLUSIVE"
3577db96d56Sopenharmony_ci        with self.cx:
3587db96d56Sopenharmony_ci            self.cx.execute(self.QUERY)
3597db96d56Sopenharmony_ci        self.assertEqual(self.traced,
3607db96d56Sopenharmony_ci                         ["BEGIN EXCLUSIVE", self.QUERY, "COMMIT"])
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci    def test_isolation_level_none(self):
3637db96d56Sopenharmony_ci        self.cx.isolation_level = None
3647db96d56Sopenharmony_ci        with self.cx:
3657db96d56Sopenharmony_ci            self.cx.execute(self.QUERY)
3667db96d56Sopenharmony_ci        self.assertEqual(self.traced, [self.QUERY])
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ciif __name__ == "__main__":
3707db96d56Sopenharmony_ci    unittest.main()
371