From dfe70ac611e3383f15206a3908cbae915f9ad142 Mon Sep 17 00:00:00 2001 From: "libra-exla[bot]" <207437117+libra-exla[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:36:11 +0000 Subject: [PATCH] fix issue #1: cannot-execute-a-write-query-with-a-parameter-ca --- .../templates/_sql_parameter_scripts.html | 34 ++++++++++++----- datasette/templates/_sql_parameters.html | 5 ++- datasette/views/execute_write.py | 2 + datasette/views/query_helpers.py | 14 ++++--- tests/test_api_write.py | 38 +++++++++++++++++++ 5 files changed, 76 insertions(+), 17 deletions(-) diff --git a/datasette/templates/_sql_parameter_scripts.html b/datasette/templates/_sql_parameter_scripts.html index 159a141c44..ec095cdf42 100644 --- a/datasette/templates/_sql_parameter_scripts.html +++ b/datasette/templates/_sql_parameter_scripts.html @@ -22,21 +22,28 @@ }; } + function parameterName(control) { + return control.dataset.parameterName || control.name; + } + function syncParameterState(manager) { manager.parameterState = new Map(); manager.section .querySelectorAll("[data-parameter-control]") .forEach((control) => { - manager.parameterState.set(control.name, controlState(control)); + manager.parameterState.set(parameterName(control), controlState(control)); }); } - function createControl(parameter, id, state) { + function createControl(parameter, id, state, namePrefix) { const control = document.createElement(state.expanded ? "textarea" : "input"); control.id = id; - control.name = parameter; + control.name = `${namePrefix || ""}${parameter}`; control.value = state.value; control.setAttribute("data-parameter-control", ""); + if (namePrefix) { + control.dataset.parameterName = parameter; + } if (state.expanded) { control.rows = 5; } else { @@ -53,10 +60,16 @@ value, selectionStart ) { - const replacement = createControl(control.name, control.id, { - value: value === undefined ? control.value : value, - expanded: expand, - }); + const parameter = parameterName(control); + const replacement = createControl( + parameter, + control.id, + { + value: value === undefined ? control.value : value, + expanded: expand, + }, + manager.namePrefix + ); button.textContent = expand ? "Collapse" : "Expand"; button.setAttribute("aria-expanded", expand ? "true" : "false"); control.replaceWith(replacement); @@ -64,7 +77,7 @@ if (selectionStart !== undefined && replacement.setSelectionRange) { replacement.setSelectionRange(selectionStart, selectionStart); } - manager.parameterState.set(replacement.name, controlState(replacement)); + manager.parameterState.set(parameter, controlState(replacement)); } function renderParameters(manager, parameters) { @@ -99,7 +112,7 @@ label.htmlFor = id; label.textContent = parameter; - const control = createControl(parameter, id, state); + const control = createControl(parameter, id, state, manager.namePrefix); row.append(label, control); if (manager.allowExpand) { @@ -124,7 +137,7 @@ if (!control.matches || !control.matches("[data-parameter-control]")) { return; } - manager.parameterState.set(control.name, controlState(control)); + manager.parameterState.set(parameterName(control), controlState(control)); }); if (!manager.allowExpand) { @@ -230,6 +243,7 @@ ? section.dataset.allowExpand === "1" : false : options.allowExpand, + namePrefix: section ? section.dataset.parameterNamePrefix || "" : "", parameterState: new Map(), }; if (section) { diff --git a/datasette/templates/_sql_parameters.html b/datasette/templates/_sql_parameters.html index 58801d4016..62cea3db96 100644 --- a/datasette/templates/_sql_parameters.html +++ b/datasette/templates/_sql_parameters.html @@ -1,9 +1,10 @@ -
{% if sql_parameters_allow_expand|default(false) %} {% endif %}
+{% if sql_parameters_allow_expand|default(false) %} {% endif %}
{% endfor %} {% endif %}