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 CreateRemoteNamespaceNode, CreateRingBufferNode, CreateSeriesNode, CreateSubscriptionNode,
14 CreateSumTypeNode, CreateTableNode, CreateTagNode, CreateTestNode, CreateTransactionalViewNode,
15 DeleteRingBufferNode, DeleteSeriesNode, DeleteTableNode, DispatchNode, FunctionParameter,
16 InsertDictionaryNode, InsertRingBufferNode, InsertSeriesNode, InsertTableNode, MigrateNode,
17 RollbackMigrationNode, UpdateRingBufferNode, UpdateSeriesNode, 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 CreateRemoteNamespace(CreateRemoteNamespaceNode),
157 CreateTable(CreateTableNode),
158 CreateRingBuffer(CreateRingBufferNode),
159 CreateDeferredView(CreateDeferredViewNode),
160 CreateTransactionalView(CreateTransactionalViewNode),
161 CreateDictionary(CreateDictionaryNode),
162 CreateSumType(CreateSumTypeNode),
163 CreateSubscription(CreateSubscriptionNode),
164 CreatePrimaryKey(CreatePrimaryKeyNode),
165 CreateColumnProperty(CreateColumnPropertyNode),
166 CreateProcedure(CreateProcedureNode),
167 CreateSeries(CreateSeriesNode),
168 CreateEvent(CreateEventNode),
169 CreateTag(CreateTagNode),
170 CreateTest(CreateTestNode),
171 AssertBlock(nodes::AssertBlockNode),
172
173 CreateMigration(CreateMigrationNode),
174 Migrate(MigrateNode),
175 RollbackMigration(RollbackMigrationNode),
176 Dispatch(DispatchNode),
177 AlterSequence(AlterSequenceNode),
178 AlterTable(nodes::AlterTableNode),
179 AlterRemoteNamespace(nodes::AlterRemoteNamespaceNode),
180
181 DropNamespace(nodes::DropNamespaceNode),
183 DropTable(nodes::DropTableNode),
184 DropView(nodes::DropViewNode),
185 DropRingBuffer(nodes::DropRingBufferNode),
186 DropDictionary(nodes::DropDictionaryNode),
187 DropSumType(nodes::DropSumTypeNode),
188 DropSubscription(nodes::DropSubscriptionNode),
189 DropSeries(nodes::DropSeriesNode),
190
191 CreateUser(nodes::CreateUserNode),
193 CreateRole(nodes::CreateRoleNode),
194 CreateAuthentication(nodes::CreateAuthenticationNode),
195 Grant(nodes::GrantNode),
196 Revoke(nodes::RevokeNode),
197 DropUser(nodes::DropUserNode),
198 DropRole(nodes::DropRoleNode),
199 DropAuthentication(nodes::DropAuthenticationNode),
200 CreatePolicy(nodes::CreatePolicyNode),
201 AlterPolicy(nodes::AlterPolicyNode),
202 DropPolicy(nodes::DropPolicyNode),
203
204 Delete(DeleteTableNode),
206 DeleteRingBuffer(DeleteRingBufferNode),
207 DeleteSeries(DeleteSeriesNode),
208 InsertTable(InsertTableNode),
209 InsertRingBuffer(InsertRingBufferNode),
210 InsertDictionary(InsertDictionaryNode),
211 InsertSeries(InsertSeriesNode),
212 Update(UpdateTableNode),
213 UpdateRingBuffer(UpdateRingBufferNode),
214 UpdateSeries(UpdateSeriesNode),
215
216 Append {
218 target: Fragment,
219 },
220
221 Emit,
223
224 Nop,
226 Halt,
227}