aster.Web Data / Docs Aster UI ↗

Aster Web Data / How it works

Comparison and arithmetic rules

Where your database runs an operation its own comparison, collation and arithmetic apply, and where Aster computes a result its written rules apply.

If your customers column is case-insensitive in the database, a $filter=name eq 'acme' through Aster Web Data finds ACME, as a query in your own SQL client would. Aster translates each OData operator to the database operator with the same meaning, so wherever the database runs an operation, the answer is the database's. Aster's own written rules apply only where Aster computes a result itself: across two databases, and in the browser.

Where your database runs the operation

The database decides:

Null placement in a sort is the one exception: Aster states it on every sort key, first in ascending order and last in descending, as OData orders them.

The table compares a few cases. Each cell is the database's own behaviour, except where it says the engine: those operations DuckDB and SQLite leave to Aster.

Case PostgreSQL MariaDB DuckDB SQLite
divby by zero An error Null The engine: INF or NaN The engine: INF or NaN
1.5 div 2 on decimals 0.75000000000000000000 0.75000000000000 0.75 (the engine) 0.7, truncated at the scale
tolower, toupper Under the collation's provider Under the collation The engine ASCII only
INF and NaN in a double Stored Not stored Stored INF stored, NaN writes refused
Stored decimal NUMERIC, unbounded DECIMAL(p,s), default (65,30) DECIMAL(p,s), p up to 38 Scaled INTEGER, precision up to 18
Stored date-time TIMESTAMPTZ, microseconds DATETIME(6), UTC, years 1 to 9999 TIMESTAMPTZ, microseconds Fixed-width ISO 8601 UTC text, six fractional digits

Each database's page lists where its behaviour departs from OData: PostgreSQL, MariaDB, DuckDB and SQLite. TigerBeetle has a fixed catalog and no nulls or doubles.

Nulls

OData compares with nulls in two values, true or false, and Aster writes each comparison so the database gives that answer. $filter=region eq null finds the rows with no region. A row whose field is null matches no eq, lt or gt against a value, and matches ne: region ne 'EU' keeps the rows with no region, and so does not(region eq 'EU').

Where Aster computes the result

Aster applies its own rules where no database computes the answer:

The rules:

See where each part ran

The explain header shows where each operation of a request ran, and so which rules gave its answer. A release can move work between a database and Aster; the release notes list each such change for each database, and a change in placement ships only in a minor or major version, never in a patch.

From request to SQL shows how a request is split, and What runs on your database shows the SQL it becomes.