Skip to content

Commit 669ba80

Browse files
committed
fix: refine parameter style handling and execution style checks
1 parent fd954dd commit 669ba80

File tree

4 files changed

+20
-11
lines changed

4 files changed

+20
-11
lines changed

sqlspec/adapters/duckdb/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def build_profile() -> "DriverParameterProfile":
145145
default_style=ParameterStyle.QMARK,
146146
supported_styles={ParameterStyle.QMARK, ParameterStyle.NUMERIC, ParameterStyle.NAMED_DOLLAR},
147147
default_execution_style=ParameterStyle.QMARK,
148-
supported_execution_styles={ParameterStyle.QMARK, ParameterStyle.NUMERIC, ParameterStyle.NAMED_DOLLAR},
148+
supported_execution_styles={ParameterStyle.QMARK, ParameterStyle.NUMERIC},
149149
has_native_list_expansion=True,
150150
preserve_parameter_format=True,
151151
needs_static_script_compilation=False,

sqlspec/core/parameters/_alignment.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,17 @@ def collect_null_parameter_ordinals(parameters: Any, profile: "ParameterProfile"
106106

107107
def _collect_expected_identifiers(parameter_profile: "ParameterProfile") -> "set[tuple[str, int | str]]":
108108
identifiers: set[tuple[str, int | str]] = set()
109-
for parameter in parameter_profile.parameters:
109+
parameters = parameter_profile.parameters
110+
if not parameters:
111+
return identifiers
112+
113+
# Check if we have mixed styles - if so, use ordinal-based counting for positional styles
114+
styles = {p.style for p in parameters}
115+
has_mixed_positional_styles = len(styles) > 1 and any(
116+
s in styles for s in {ParameterStyle.QMARK, ParameterStyle.POSITIONAL_PYFORMAT}
117+
)
118+
119+
for parameter in parameters:
110120
style = parameter.style
111121
name = parameter.name
112122
if style in {
@@ -117,7 +127,10 @@ def _collect_expected_identifiers(parameter_profile: "ParameterProfile") -> "set
117127
}:
118128
identifiers.add(("named", name or f"param_{parameter.ordinal}"))
119129
elif style in {ParameterStyle.NUMERIC, ParameterStyle.POSITIONAL_COLON}:
120-
if name and name.isdigit():
130+
# When mixed with ordinal styles (like QMARK), use ordinal instead of explicit index
131+
if has_mixed_positional_styles:
132+
identifiers.add(("index", parameter.ordinal))
133+
elif name and name.isdigit():
121134
identifiers.add(("index", int(name) - 1))
122135
else:
123136
identifiers.add(("index", parameter.ordinal))

sqlspec/core/parameters/_converter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ def _preserve_original_format(
274274
return tuple(param_values)
275275
return tuple(param_values)
276276

277-
def _convert_parameter_format(
277+
def _convert_parameter_format( # noqa: C901
278278
self,
279279
parameters: "ParameterPayload",
280280
param_info: "list[ParameterInfo]",
@@ -327,6 +327,9 @@ def _convert_parameter_format(
327327
ParameterStyle.NAMED_DOLLAR,
328328
ParameterStyle.NAMED_PYFORMAT,
329329
}
330+
# POSITIONAL_COLON is a special case that always requires dict output
331+
if target_style == ParameterStyle.POSITIONAL_COLON:
332+
return self._convert_to_positional_colon_format(parameters, param_info)
330333

331334
if is_named_style:
332335
if isinstance(parameters, Mapping):

sqlspec/core/parameters/_processor.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -461,13 +461,6 @@ def _needs_execution_placeholder_conversion(
461461
):
462462
return False
463463

464-
if (
465-
config.supported_execution_parameter_styles is not None
466-
and len(config.supported_execution_parameter_styles) > 1
467-
and all(style in config.supported_execution_parameter_styles for style in current_styles)
468-
):
469-
return False
470-
471464
if len(current_styles) > 1:
472465
return True
473466

0 commit comments

Comments
 (0)