bpo-26187: Test that set_trace_callback() is not called multiple times (GH-461)
conn.set_trace_callback() shouldn't be called multiple times when the
schema is changing.
This has indirectly been fixed by using sqlite3_prepare_v2() in bpo-9303.
diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py
index f8ef4d8..801a30c 100644
--- a/Lib/sqlite3/test/hooks.py
+++ b/Lib/sqlite3/test/hooks.py
@@ -24,6 +24,8 @@
import unittest
import sqlite3 as sqlite
+from test.support import TESTFN, unlink
+
class CollationTests(unittest.TestCase):
def CheckCreateCollationNotString(self):
con = sqlite.connect(":memory:")
@@ -248,6 +250,24 @@
"Unicode data %s garbled in trace callback: %s"
% (ascii(unicode_value), ', '.join(map(ascii, traced_statements))))
+ @unittest.skipIf(sqlite.sqlite_version_info < (3, 3, 9), "sqlite3_prepare_v2 is not available")
+ def CheckTraceCallbackContent(self):
+ # set_trace_callback() shouldn't produce duplicate content (bpo-26187)
+ traced_statements = []
+ def trace(statement):
+ traced_statements.append(statement)
+
+ queries = ["create table foo(x)",
+ "insert into foo(x) values(1)"]
+ self.addCleanup(unlink, TESTFN)
+ con1 = sqlite.connect(TESTFN, isolation_level=None)
+ con2 = sqlite.connect(TESTFN)
+ con1.set_trace_callback(trace)
+ cur = con1.cursor()
+ cur.execute(queries[0])
+ con2.execute("create table bar(x)")
+ cur.execute(queries[1])
+ self.assertEqual(traced_statements, queries)
def suite():