Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
2.0.0-rc
-
None
Description
While the named tuple implementation checks name.isidentifier it doesn't check if name is a keyword:
>>> cursor=conn.cursor(named_tuple=True)
>>> cursor.execute("select 1 as def")
>>> cursor.fetchone()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/georg/work/venv/lib/python3.12/site-packages/mariadb/sync_cursor.py", line 325, in fetchone
return self._apply_row_formatting([row])[0]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/georg/work/venv/lib/python3.12/site-packages/mariadb/base_cursor.py", line 669, in _apply_row_formatting
return self._convert_rows_to_named_tuples(rows, columns)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/georg/work/venv/lib/python3.12/site-packages/mariadb/base_cursor.py", line 645, in _convert_rows_to_named_tuples
RowClass = self._create_named_tuple_class(columns)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/georg/work/venv/lib/python3.12/site-packages/mariadb/base_cursor.py", line 641, in _create_named_tuple_class
return namedtuple('Row', field_names) # pyright: ignore[reportUntypedNamedTuple]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/collections/_init_.py", line 403, in namedtuple
raise ValueError('Type names and field names cannot be a '
ValueError: Type names and field names cannot be a keyword: 'def'
Proposed solution:
import keyword |
 |
...
|
if not name or not name.isidentifier() or keyword.iskeyword(name): |
name = f'column_{len(field_names)}' |