Skip to main content

reifydb_rql/
instruction.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
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		CreateRingBufferNode, CreateSeriesNode, CreateSubscriptionNode, CreateSumTypeNode, CreateTableNode,
14		CreateTagNode, CreateTransactionalViewNode, DeleteRingBufferNode, DeleteSeriesNode, DeleteTableNode,
15		DispatchNode, FunctionParameter, InsertDictionaryNode, InsertRingBufferNode, InsertSeriesNode,
16		InsertTableNode, MigrateNode, RollbackMigrationNode, UpdateRingBufferNode, UpdateSeriesNode,
17		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	CreateTable(CreateTableNode),
157	CreateRingBuffer(CreateRingBufferNode),
158	CreateDeferredView(CreateDeferredViewNode),
159	CreateTransactionalView(CreateTransactionalViewNode),
160	CreateDictionary(CreateDictionaryNode),
161	CreateSumType(CreateSumTypeNode),
162	CreateSubscription(CreateSubscriptionNode),
163	CreatePrimaryKey(CreatePrimaryKeyNode),
164	CreateColumnProperty(CreateColumnPropertyNode),
165	CreateProcedure(CreateProcedureNode),
166	CreateSeries(CreateSeriesNode),
167	CreateEvent(CreateEventNode),
168	CreateTag(CreateTagNode),
169
170	CreateMigration(CreateMigrationNode),
171	Migrate(MigrateNode),
172	RollbackMigration(RollbackMigrationNode),
173	Dispatch(DispatchNode),
174	AlterSequence(AlterSequenceNode),
175	AlterTable(nodes::AlterTableNode),
176
177	// === DDL (Drop) ===
178	DropNamespace(nodes::DropNamespaceNode),
179	DropTable(nodes::DropTableNode),
180	DropView(nodes::DropViewNode),
181	DropRingBuffer(nodes::DropRingBufferNode),
182	DropDictionary(nodes::DropDictionaryNode),
183	DropSumType(nodes::DropSumTypeNode),
184	DropSubscription(nodes::DropSubscriptionNode),
185	DropSeries(nodes::DropSeriesNode),
186
187	// === Auth/Permissions ===
188	CreateUser(nodes::CreateUserNode),
189	CreateRole(nodes::CreateRoleNode),
190	CreateAuthentication(nodes::CreateAuthenticationNode),
191	Grant(nodes::GrantNode),
192	Revoke(nodes::RevokeNode),
193	DropUser(nodes::DropUserNode),
194	DropRole(nodes::DropRoleNode),
195	DropAuthentication(nodes::DropAuthenticationNode),
196	CreatePolicy(nodes::CreatePolicyNode),
197	AlterPolicy(nodes::AlterPolicyNode),
198	DropPolicy(nodes::DropPolicyNode),
199
200	// === DML ===
201	Delete(DeleteTableNode),
202	DeleteRingBuffer(DeleteRingBufferNode),
203	DeleteSeries(DeleteSeriesNode),
204	InsertTable(InsertTableNode),
205	InsertRingBuffer(InsertRingBufferNode),
206	InsertDictionary(InsertDictionaryNode),
207	InsertSeries(InsertSeriesNode),
208	Update(UpdateTableNode),
209	UpdateRingBuffer(UpdateRingBufferNode),
210	UpdateSeries(UpdateSeriesNode),
211
212	// === Append ===
213	Append {
214		target: Fragment,
215	},
216
217	// === Output ===
218	Emit,
219
220	// === Control ===
221	Nop,
222	Halt,
223}