Skip to main content

reifydb_rql/
instruction.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}