Description
We're attempting to get some test support for "numeric" paramstyle, which while unnecessary for sqlite3, is similar to the paramstyle used by a very widely used, non-pep-249 library asyncpg.
anyway, I don't think sqlite3 is interpreting "numeric" correctly when the numbers are not ordered. If we consider numbers like ":3, :4, :2, :1" etc. to just be more interesting looking question marks (like "?, ?, ?, ?"), that's certainly easy but it seems to defeat the purpose of "numeric" parameters, where we would assume the number refers to the position of an entry in the parameter list.
if indeed this is wrong and it's a bug (I'm going to ping the DBAPI SIG list with this, to get their notion of intent), I fully expect that sqlite3 probably cant change things at this point, but just want to understand indeed what the intent of "numeric" paramstyle is.
Demo below:
import sqlite3
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute(
"""
create table my_table(
a varchar,
b varchar,
c varchar,
d varchar,
e varchar
)
"""
)
cursor.execute(
"""
insert into my_table(a, b, c, d, e) values ('a', 'b', 'c', 'd', 'e')
"""
)
cursor.execute(
"""
select count(*) from my_table where a=? and b=? and c=? and d=? and e=?
""",
("a", "b", "c", "d", "e"),
)
assert cursor.fetchone() == (1, )
cursor.execute(
"""
select count(*) from my_table where a=:1 and b=:2 and c=:3 and d=:4 and e=:5
""",
("a", "b", "c", "d", "e"),
)
assert cursor.fetchone() == (1, )
cursor.execute(
"""
select count(*) from my_table where a=:3 and b=:4 and c=:1 and d=:5 and e=:2
""",
("c", "e", "a", "b", "d") # <--- fails
#("a", "b", "c", "d", "e"), # <--- succeeds, which is wrong
# {"3": "a", "4": "b", "1": "c", "2": "e", "5": "d"} # <--- succeeds, but this is not "numeric" paramstyle
)
assert cursor.fetchone() == (1, )
Linked PRs
Metadata
Metadata
Assignees
Projects
Status
Done