(
scx: &'a StatementContext,
params: Vec<Expr<Aug>>,
desc: &StatementDesc,
)
| 1269 | } |
| 1270 | |
| 1271 | pub fn plan_params<'a>( |
| 1272 | scx: &'a StatementContext, |
| 1273 | params: Vec<Expr<Aug>>, |
| 1274 | desc: &StatementDesc, |
| 1275 | ) -> Result<Params, PlanError> { |
| 1276 | if params.len() != desc.param_types.len() { |
| 1277 | sql_bail!( |
| 1278 | "expected {} params, got {}", |
| 1279 | desc.param_types.len(), |
| 1280 | params.len() |
| 1281 | ); |
| 1282 | } |
| 1283 | |
| 1284 | let qcx = QueryContext::root(scx, QueryLifetime::OneShot); |
| 1285 | |
| 1286 | let mut datums = Row::default(); |
| 1287 | let mut packer = datums.packer(); |
| 1288 | let mut actual_types = Vec::new(); |
| 1289 | let temp_storage = &RowArena::new(); |
| 1290 | for (i, (mut expr, expected_ty)) in params.into_iter().zip_eq(&desc.param_types).enumerate() { |
| 1291 | transform_ast::transform(scx, &mut expr)?; |
| 1292 | |
| 1293 | let ecx = execute_expr_context(&qcx); |
| 1294 | let ex = plan_expr(&ecx, &expr)?.type_as_any(&ecx)?; |
| 1295 | let actual_ty = ecx.scalar_type(&ex); |
| 1296 | if plan_hypothetical_cast(&ecx, *EXECUTE_CAST_CONTEXT, &actual_ty, expected_ty).is_none() { |
| 1297 | return Err(PlanError::WrongParameterType( |
| 1298 | i + 1, |
| 1299 | ecx.humanize_sql_scalar_type(expected_ty, false), |
| 1300 | ecx.humanize_sql_scalar_type(&actual_ty, false), |
| 1301 | )); |
| 1302 | } |
| 1303 | let ex = ex.lower_uncorrelated(scx.catalog.system_vars())?; |
| 1304 | let evaled = ex.eval(&[], temp_storage)?; |
| 1305 | packer.push(evaled); |
| 1306 | actual_types.push(actual_ty); |
| 1307 | } |
| 1308 | Ok(Params { |
| 1309 | datums, |
| 1310 | execute_types: actual_types, |
| 1311 | expected_types: desc.param_types.clone(), |
| 1312 | }) |
| 1313 | } |
| 1314 | |
| 1315 | static EXECUTE_CONTEXT_SCOPE: LazyLock<Scope> = LazyLock::new(Scope::empty); |
| 1316 | static EXECUTE_CONTEXT_REL_TYPE: LazyLock<SqlRelationType> = LazyLock::new(SqlRelationType::empty); |
no test coverage detected