Skip to content

Commit b06114d

Browse files
committed
Fix Record.keys() to correctly return duplicate keys. See #28.
1 parent 39b390c commit b06114d

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

asyncpg/protocol/record/recordobj.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ record_keys(PyObject *o, PyObject *args)
455455
return NULL;
456456
}
457457

458-
return PyObject_GetIter(((ApgRecordObject*)o)->desc->mapping);
458+
return PyObject_GetIter(((ApgRecordObject*)o)->desc->keys);
459459
}
460460

461461

tests/test_record.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,33 @@ def test_record_empty(self):
294294

295295
async def test_record_duplicate_colnames(self):
296296
"""Test that Record handles duplicate column names."""
297-
r = await self.con.fetchrow('SELECT 1 as a, 2 as a')
298-
self.assertEqual(r['a'], 2)
299-
self.assertEqual(r[0], 1)
300-
self.assertEqual(repr(r), '<Record a=1 a=2>')
301-
self.assertEqual(list(r.items()), [('a', 1), ('a', 2)])
297+
298+
records_descs = [
299+
[('a', 1)],
300+
[('a', 1), ('a', 2)],
301+
[('a', 1), ('b', 2), ('a', 3)],
302+
[('a', 1), ('b', 2), ('a', 3), ('c', 4), ('b', 5)],
303+
]
304+
305+
for desc in records_descs:
306+
items = collections.OrderedDict(desc)
307+
308+
query = 'SELECT ' + ', '.join(
309+
['{} as {}'.format(p[1], p[0]) for p in desc])
310+
311+
with self.subTest(query=query):
312+
r = await self.con.fetchrow(query)
313+
for idx, (field, val) in enumerate(desc):
314+
self.assertEqual(r[idx], val)
315+
self.assertEqual(r[field], items[field])
316+
317+
expected_repr = '<Record {}>'.format(
318+
' '.join('{}={}'.format(p[0], p[1]) for p in desc))
319+
self.assertEqual(repr(r), expected_repr)
320+
321+
self.assertEqual(list(r.items()), desc)
322+
self.assertEqual(list(r.values()), [p[1] for p in desc])
323+
self.assertEqual(list(r.keys()), [p[0] for p in desc])
302324

303325
async def test_record_isinstance(self):
304326
"""Test that Record works with isinstance."""

0 commit comments

Comments
 (0)