Skip to main content

reifydb_rql/
instruction.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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
22/// Address in the instruction stream (for jumps)
23pub type Addr = usize;
24
25/// A compiled user-defined function with pre-compiled body instructions
26#[derive(Debug, Clone)]
27pub struct CompiledFunction {
28	/// Function name
29	pub name: Fragment,
30	/// Function parameters
31	pub parameters: Vec<FunctionParameter>,
32	/// Optional return type constraint
33	pub return_type: Option<TypeConstraint>,
34	/// Pre-compiled function body instructions
35	pub body: Vec<Instruction>,
36}
37
38/// A compiled closure with captured environment
39#[derive(Debug, Clone)]
40pub struct CompiledClosure {
41	/// Closure parameters
42	pub parameters: Vec<FunctionParameter>,
43	/// Pre-compiled closure body instructions
44	pub body: Vec<Instruction>,
45	/// Variable names referenced from the enclosing scope (free variables)
46	pub captures: Vec<Fragment>,
47}
48
49/// Different types of scopes for variable management
50#[derive(Debug, Clone, PartialEq)]
51pub enum ScopeType {
52	/// Global scope (cannot be exited)
53	Global,
54	/// Function scope
55	Function,
56	/// Block scope
57	Block,
58	/// Conditional scope (if/else)
59	Conditional,
60	/// Loop scope
61	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	/// Load a field from a variable (e.g., $row.name)
75	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}