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
- 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.
- Sorter
- 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.
- List
- 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.
- Sets
- 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.
- Aggregators
- 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.