1use reifydb_type::{
5 fragment::Fragment,
6 value::{Value, constraint::TypeConstraint, r#type::Type},
7};
8
9use crate::{
10 nodes::{
11 self, AlterSequenceNode, CreateColumnPropertyNode, CreateDeferredViewNode, CreateDictionaryNode,
12 CreateEventNode, CreateMigrationNode, CreateNamespaceNode, CreatePrimaryKeyNode, CreateProcedureNode,
13 CreateRingBufferNode, CreateSeriesNode, CreateSubscriptionNode, CreateSumTypeNode, CreateTableNode,
14 CreateTagNode, CreateTransactionalViewNode, DeleteRingBufferNode, DeleteSeriesNode, DeleteTableNode,
15 DispatchNode, FunctionParameter, InsertDictionaryNode, InsertRingBufferNode, InsertSeriesNode,
16 InsertTableNode, MigrateNode, RollbackMigrationNode, UpdateRingBufferNode, UpdateSeriesNode,
17 UpdateTableNode,
18 },
19 query::QueryPlan,
20};
21
22pub type Addr = usize;
24
25#[derive(Debug, Clone)]
27pub struct CompiledFunctionDef {
28 pub name: Fragment,
30 pub parameters: Vec<FunctionParameter>,
32 pub return_type: Option<TypeConstraint>,
34 pub body: Vec<Instruction>,
36}
37
38#[derive(Debug, Clone)]
40pub struct CompiledClosureDef {
41 pub parameters: Vec<FunctionParameter>,
43 pub body: Vec<Instruction>,
45 pub captures: Vec<Fragment>,
47}
48
49#[derive(Debug, Clone, PartialEq)]
51pub enum ScopeType {
52 Global,
54 Function,
56 Block,
58 Conditional,
60 Loop,
62}
63
64#[derive(Debug, Clone)]
65pub enum Instruction {
66 PushConst(Value),
68 PushNone,
69 Pop,
70 Dup,
71
72 LoadVar(Fragment),
74 StoreVar(Fragment),
75 DeclareVar(Fragment),
76 FieldAccess {
78 object: Fragment,
79 field: Fragment,
80 },
81
82 Add,
84 Sub,
85 Mul,
86 Div,
87 Rem,
88
89 Negate,
91 LogicNot,
92
93 CmpEq,
95 CmpNe,
96 CmpLt,
97 CmpLe,
98 CmpGt,
99 CmpGe,
100
101 LogicAnd,
103 LogicOr,
104 LogicXor,
105
106 Between,
108 InList {
109 count: u16,
110 negated: bool,
111 },
112 Cast(Type),
113
114 Jump(Addr),
116 JumpIfFalsePop(Addr),
117 JumpIfTruePop(Addr),
118 EnterScope(ScopeType),
119 ExitScope,
120 Break {
121 exit_scopes: usize,
122 addr: Addr,
123 },
124 Continue {
125 exit_scopes: usize,
126 addr: Addr,
127 },
128
129 ForInit {
131 variable_name: Fragment,
132 },
133 ForNext {
134 variable_name: Fragment,
135 addr: Addr,
136 },
137
138 DefineFunction(CompiledFunctionDef),
140 Call {
141 name: Fragment,
142 arity: u8,
143 is_procedure_call: bool,
144 },
145 ReturnValue,
146 ReturnVoid,
147
148 DefineClosure(CompiledClosureDef),
150
151 Query(QueryPlan),
153
154 CreateNamespace(CreateNamespaceNode),
156 CreateTable(CreateTableNode),
157 CreateRingBuffer(CreateRingBufferNode),
158 CreateDeferredView(CreateDeferredViewNode),
159 CreateTransactionalView(CreateTransactionalViewNode),
160 CreateDictionary(CreateDictionaryNode),
161 CreateSumType(CreateSumTypeNode),
162 CreateSubscription(CreateSubscriptionNode),
163 CreatePrimaryKey(CreatePrimaryKeyNode),
164 CreateColumnProperty(CreateColumnPropertyNode),
165 CreateProcedure(CreateProcedureNode),
166 CreateSeries(CreateSeriesNode),
167 CreateEvent(CreateEventNode),
168 CreateTag(CreateTagNode),
169
170 CreateMigration(CreateMigrationNode),
171 Migrate(MigrateNode),
172 RollbackMigration(RollbackMigrationNode),
173 Dispatch(DispatchNode),
174 AlterSequence(AlterSequenceNode),
175 AlterTable(nodes::AlterTableNode),
176
177 DropNamespace(nodes::DropNamespaceNode),
179 DropTable(nodes::DropTableNode),
180 DropView(nodes::DropViewNode),
181 DropRingBuffer(nodes::DropRingBufferNode),
182 DropDictionary(nodes::DropDictionaryNode),
183 DropSumType(nodes::DropSumTypeNode),
184 DropSubscription(nodes::DropSubscriptionNode),
185 DropSeries(nodes::DropSeriesNode),
186
187 CreateUser(nodes::CreateUserNode),
189 CreateRole(nodes::CreateRoleNode),
190 CreateAuthentication(nodes::CreateAuthenticationNode),
191 Grant(nodes::GrantNode),
192 Revoke(nodes::RevokeNode),
193 DropUser(nodes::DropUserNode),
194 DropRole(nodes::DropRoleNode),
195 DropAuthentication(nodes::DropAuthenticationNode),
196 CreatePolicy(nodes::CreatePolicyNode),
197 AlterPolicy(nodes::AlterPolicyNode),
198 DropPolicy(nodes::DropPolicyNode),
199
200 Delete(DeleteTableNode),
202 DeleteRingBuffer(DeleteRingBufferNode),
203 DeleteSeries(DeleteSeriesNode),
204 InsertTable(InsertTableNode),
205 InsertRingBuffer(InsertRingBufferNode),
206 InsertDictionary(InsertDictionaryNode),
207 InsertSeries(InsertSeriesNode),
208 Update(UpdateTableNode),
209 UpdateRingBuffer(UpdateRingBufferNode),
210 UpdateSeries(UpdateSeriesNode),
211
212 Append {
214 target: Fragment,
215 },
216
217 Emit,
219
220 Nop,
222 Halt,
223}