@@ -106,7 +106,17 @@ def collect_null_parameter_ordinals(parameters: Any, profile: "ParameterProfile"
106106
107107def _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 ))
0 commit comments