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 CompiledFunction {
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 CompiledClosure {
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),
67 PushNone,
68 Pop,
69 Dup,
70
71 LoadVar(Fragment),
72 StoreVar(Fragment),
73 DeclareVar(Fragment),
74 FieldAccess {
76 object: Fragment,
77 field: Fragment,
78 },
79
80 Add,
81 Sub,
82 Mul,
83 Div,
84 Rem,
85
86 Negate,
87 LogicNot,
88
89 CmpEq,
90 CmpNe,
91 CmpLt,
92 CmpLe,
93 CmpGt,
94 CmpGe,
95
96 LogicAnd,
97 LogicOr,
98 LogicXor,
99
100 Between,
101 InList {
102 count: u16,
103 negated: bool,
104 },
105 Cast(Type),
106
107 Jump(Addr),
108 JumpIfFalsePop(Addr),
109 JumpIfTruePop(Addr),
110 EnterScope(ScopeType),
111 ExitScope,
112 Break {
113 exit_scopes: usize,
114 addr: Addr,
115 },
116 Continue {
117 exit_scopes: usize,
118 addr: Addr,
119 },
120
121 ForInit {
122 variable_name: Fragment,
123 },
124 ForNext {
125 variable_name: Fragment,
126 addr: Addr,
127 },
128
129 DefineFunction(CompiledFunction),
130 Call {
131 name: Fragment,
132 arity: u8,
133 is_procedure_call: bool,
134 },
135 ReturnValue,
136 ReturnVoid,
137
138 DefineClosure(CompiledClosure),
139
140 Query(QueryPlan),
141
142 CreateNamespace(CreateNamespaceNode),
143 CreateRemoteNamespace(CreateRemoteNamespaceNode),
144 CreateTable(CreateTableNode),
145 CreateRingBuffer(CreateRingBufferNode),
146 CreateDeferredView(CreateDeferredViewNode),
147 CreateTransactionalView(CreateTransactionalViewNode),
148 CreateDictionary(CreateDictionaryNode),
149 CreateSumType(CreateSumTypeNode),
150 CreateSubscription(CreateSubscriptionNode),
151 CreatePrimaryKey(CreatePrimaryKeyNode),
152 CreateColumnProperty(CreateColumnPropertyNode),
153 CreateProcedure(CreateProcedureNode),
154 CreateSeries(CreateSeriesNode),
155 CreateEvent(CreateEventNode),
156 CreateTag(CreateTagNode),
157 CreateSource(nodes::CreateSourceNode),
158 CreateSink(nodes::CreateSinkNode),
159 CreateBinding(nodes::CreateBindingNode),
160 CreateTest(CreateTestNode),
161 AssertBlock(nodes::AssertBlockNode),
162
163 CreateMigration(CreateMigrationNode),
164 Migrate(MigrateNode),
165 RollbackMigration(RollbackMigrationNode),
166 Dispatch(DispatchNode),
167 AlterSequence(AlterSequenceNode),
168 AlterTable(nodes::AlterTableNode),
169 AlterRemoteNamespace(nodes::AlterRemoteNamespaceNode),
170
171 DropNamespace(nodes::DropNamespaceNode),
172 DropTable(nodes::DropTableNode),
173 DropView(nodes::DropViewNode),
174 DropRingBuffer(nodes::DropRingBufferNode),
175 DropDictionary(nodes::DropDictionaryNode),
176 DropSumType(nodes::DropSumTypeNode),
177 DropSubscription(nodes::DropSubscriptionNode),
178 DropSeries(nodes::DropSeriesNode),
179 DropSource(nodes::DropSourceNode),
180 DropSink(nodes::DropSinkNode),
181 DropProcedure(nodes::DropProcedureNode),
182 DropHandler(nodes::DropHandlerNode),
183 DropTest(nodes::DropTestNode),
184 DropBinding(nodes::DropBindingNode),
185
186 CreateIdentity(nodes::CreateIdentityNode),
187 CreateRole(nodes::CreateRoleNode),
188 CreateAuthentication(nodes::CreateAuthenticationNode),
189 Grant(nodes::GrantNode),
190 Revoke(nodes::RevokeNode),
191 DropIdentity(nodes::DropIdentityNode),
192 DropRole(nodes::DropRoleNode),
193 DropAuthentication(nodes::DropAuthenticationNode),
194 CreatePolicy(nodes::CreatePolicyNode),
195 AlterPolicy(nodes::AlterPolicyNode),
196 DropPolicy(nodes::DropPolicyNode),
197
198 Delete(DeleteTableNode),
199 DeleteRingBuffer(DeleteRingBufferNode),
200 DeleteSeries(DeleteSeriesNode),
201 InsertTable(InsertTableNode),
202 InsertRingBuffer(InsertRingBufferNode),
203 InsertDictionary(InsertDictionaryNode),
204 InsertSeries(InsertSeriesNode),
205 Update(UpdateTableNode),
206 UpdateRingBuffer(UpdateRingBufferNode),
207 UpdateSeries(UpdateSeriesNode),
208
209 Append {
210 target: Fragment,
211 },
212
213 Emit,
214
215 Nop,
216 Halt,
217}