(
&mut self,
sql: &str,
params: &[Value],
options: Option<&QueryOptions>,
)
| 301 | } |
| 302 | |
| 303 | fn query_internal( |
| 304 | &mut self, |
| 305 | sql: &str, |
| 306 | params: &[Value], |
| 307 | options: Option<&QueryOptions>, |
| 308 | ) -> Result<Results> { |
| 309 | let default_options = QueryOptions::default(); |
| 310 | let query_opts = options.unwrap_or(&default_options); |
| 311 | |
| 312 | self.handle_blob_input(query_opts.blob.as_ref())?; |
| 313 | |
| 314 | let params_snapshot: Vec<Value> = params.to_vec(); |
| 315 | let options_snapshot = options.cloned(); |
| 316 | let mut collected_messages: Vec<BackendMessage> = Vec::new(); |
| 317 | |
| 318 | let mut exec_opts = ExecProtocolOptions::no_sync(); |
| 319 | exec_opts.on_notice = query_opts.on_notice.clone(); |
| 320 | exec_opts.data_transfer_container = query_opts.data_transfer_container; |
| 321 | |
| 322 | let result: Result<()> = (|| { |
| 323 | let param_types = if query_opts.param_types.is_empty() { |
| 324 | &[] as &[i32] |
| 325 | } else { |
| 326 | &query_opts.param_types |
| 327 | }; |
| 328 | |
| 329 | let mut messages = { |
| 330 | let _phase = timing::phase("client.query.parse_describe"); |
| 331 | self.parse_and_describe(sql, param_types, exec_opts.clone())? |
| 332 | }; |
| 333 | let mut data_type_ids = parse_describe_statement_results(&messages); |
| 334 | if self.ensure_array_types_for_bind_values(params, &data_type_ids, query_opts)? { |
| 335 | messages = { |
| 336 | let _phase = timing::phase("client.query.parse_describe_after_array_register"); |
| 337 | self.parse_and_describe(sql, param_types, exec_opts.clone())? |
| 338 | }; |
| 339 | data_type_ids = parse_describe_statement_results(&messages); |
| 340 | } |
| 341 | collected_messages.extend(messages); |
| 342 | let bind_values = { |
| 343 | let _phase = timing::phase("client.query.prepare_bind_values"); |
| 344 | self.prepare_bind_values(params, &data_type_ids, query_opts)? |
| 345 | }; |
| 346 | let bind_config = BindConfig { |
| 347 | values: bind_values, |
| 348 | ..Default::default() |
| 349 | }; |
| 350 | let execute_batch = { |
| 351 | let _phase = timing::phase("client.query.serialize_execute"); |
| 352 | let mut execute_batch = Vec::new(); |
| 353 | execute_batch.extend(Serialize::bind(&bind_config)); |
| 354 | execute_batch.extend(Serialize::describe(&PortalTarget::new('P', None))); |
| 355 | execute_batch.extend(Serialize::execute(None)); |
| 356 | execute_batch.extend(Serialize::sync()); |
| 357 | execute_batch |
| 358 | }; |
| 359 | let ExecProtocolResult { messages, .. } = { |
| 360 | let _phase = timing::phase("client.query.execute_roundtrip"); |
no test coverage detected