diff -r fb5516cbc522 Lib/sqlite3/test/dbapi.py --- a/Lib/sqlite3/test/dbapi.py Mon Apr 14 14:33:14 2014 -0400 +++ b/Lib/sqlite3/test/dbapi.py Thu Apr 17 14:13:39 2014 -0400 @@ -185,7 +185,9 @@ 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)") + sql_string = "create table test(id integer primary key, name text," + sql_string += "income number, unique_test text unique)" + self.cu.execute(sql_string) self.cu.execute("insert into test(name) values (?)", ("foo",)) def tearDown(self): @@ -511,6 +513,31 @@ except TypeError: pass + def CheckLastRowIDOnRplace(self): + """ + Originally added to address http://bugs.python.org/issue16864 + """ + #test curser values for unique and non-unique insert or replace + self.cu.execute("insert or replace into test(name) values (?)", ('What',)) + self.assertEqual(self.cu.lastrowid, 2) + self.cu.execute("insert or replace into test(name, unique_test) values (?, ?)", ('is', 'A',)) + self.assertEqual(self.cu.lastrowid, 3) + self.cu.execute("insert or replace into test(name, unique_test) values (?, ?)", ('baby', 'A',)) + self.assertEqual(self.cu.lastrowid, 4) + self.cu.execute("insert or replace into test(id, name, unique_test) values (?, ?, ?)", (4, "don't", 'A',)) + self.assertEqual(self.cu.lastrowid, 4) + #test curser values for replace, which should be synonymous for insert and replace + self.cu.execute("replace into test(name) values (?)", ('hurt',)) + #self.cu.execute("select * from test") + #print(self.cu.fetchall()) + self.assertEqual(self.cu.lastrowid, 5) + self.cu.execute("replace into test(name, unique_test) values (?, ?)", ("me", 'B',)) + self.assertEqual(self.cu.lastrowid, 6) + self.cu.execute("replace into test(name, unique_test) values (?, ?)", ('baby', 'A',)) + self.assertEqual(self.cu.lastrowid, 7) + self.cu.execute("replace into test(id, name, unique_test) values (?, ?, ?)", (4, "don't", 'A',)) + self.assertEqual(self.cu.lastrowid, 4) + @unittest.skipUnless(threading, 'This test requires threading.') class ThreadTests(unittest.TestCase): def setUp(self): diff -r fb5516cbc522 Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c Mon Apr 14 14:33:14 2014 -0400 +++ b/Modules/_sqlite/cursor.c Thu Apr 17 14:13:39 2014 -0400 @@ -702,7 +702,7 @@ } Py_DECREF(self->lastrowid); - if (!multiple && statement_type == STATEMENT_INSERT) { + if (!multiple && (statement_type == STATEMENT_INSERT || statement_type == STATEMENT_REPLACE)) { sqlite_int64 lastrowid; Py_BEGIN_ALLOW_THREADS lastrowid = sqlite3_last_insert_rowid(self->connection->db);