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 CreateTest(CreateTestNode),
160 AssertBlock(nodes::AssertBlockNode),
161
162 CreateMigration(CreateMigrationNode),
163 Migrate(MigrateNode),
164 RollbackMigration(RollbackMigrationNode),
165 Dispatch(DispatchNode),
166 AlterSequence(AlterSequenceNode),
167 AlterTable(nodes::AlterTableNode),
168 AlterRemoteNamespace(nodes::AlterRemoteNamespaceNode),
169
170 DropNamespace(nodes::DropNamespaceNode),
171 DropTable(nodes::DropTableNode),
172 DropView(nodes::DropViewNode),
173 DropRingBuffer(nodes::DropRingBufferNode),
174 DropDictionary(nodes::DropDictionaryNode),
175 DropSumType(nodes::DropSumTypeNode),
176 DropSubscription(nodes::DropSubscriptionNode),
177 DropSeries(nodes::DropSeriesNode),
178 DropSource(nodes::DropSourceNode),
179 DropSink(nodes::DropSinkNode),
180
181 CreateIdentity(nodes::CreateIdentityNode),
182 CreateRole(nodes::CreateRoleNode),
183 CreateAuthentication(nodes::CreateAuthenticationNode),
184 Grant(nodes::GrantNode),
185 Revoke(nodes::RevokeNode),
186 DropIdentity(nodes::DropIdentityNode),
187 DropRole(nodes::DropRoleNode),
188 DropAuthentication(nodes::DropAuthenticationNode),
189 CreatePolicy(nodes::CreatePolicyNode),
190 AlterPolicy(nodes::AlterPolicyNode),
191 DropPolicy(nodes::DropPolicyNode),
192
193 Delete(DeleteTableNode),
194 DeleteRingBuffer(DeleteRingBufferNode),
195 DeleteSeries(DeleteSeriesNode),
196 InsertTable(InsertTableNode),
197 InsertRingBuffer(InsertRingBufferNode),
198 InsertDictionary(InsertDictionaryNode),
199 InsertSeries(InsertSeriesNode),
200 Update(UpdateTableNode),
201 UpdateRingBuffer(UpdateRingBufferNode),
202 UpdateSeries(UpdateSeriesNode),
203
204 Append {
205 target: Fragment,
206 },
207
208 Emit,
209
210 Nop,
211 Halt,
212}