use crate::*;
pub enum Instruction {
PushConst(Value),
PushValue(CExpPtr<Value>),
PushLocal(usize),
PopToLocal(usize),
Jump(usize),
JumpIfFalse(usize, CExpPtr<bool>),
Call(FunctionPtr),
Return,
Throw,
Execute,
ForInit(usize, Box<CTableExpression>),
ForNext(usize, Box<ForNextInfo>),
ForSortInit(usize, Box<CSelectExpression>),
ForSortNext(usize, Box<(usize, usize, Assigns)>),
DataOp(Box<DO>),
Select(Box<CSelectExpression>),
Set(Box<CSelectExpression>),
PushInt(CExpPtr<i64>),
PushFloat(CExpPtr<f64>),
PushBool(CExpPtr<bool>),
}
pub trait CExp<T> {
fn eval(&self, ee: &mut EvalEnv, data: &[u8]) -> T;
}
pub type CExpPtr<T> = Box<dyn CExp<T>>;
#[derive(Clone, Copy)]
pub enum CompileFunc {
Value(fn(&Block, &mut [Expr]) -> CExpPtr<Value>),
Int(fn(&Block, &mut [Expr]) -> CExpPtr<i64>),
Float(fn(&Block, &mut [Expr]) -> CExpPtr<f64>),
}
pub type DataSource = Box<dyn Iterator<Item = (PagePtr, usize)>>;
pub struct ForState {
pub data_source: DataSource,
}
pub struct ForSortState {
pub ix: usize,
pub rows: Vec<Vec<Value>>,
}
pub struct ForNextInfo {
pub for_id: usize,
pub assigns: Assigns,
pub exps: Vec<CExpPtr<Value>>,
pub wher: Option<CExpPtr<bool>>,
}
pub enum CTableExpression {
Base(TablePtr),
IdGet(TablePtr, CExpPtr<i64>),
IxGet(TablePtr, Vec<CExpPtr<Value>>, usize),
Values(Vec<Vec<CExpPtr<Value>>>),
}
impl CTableExpression {
pub fn table(&self) -> TablePtr {
match self {
CTableExpression::Base(t) => t.clone(),
CTableExpression::IdGet(t, _) => t.clone(),
CTableExpression::IxGet(t, _, _) => t.clone(),
_ => panic!(),
}
}
}
pub struct CSelectExpression {
pub colnames: Vec<String>,
pub assigns: Assigns,
pub exps: Vec<CExpPtr<Value>>,
pub from: Option<CTableExpression>,
pub wher: Option<CExpPtr<bool>>,
pub orderby: Vec<CExpPtr<Value>>,
pub desc: Vec<bool>,
}
pub enum DO {
CreateTable(ColInfo),
CreateIndex(IndexInfo),
CreateSchema(String),
CreateFunction(ObjRef, Rc<String>, bool),
CreateView(ObjRef, bool, String),
AlterTable(ObjRef, Vec<AlterAction>),
RenameSchema(String, String),
RenameTsble(ObjRef, ObjRef),
RenameView(ObjRef, ObjRef),
RenameFunction(ObjRef, ObjRef),
DropSchema(String),
DropTable(ObjRef),
DropView(ObjRef),
DropIndex(ObjRef, String),
DropFunction(ObjRef),
Insert(TablePtr, Vec<usize>, CTableExpression),
Update(
Vec<(usize, CExpPtr<Value>)>,
CTableExpression,
Option<CExpPtr<bool>>,
),
Delete(CTableExpression, Option<CExpPtr<bool>>),
}
pub enum AlterAction {
Add(String, DataType),
Drop(String),
Rename(String, String),
Modify(String, DataType),
}
pub struct Function {
pub param_count: usize,
pub return_type: DataType,
pub local_typ: Vec<DataType>,
pub source: Rc<String>,
pub ilist: RefCell<Vec<Instruction>>, pub compiled: Cell<bool>,
}
pub type FunctionPtr = Rc<Function>;