Executes a single statement in a [`SqlRequest`].
(
client: &mut SessionClient,
sender: &mut S,
stmt: Statement<Raw>,
sql: String,
raw_params: Vec<Option<String>>,
)
| 1373 | |
| 1374 | /// Executes a single statement in a [`SqlRequest`]. |
| 1375 | async fn execute_stmt<S: ResultSender>( |
| 1376 | client: &mut SessionClient, |
| 1377 | sender: &mut S, |
| 1378 | stmt: Statement<Raw>, |
| 1379 | sql: String, |
| 1380 | raw_params: Vec<Option<String>>, |
| 1381 | ) -> Result<StatementResult, Error> { |
| 1382 | const EMPTY_PORTAL: &str = ""; |
| 1383 | if let Err(e) = client |
| 1384 | .prepare(EMPTY_PORTAL.into(), Some(stmt.clone()), sql, vec![]) |
| 1385 | .await |
| 1386 | { |
| 1387 | return Ok(SqlResult::err(client, e).into()); |
| 1388 | } |
| 1389 | |
| 1390 | let prep_stmt = match client.get_prepared_statement(EMPTY_PORTAL).await { |
| 1391 | Ok(stmt) => stmt, |
| 1392 | Err(err) => { |
| 1393 | return Ok(SqlResult::err(client, err).into()); |
| 1394 | } |
| 1395 | }; |
| 1396 | |
| 1397 | let param_types = &prep_stmt.desc().param_types; |
| 1398 | if param_types.len() != raw_params.len() { |
| 1399 | let message = anyhow!( |
| 1400 | "request supplied {actual} parameters, \ |
| 1401 | but {statement} requires {expected}", |
| 1402 | statement = stmt.to_ast_string_simple(), |
| 1403 | actual = raw_params.len(), |
| 1404 | expected = param_types.len() |
| 1405 | ); |
| 1406 | return Ok(SqlResult::err(client, Error::Unstructured(message)).into()); |
| 1407 | } |
| 1408 | |
| 1409 | let buf = RowArena::new(); |
| 1410 | let mut params = vec![]; |
| 1411 | for (raw_param, mz_typ) in raw_params.into_iter().zip_eq(param_types) { |
| 1412 | let pg_typ = mz_pgrepr::Type::from(mz_typ); |
| 1413 | let datum = match raw_param { |
| 1414 | None => Datum::Null, |
| 1415 | Some(raw_param) => { |
| 1416 | match mz_pgrepr::Value::decode( |
| 1417 | mz_pgwire_common::Format::Text, |
| 1418 | &pg_typ, |
| 1419 | raw_param.as_bytes(), |
| 1420 | ) { |
| 1421 | Ok(param) => match param.into_datum_decode_error(&buf, &pg_typ, "parameter") { |
| 1422 | Ok(datum) => datum, |
| 1423 | Err(msg) => { |
| 1424 | return Ok( |
| 1425 | SqlResult::err(client, Error::Unstructured(anyhow!(msg))).into() |
| 1426 | ); |
| 1427 | } |
| 1428 | }, |
| 1429 | Err(err) => { |
| 1430 | let msg = anyhow!("unable to decode parameter: {}", err); |
| 1431 | return Ok(SqlResult::err(client, Error::Unstructured(msg)).into()); |
| 1432 | } |
no test coverage detected