[3.13] gh-129603: Don't segfault if sqlite3.Row description is None (#129604) (#129923)

(cherry picked from commit 7e6ee50b6b)
This commit is contained in:
Erlend E. Aasland 2025-02-10 01:21:33 +01:00 committed by GitHub
parent d26c2fe7a2
commit d6daeeeb2f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 83 additions and 10 deletions

View file

@ -1947,5 +1947,70 @@ def wait():
self.assertEqual(proc.returncode, 0)
class RowTests(unittest.TestCase):
def setUp(self):
self.cx = sqlite.connect(":memory:")
self.cx.row_factory = sqlite.Row
def tearDown(self):
self.cx.close()
def test_row_keys(self):
cu = self.cx.execute("SELECT 1 as first, 2 as second")
row = cu.fetchone()
self.assertEqual(row.keys(), ["first", "second"])
def test_row_length(self):
cu = self.cx.execute("SELECT 1, 2, 3")
row = cu.fetchone()
self.assertEqual(len(row), 3)
def test_row_getitem(self):
cu = self.cx.execute("SELECT 1 as a, 2 as b")
row = cu.fetchone()
self.assertEqual(row[0], 1)
self.assertEqual(row[1], 2)
self.assertEqual(row["a"], 1)
self.assertEqual(row["b"], 2)
for key in "nokey", 4, 1.2:
with self.subTest(key=key):
with self.assertRaises(IndexError):
row[key]
def test_row_equality(self):
c1 = self.cx.execute("SELECT 1 as a")
r1 = c1.fetchone()
c2 = self.cx.execute("SELECT 1 as a")
r2 = c2.fetchone()
self.assertIsNot(r1, r2)
self.assertEqual(r1, r2)
c3 = self.cx.execute("SELECT 1 as b")
r3 = c3.fetchone()
self.assertNotEqual(r1, r3)
def test_row_no_description(self):
cu = self.cx.cursor()
self.assertIsNone(cu.description)
row = sqlite.Row(cu, ())
self.assertEqual(row.keys(), [])
with self.assertRaisesRegex(IndexError, "nokey"):
row["nokey"]
def test_row_is_a_sequence(self):
from collections.abc import Sequence
cu = self.cx.execute("SELECT 1")
row = cu.fetchone()
self.assertTrue(issubclass(sqlite.Row, Sequence))
self.assertTrue(isinstance(row, Sequence))
if __name__ == "__main__":
unittest.main()