Language reference
def (scalar function definition)
Syntax
def <name>(<param>: <TYPE> [, ...]) : <RETURN_TYPE> := { <expression> };
private def <name>(...) : <TYPE> := { <expression> };
def double(x: NUMBER) : NUMBER := { x * 2 };
def add(a: NUMBER, b: NUMBER) : NUMBER := { a + b };
Description
def declares your own scalar function — a reusable calculation you can call by name inside conditions and projections. Define a discount formula, a name formatter, or a tax calculation once, then use it wherever you need it. Mark it private to keep it out of what other files see when they import this one.
Technical Description
A scalar def binds a ScalarFunctionSymbol with typed parameters and a return type (NUMBER, STRING, BOOLEAN, ANY, or a temporal type). The body is a single operand expression over the parameters. Calls resolve in predicates and projected expressions via the symbol table, falling back to the builtin registry. A private def cannot be called from any other file, whatever the form of the import; the file's own definitions, public ones included, still call it. Functions must be declared before they are called.
Examples
A simple calculation:
def double(x: NUMBER) : NUMBER := { x * 2 };
query { σ double(salary) > 100000 (Employees) };
def double(x: NUMBER) : NUMBER := { x * 2 };
query { SELECT double(salary) > 100000 (Employees) };
Multiple parameters:
def add(a: NUMBER, b: NUMBER) : NUMBER := { a + b };
query { π add(price, tax) → total (Products) };
def add(a: NUMBER, b: NUMBER) : NUMBER := { a + b };
query { PROJECT add(price, tax) -> total (Products) };
Zero-argument constant:
def vat() : NUMBER := { 0.2 };
Private helper, not exported:
private def clean(s: STRING) : STRING := { Trim(s) };
Limitations
The body is a single scalar expression, not a multi-statement procedure. Parameter and return types are scalar — the nested struct and array forms a source column may declare are not available here. For a function that returns a whole relation, use the RELATION return type (a table-valued function). A function cannot call itself, directly or through other functions: that is an error at the call that closes the loop. Each parameter has its own name.
Alternatives
A table-valued function (: RELATION) returns a relation rather than a value. The built-in scalar functions cover common string/math/date operations already.
SQL names
A function definition: SQL's CREATE FUNCTION, a user-defined function (UDF). It lives in the script, before the queries that call it: def double(x: NUMBER) : NUMBER := { x * 2 };. A function returning a table is def relation.
See Also
Notes
User functions are evaluated per row by the engine and are not pushed down to SQL.