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 CompiledFunctionDef {
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 CompiledClosureDef {
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	// === Stack ===
67	PushConst(Value),
68	PushNone,
69	Pop,
70	Dup,
71
72	// === Variables ===
73	LoadVar(Fragment),
74	StoreVar(Fragment),
75	DeclareVar(Fragment),
76	/// Load a field from a variable (e.g., $row.name)
77	FieldAccess {
78		object: Fragment,
79		field: Fragment,
80	},
81
82	// === Arithmetic (pop 2, push 1) ===
83	Add,
84	Sub,
85	Mul,
86	Div,
87	Rem,
88
89	// === Unary ===
90	Negate,
91	LogicNot,
92
93	// === Comparison (pop 2, push Boolean) ===
94	CmpEq,
95	CmpNe,
96	CmpLt,
97	CmpLe,
98	CmpGt,
99	CmpGe,
100
101	// === Logic ===
102	LogicAnd,
103	LogicOr,
104	LogicXor,
105
106	// === Compound ===
107	Between,
108	InList {
109		count: u16,
110		negated: bool,
111	},
112	Cast(Type),
113
114	// === Control flow ===
115	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	// === Loops ===
130	ForInit {
131		variable_name: Fragment,
132	},
133	ForNext {
134		variable_name: Fragment,
135		addr: Addr,
136	},
137
138	// === Functions ===
139	DefineFunction(CompiledFunctionDef),
140	Call {
141		name: Fragment,
142		arity: u8,
143		is_procedure_call: bool,
144	},
145	ReturnValue,
146	ReturnVoid,
147
148	// === Closures ===
149	DefineClosure(CompiledClosureDef),
150
151	// === Query (volcano model) ===
152	Query(QueryPlan),
153
154	// === DDL ===
155	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	// === DDL (Drop) ===
182	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	// === Auth/Permissions ===
192	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	// === DML ===
205	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 ===
217	Append {
218		target: Fragment,
219	},
220
221	// === Output ===
222	Emit,
223
224	// === Control ===
225	Nop,
226	Halt,
227}