proof_of_sql/sql/proof_exprs/
proof_expr.rs1use crate::{
2 base::{
3 database::{Column, ColumnRef, ColumnType, LiteralValue, Table},
4 map::{IndexMap, IndexSet},
5 math::decimal::Precision,
6 proof::{PlaceholderResult, ProofError},
7 scalar::Scalar,
8 },
9 sql::proof::{FinalRoundBuilder, VerificationBuilder},
10};
11use bumpalo::Bump;
12use core::fmt::Debug;
13
14#[enum_dispatch::enum_dispatch(DynProofExpr)]
16pub trait ProofExpr: Debug + Send + Sync {
17 fn data_type(&self) -> ColumnType;
19
20 fn first_round_evaluate<'a, S: Scalar>(
24 &self,
25 alloc: &'a Bump,
26 table: &Table<'a, S>,
27 params: &[LiteralValue],
28 ) -> PlaceholderResult<Column<'a, S>>;
29
30 fn final_round_evaluate<'a, S: Scalar>(
33 &self,
34 builder: &mut FinalRoundBuilder<'a, S>,
35 alloc: &'a Bump,
36 table: &Table<'a, S>,
37 params: &[LiteralValue],
38 ) -> PlaceholderResult<Column<'a, S>>;
39
40 fn verifier_evaluate<S: Scalar>(
44 &self,
45 builder: &mut impl VerificationBuilder<S>,
46 accessor: &IndexMap<ColumnRef, S>,
47 chi_eval: S,
48 params: &[LiteralValue],
49 ) -> Result<S, ProofError>;
50
51 fn get_column_references(&self, columns: &mut IndexSet<ColumnRef>);
55}
56
57pub(crate) trait DecimalProofExpr: ProofExpr {
59 fn precision(&self) -> Precision {
64 Precision::new(
65 self.data_type()
66 .precision_value()
67 .expect("Precision should be valid"),
68 )
69 .expect("Precision should be valid")
70 }
71
72 fn scale(&self) -> i8 {
77 self.data_type().scale().expect("Scale should be valid")
78 }
79}