1use reifydb_value::{
5 fragment::Fragment,
6 value::{Value, constraint::TypeConstraint, value_type::ValueType},
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;
23
24#[derive(Debug, Clone)]
25pub struct CompiledFunction {
26 pub name: Fragment,
27
28 pub parameters: Vec<FunctionParameter>,
29
30 pub return_type: Option<TypeConstraint>,
31
32 pub body: Vec<Instruction>,
33}
34
35#[derive(Debug, Clone)]
36pub struct CompiledClosure {
37 pub parameters: Vec<FunctionParameter>,
38
39 pub body: Vec<Instruction>,
40
41 pub captures: Vec<Fragment>,
42}
43
44#[derive(Debug, Clone, PartialEq)]
45pub enum ScopeType {
46 Global,
47
48 Function,
49
50 Block,
51
52 Conditional,
53
54 Loop,
55}
56
57#[derive(Debug, Clone)]
58pub enum Instruction {
59 PushConst(Value),
60 PushNone,
61 Pop,
62 Dup,
63
64 LoadVar(Fragment),
65 StoreVar(Fragment),
66 DeclareVar(Fragment),
67
68 FieldAccess {
69 object: Fragment,
70 field: Fragment,
71 },
72
73 Add,
74 Sub,
75 Mul,
76 Div,
77 Rem,
78
79 Negate,
80 LogicNot,
81
82 CmpEq,
83 CmpNe,
84 CmpLt,
85 CmpLe,
86 CmpGt,
87 CmpGe,
88
89 LogicAnd,
90 LogicOr,
91 LogicXor,
92
93 Between,
94 InList {
95 count: u16,
96 negated: bool,
97 },
98 Cast(ValueType),
99
100 Jump(Addr),
101 JumpIfFalsePop(Addr),
102 JumpIfTruePop(Addr),
103 EnterScope(ScopeType),
104 ExitScope,
105 Break {
106 exit_scopes: usize,
107 addr: Addr,
108 },
109 Continue {
110 exit_scopes: usize,
111 addr: Addr,
112 },
113
114 ForInit {
115 variable_name: Fragment,
116 },
117 ForNext {
118 variable_name: Fragment,
119 addr: Addr,
120 },
121
122 DefineFunction(CompiledFunction),
123 Call {
124 name: Fragment,
125 arity: u8,
126 is_procedure_call: bool,
127 },
128 ReturnValue,
129 ReturnVoid,
130
131 DefineClosure(CompiledClosure),
132
133 Query(QueryPlan),
134
135 CreateNamespace(CreateNamespaceNode),
136 CreateRemoteNamespace(CreateRemoteNamespaceNode),
137 CreateTable(CreateTableNode),
138 CreateRingBuffer(CreateRingBufferNode),
139 CreateDeferredView(CreateDeferredViewNode),
140 CreateTransactionalView(CreateTransactionalViewNode),
141 CreateDictionary(CreateDictionaryNode),
142 CreateSumType(CreateSumTypeNode),
143 CreateSubscription(CreateSubscriptionNode),
144 CreatePrimaryKey(CreatePrimaryKeyNode),
145 CreateColumnProperty(CreateColumnPropertyNode),
146 CreateProcedure(CreateProcedureNode),
147 CreateSeries(CreateSeriesNode),
148 CreateEvent(CreateEventNode),
149 CreateTag(CreateTagNode),
150 CreateSource(nodes::CreateSourceNode),
151 CreateSink(nodes::CreateSinkNode),
152 CreateBinding(nodes::CreateBindingNode),
153 CreateTest(CreateTestNode),
154 AssertBlock(nodes::AssertBlockNode),
155
156 CreateMigration(CreateMigrationNode),
157 Migrate(MigrateNode),
158 RollbackMigration(RollbackMigrationNode),
159 Dispatch(DispatchNode),
160 AlterSequence(AlterSequenceNode),
161 AlterTable(nodes::AlterTableNode),
162 AlterRemoteNamespace(nodes::AlterRemoteNamespaceNode),
163
164 DropNamespace(nodes::DropNamespaceNode),
165 DropTable(nodes::DropTableNode),
166 DropView(nodes::DropViewNode),
167 DropRingBuffer(nodes::DropRingBufferNode),
168 DropDictionary(nodes::DropDictionaryNode),
169 DropSumType(nodes::DropSumTypeNode),
170 DropSubscription(nodes::DropSubscriptionNode),
171 DropSeries(nodes::DropSeriesNode),
172 DropSource(nodes::DropSourceNode),
173 DropSink(nodes::DropSinkNode),
174 DropProcedure(nodes::DropProcedureNode),
175 DropHandler(nodes::DropHandlerNode),
176 DropTest(nodes::DropTestNode),
177 DropBinding(nodes::DropBindingNode),
178
179 CreateIdentity(nodes::CreateIdentityNode),
180 CreateRole(nodes::CreateRoleNode),
181 CreateAuthentication(nodes::CreateAuthenticationNode),
182 Grant(nodes::GrantNode),
183 Revoke(nodes::RevokeNode),
184 DropIdentity(nodes::DropIdentityNode),
185 DropRole(nodes::DropRoleNode),
186 DropAuthentication(nodes::DropAuthenticationNode),
187 CreatePolicy(nodes::CreatePolicyNode),
188 AlterPolicy(nodes::AlterPolicyNode),
189 DropPolicy(nodes::DropPolicyNode),
190
191 Delete(DeleteTableNode),
192 DeleteRingBuffer(DeleteRingBufferNode),
193 DeleteSeries(DeleteSeriesNode),
194 InsertTable(InsertTableNode),
195 InsertRingBuffer(InsertRingBufferNode),
196 InsertDictionary(InsertDictionaryNode),
197 InsertSeries(InsertSeriesNode),
198 Update(UpdateTableNode),
199 UpdateRingBuffer(UpdateRingBufferNode),
200 UpdateSeries(UpdateSeriesNode),
201
202 Append {
203 target: Fragment,
204 },
205
206 Emit,
207
208 Nop,
209 Halt,
210}