Skip to main content

uqa_sql/prepared/
entry.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Prepared plan identity, cached variants and catalog-visible metadata.
8
9use std::sync::Arc;
10
11#[derive(Clone)]
12pub struct PreparedStatementPlan {
13    pub logical_plan: Arc<crate::plan::UnifiedPlan>,
14    pub plan: Option<crate::plan::UnifiedPlan>,
15    pub parameter_types: Vec<Option<crate::ast::ColumnType>>,
16    pub result_schema: Option<crate::RowSchema>,
17    pub source_sql: Option<Arc<str>>,
18    pub prepared_at_micros: i64,
19    pub from_sql: bool,
20    pub generic_plans: i64,
21    pub custom_plans: i64,
22    pub generic_cost: Option<f64>,
23    pub total_custom_cost: f64,
24}
25
26use crate::catalog::session::PreparedStatementMetadata;
27
28impl PreparedStatementPlan {
29    pub fn metadata(&self, name: &str) -> PreparedStatementMetadata {
30        PreparedStatementMetadata {
31            name: name.to_string(),
32            parameter_types: self.parameter_types.clone(),
33            result_types: self
34                .result_schema
35                .as_ref()
36                .map(|schema| schema.column_types().to_vec()),
37            source_sql: self.source_sql.clone(),
38            prepared_at_micros: self.prepared_at_micros,
39            from_sql: self.from_sql,
40            generic_plans: self.generic_plans,
41            custom_plans: self.custom_plans,
42        }
43    }
44}
45
46impl PreparedStatementPlan {
47    pub fn record_execution(&mut self, update: super::planning::PreparedPlanUpdate) {
48        self.plan = update.generic_plan;
49        self.generic_cost = update.generic_cost;
50        if let Some(cost) = update.custom_cost {
51            self.total_custom_cost += cost;
52            self.custom_plans = self.custom_plans.saturating_add(1);
53        } else {
54            self.generic_plans = self.generic_plans.saturating_add(1);
55        }
56    }
57}