mirror of
https://github.com/python/cpython.git
synced 2025-07-24 19:54:21 +00:00
Issue #16864: Cursor.lastrowid now supports REPLACE statement
Initial patch by Alex LordThorsen.
This commit is contained in:
parent
34f12d7315
commit
e0b70cd8a9
6 changed files with 66 additions and 5 deletions
|
@ -188,7 +188,10 @@ class CursorTests(unittest.TestCase):
|
|||
def setUp(self):
|
||||
self.cx = sqlite.connect(":memory:")
|
||||
self.cu = self.cx.cursor()
|
||||
self.cu.execute("create table test(id integer primary key, name text, income number)")
|
||||
self.cu.execute(
|
||||
"create table test(id integer primary key, name text, "
|
||||
"income number, unique_test text unique)"
|
||||
)
|
||||
self.cu.execute("insert into test(name) values (?)", ("foo",))
|
||||
|
||||
def tearDown(self):
|
||||
|
@ -462,6 +465,44 @@ class CursorTests(unittest.TestCase):
|
|||
with self.assertRaises(TypeError):
|
||||
cur = sqlite.Cursor(foo)
|
||||
|
||||
def CheckLastRowIDOnReplace(self):
|
||||
"""
|
||||
INSERT OR REPLACE and REPLACE INTO should produce the same behavior.
|
||||
"""
|
||||
sql = '{} INTO test(id, unique_test) VALUES (?, ?)'
|
||||
for statement in ('INSERT OR REPLACE', 'REPLACE'):
|
||||
with self.subTest(statement=statement):
|
||||
self.cu.execute(sql.format(statement), (1, 'foo'))
|
||||
self.assertEqual(self.cu.lastrowid, 1)
|
||||
|
||||
def CheckLastRowIDOnIgnore(self):
|
||||
self.cu.execute(
|
||||
"insert or ignore into test(unique_test) values (?)",
|
||||
('test',))
|
||||
self.assertEqual(self.cu.lastrowid, 2)
|
||||
self.cu.execute(
|
||||
"insert or ignore into test(unique_test) values (?)",
|
||||
('test',))
|
||||
self.assertEqual(self.cu.lastrowid, 2)
|
||||
|
||||
def CheckLastRowIDInsertOR(self):
|
||||
results = []
|
||||
for statement in ('FAIL', 'ABORT', 'ROLLBACK'):
|
||||
sql = 'INSERT OR {} INTO test(unique_test) VALUES (?)'
|
||||
with self.subTest(statement='INSERT OR {}'.format(statement)):
|
||||
self.cu.execute(sql.format(statement), (statement,))
|
||||
results.append((statement, self.cu.lastrowid))
|
||||
with self.assertRaises(sqlite.IntegrityError):
|
||||
self.cu.execute(sql.format(statement), (statement,))
|
||||
results.append((statement, self.cu.lastrowid))
|
||||
expected = [
|
||||
('FAIL', 2), ('FAIL', 2),
|
||||
('ABORT', 3), ('ABORT', 3),
|
||||
('ROLLBACK', 4), ('ROLLBACK', 4),
|
||||
]
|
||||
self.assertEqual(results, expected)
|
||||
|
||||
|
||||
@unittest.skipUnless(threading, 'This test requires threading.')
|
||||
class ThreadTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue