Virtual machine features

Operand stack
The operand stack is of unlimited depth. Many of the opcodes use operands from the stack. For details, see the individual opcode descriptions.
Cursors are the only means for the virtual machine to interact with a database file. The virtual machine can have zero or more cursors. Each cursor points to a single table or index in the database. All cursors operate independently, even those pointing to the same object.
There are instructions to create a new cursor (Open), read data from a cursor (Column), advance the cursor to the next entry in the table (Next) or index (NextIdx), and more. All cursors are automatically closed when the virtual machine terminates.
Memory locations
The virtual machine contains an arbitrary number of fixed memory locations with addresses beginning at zero and growing upward. Each location can hold a string of any length. Typically, the memory cells hold the result of a scalar SELECT within a larger expression.
The virtual machine contains a single sorter, which accumulates records, sorts them, and plays them back in sorted order. The sorter is used by the ORDER BY clause of a SELECT statement.
In the virtual machine, there's a single list used to hold the row IDs for the records of a database table that needs to be updated. For the WHERE clause of an UPDATE or DELETE statement, QDB scans through the table and writes the row ID of every record to be modified into the list. Then, QDB plays back the list and modifies the table in a separate step.
The virtual machine can contain any number of sets. Each set holds any number of strings. Sets are used to implement the IN operator with a constant right-hand side.
Reading external files
A single external file can be opened by the virtual machine for reading. This external file is used when executing the COPY command.
An aggregator is a device used to implement the GROUP BY clause of a SELECT statement. The virtual machine has a single set of aggregators, each of which has one or more slots that hold the values extracted by that statement.
The number of slots is the same for all aggregators and is defined by the AggReset operation. At any time, a single aggregator is current or “has focus”. There are operations to read from or write to the memory slots of the aggregator in focus, to change the focus aggregator, and to scan through all aggregators.