support for column names and other names that contain question marks without being flagged as a bound parameter issue
Describe the bug
we have tests for so-called "difficult column/parameter names" with various funny characters and things in column names and bound parameter names. A column name that includes a question mark seems to produce scenarios where querying against the table is impossible.
Stack trace:
Traceback (most recent call last):
File "/home/classic/dev/sqlalchemy/test3.py", line 27, in <module>
cursor.execute(
~~~~~~~~~~~~~~^
"SELECT * FROM t WHERE [q?marks]=%(somename)",
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{"somename": "thename"}
^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/classic/.venv3/lib/python3.14/site-packages/mssql_python/cursor.py", line 1331, in execute
operation, converted_params = detect_and_convert_parameters(operation, actual_params)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/classic/.venv3/lib/python3.14/site-packages/mssql_python/parameter_helper.py", line 325, in detect_and_convert_parameters
raise TypeError(
...<4 lines>...
)
TypeError: Parameter style mismatch: query uses positional placeholders (?), but dict was provided. Use tuple/list for positional parameters. Example: cursor.execute(sql, (value1, value2))
To reproduce
from mssql_python import connect conn_str = "UID=scott;PWD=tiger^5HHH;Server=mssql2022;Database=test;Encrypt=No" conn = connect(conn_str) cursor = conn.cursor() cursor.execute("drop table if exists t") # statement that has no parameter dictionary, this works because # it isn't trying to do anything with parameters cursor.execute(""" CREATE TABLE t ( id INTEGER NOT NULL IDENTITY, [q?marks] VARCHAR(50) NOT NULL, PRIMARY KEY (id) ) """) # statement that has a parameter dictionary, we get the error # "Parameter style mismatch: query uses positional placeholders (?), but dict # was provided. Use tuple/list for positional parameters." # # which is not actually correct, we have a named parameter in there as well. # but even so, how to indicate the question mark? some kind of escaping? cursor.execute( "SELECT * FROM t WHERE [q?marks]=%(somename)", {"somename": "thename"} )
Expected behavior
the driver does not assume the ? is attempting to be a parameter placeholder, or some form of escaping (like \?, ?? etc.) is made available so that this character may be used
Further technical details
version 1.4.0 of the driver