mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
bpo-44859: Improve error handling in sqlite3 and and raise more accurate exceptions. (GH-27654)
* MemoryError is now raised instead of sqlite3.Warning when memory is not enough for encoding a statement to UTF-8 in Connection.__call__() and Cursor.execute(). * UnicodEncodeError is now raised instead of sqlite3.Warning when the statement contains surrogate characters in Connection.__call__() and Cursor.execute(). * TypeError is now raised instead of ValueError for non-string script argument in Cursor.executescript(). * ValueError is now raised for script containing the null character instead of truncating it in Cursor.executescript(). * Correctly handle exceptions raised when getting boolean value of the result of the progress handler. * Add many tests covering different corner cases. Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@innova.no>
This commit is contained in:
parent
ebecffdb6d
commit
0eec6276fd
10 changed files with 226 additions and 52 deletions
|
@ -24,7 +24,7 @@ import unittest
|
|||
import sqlite3 as sqlite
|
||||
|
||||
from test.support.os_helper import TESTFN, unlink
|
||||
|
||||
from .userfunctions import with_tracebacks
|
||||
|
||||
class CollationTests(unittest.TestCase):
|
||||
def test_create_collation_not_string(self):
|
||||
|
@ -145,7 +145,6 @@ class ProgressTests(unittest.TestCase):
|
|||
""")
|
||||
self.assertTrue(progress_calls)
|
||||
|
||||
|
||||
def test_opcode_count(self):
|
||||
"""
|
||||
Test that the opcode argument is respected.
|
||||
|
@ -198,6 +197,32 @@ class ProgressTests(unittest.TestCase):
|
|||
con.execute("select 1 union select 2 union select 3").fetchall()
|
||||
self.assertEqual(action, 0, "progress handler was not cleared")
|
||||
|
||||
@with_tracebacks(['bad_progress', 'ZeroDivisionError'])
|
||||
def test_error_in_progress_handler(self):
|
||||
con = sqlite.connect(":memory:")
|
||||
def bad_progress():
|
||||
1 / 0
|
||||
con.set_progress_handler(bad_progress, 1)
|
||||
with self.assertRaises(sqlite.OperationalError):
|
||||
con.execute("""
|
||||
create table foo(a, b)
|
||||
""")
|
||||
|
||||
@with_tracebacks(['__bool__', 'ZeroDivisionError'])
|
||||
def test_error_in_progress_handler_result(self):
|
||||
con = sqlite.connect(":memory:")
|
||||
class BadBool:
|
||||
def __bool__(self):
|
||||
1 / 0
|
||||
def bad_progress():
|
||||
return BadBool()
|
||||
con.set_progress_handler(bad_progress, 1)
|
||||
with self.assertRaises(sqlite.OperationalError):
|
||||
con.execute("""
|
||||
create table foo(a, b)
|
||||
""")
|
||||
|
||||
|
||||
class TraceCallbackTests(unittest.TestCase):
|
||||
def test_trace_callback_used(self):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue