diff -r fd5f43737546 Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py Sat Dec 10 12:31:42 2011 -0500 +++ b/Lib/sqlite3/test/factory.py Sun Dec 11 22:42:19 2011 +0100 @@ -110,6 +110,17 @@ self.assertTrue(col1 == 1, "by index: wrong result for column 0") self.assertTrue(col2 == 2, "by index: wrong result for column 1") + def CheckSqliteRowSlice(self): + self.con.row_factory = sqlite.Row + row = self.con.execute("select 1, 2, 3, 4").fetchone() + self.assertTrue(row[0:0] == (), "by slice: wrong result for [0:0]") + self.assertTrue(row[0:1] == (1,), "by slice: wrong result for [0:1]") + self.assertTrue(row[1:3] == (2,3), "by slice: wrong result for [1:3]") + self.assertTrue(row[1:] == (2,3,4), "by slice: wrong result for [1:]") + self.assertTrue(row[:3] == (1,2,3), "by slice: wrong result for [:3]") + self.assertTrue(row[-2:-1] == (3,), "by slice: wrong result for [-2:-1]") + self.assertTrue(row[-2:] == (3,4), "by slice: wrong result for [-2:]") + def CheckSqliteRowIter(self): """Checks if the row object is iterable""" self.con.row_factory = sqlite.Row diff -r fd5f43737546 Modules/_sqlite/row.c --- a/Modules/_sqlite/row.c Sat Dec 10 12:31:42 2011 -0500 +++ b/Modules/_sqlite/row.c Sun Dec 11 22:42:19 2011 +0100 @@ -125,8 +125,13 @@ PyErr_SetString(PyExc_IndexError, "No item with that key"); return NULL; } else if (PySlice_Check(idx)) { - PyErr_SetString(PyExc_ValueError, "slices not implemented, yet"); - return NULL; + Py_ssize_t start, stop, step, slicelength; + if (PySlice_GetIndicesEx((PySliceObject*)idx, + PyTuple_GET_SIZE(self->data), + &start, &stop, &step, &slicelength) < 0) { + return NULL; + } + return PyTuple_GetSlice(self->data, start, stop); } else { PyErr_SetString(PyExc_IndexError, "Index must be int or string"); return NULL;