mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
derive_named_parameters falls back to regex on SQL error, refs #1421
This commit is contained in:
parent
fc4846850f
commit
b1fed48a95
2 changed files with 13 additions and 9 deletions
|
|
@ -1080,11 +1080,12 @@ class StartupError(Exception):
|
||||||
|
|
||||||
_re_named_parameter = re.compile(":([a-zA-Z0-9_]+)")
|
_re_named_parameter = re.compile(":([a-zA-Z0-9_]+)")
|
||||||
|
|
||||||
|
|
||||||
async def derive_named_parameters(db, sql):
|
async def derive_named_parameters(db, sql):
|
||||||
explain = 'explain {}'.format(sql.strip().rstrip(";"))
|
explain = "explain {}".format(sql.strip().rstrip(";"))
|
||||||
possible_params = _re_named_parameter.findall(sql)
|
possible_params = _re_named_parameter.findall(sql)
|
||||||
try:
|
try:
|
||||||
results = await db.execute(explain, {p: None for p in possible_params})
|
results = await db.execute(explain, {p: None for p in possible_params})
|
||||||
return [row["p4"].lstrip(":") for row in results if row["opcode"] == "Variable"]
|
return [row["p4"].lstrip(":") for row in results if row["opcode"] == "Variable"]
|
||||||
except sqlite3.DatabaseError:
|
except sqlite3.DatabaseError:
|
||||||
return []
|
return possible_params
|
||||||
|
|
|
||||||
|
|
@ -629,13 +629,16 @@ def test_parse_metadata(content, expected):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
@pytest.mark.parametrize("sql,expected", (
|
@pytest.mark.parametrize(
|
||||||
|
"sql,expected",
|
||||||
|
(
|
||||||
("select 1", []),
|
("select 1", []),
|
||||||
("select 1 + :one", ["one"]),
|
("select 1 + :one", ["one"]),
|
||||||
("select 1 + :one + :two", ["one", "two"]),
|
("select 1 + :one + :two", ["one", "two"]),
|
||||||
("select 'bob' || '0:00' || :cat", ["cat"]),
|
("select 'bob' || '0:00' || :cat", ["cat"]),
|
||||||
("select this is invalid", []),
|
("select this is invalid :one, :two, :three", ["one", "two", "three"]),
|
||||||
))
|
),
|
||||||
|
)
|
||||||
async def test_derive_named_parameters(sql, expected):
|
async def test_derive_named_parameters(sql, expected):
|
||||||
ds = Datasette([], memory=True)
|
ds = Datasette([], memory=True)
|
||||||
db = ds.get_database("_memory")
|
db = ds.get_database("_memory")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue