MCPcopy Create free account
hub / github.com/MaterializeInc/materialize / execute_stmt

Function execute_stmt

src/environmentd/src/http/sql.rs:1375–1655  ·  view source on GitHub ↗

Executes a single statement in a [`SqlRequest`].

(
    client: &mut SessionClient,
    sender: &mut S,
    stmt: Statement<Raw>,
    sql: String,
    raw_params: Vec<Option<String>>,
)

Source from the content-addressed store, hash-verified

1373
1374/// Executes a single statement in a [`SqlRequest`].
1375async 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 }

Callers 1

execute_stmt_groupFunction · 0.85

Calls 15

cloneFunction · 0.85
loggingMethod · 0.80
stmtMethod · 0.80
set_portalMethod · 0.80
expectMethod · 0.80
get_portal_unverifiedMethod · 0.80
drain_noticesMethod · 0.80
tagMethod · 0.80
notify_setMethod · 0.80
max_result_sizeMethod · 0.80

Tested by

no test coverage detected