trino_parity

Native Trino-kompatible Skalarfunktionen (trino_*) für Fälle, in denen DuckDBs eingebaute Funktionen bei Unicode- und Byte-Eingaben von Trino abweichen — ICU Full Case Folding, Codepoint-Reverse, Java-Whitespace-Trim, NFC-Normalisierung sowie xxhash64/sha512/hmac_sha256 auf Rohbytes

Maintainer: apatrida

Installation und Laden

INSTALL trino_parity FROM community;
LOAD trino_parity;

Beispiel

INSTALL trino_parity FROM community;
LOAD trino_parity;
-- Full Unicode case folding, matching Trino (Java) rather than DuckDB's
-- built-in lower(). Turkish dotted-I folds to 'i' + U+0307:
SELECT trino_lower('İSTANBUL'); -- 'i̇stanbul'
-- German sharp-S upper-cases to 'SS', not U+1E9E:
SELECT trino_upper('straße'); -- 'STRASSE'
-- Code-point reverse (DuckDB's built-in reverse is grapheme-aware):
SELECT trino_reverse('a😀b'); -- 'b😀a'
-- The catalog of functions this extension provides:
SELECT trino_name, arg_count, category FROM trino_meta(); -- 10 rows

Über trino_parity

trino_parity stellt native Skalarfunktionen trino_<name>(...) für die speziellen Fälle bereit, in denen DuckDBs eingebaute Funktionen vom dokumentierten Verhalten Trinos bei Unicode- und Byte-Eingaben abweichen.

Sie ist dafür gedacht, serverseitig von allem geladen zu werden, das Trino-förmige Prädikate nach DuckDB durchreicht. Wenn ein Trino-Connector naiv WHERE lower(name) = 'apple' nach DuckDB schiebt, läuft der Filter in jedem Motor mit anderer Unicode-Semantik, und für Trino sichtbare Zeilen können still aus dem Ergebnis verschwinden. Diese Erweiterung liefert nur die Funktionen, bei denen das tatsächlich passiert — wo DuckDBs Built-in wirklich abweicht und eine native C++-Neuimplementierung nötig ist, um Trino zu entsprechen. Für die große Mehrheit der Trino-Funktionen ist DuckDBs Built-in bereits äquivalent (oder eine triviale Umbenennung / ein Operator / eine einzeilige Umschreibung), sodass ein Aufrufer diese direkt gegen DuckDB ausgibt — keine Erweiterung nötig.

Behobene konkrete Abweichungen

Function DuckDB built-in Trino spec trino_* result
lower('İ') (U+0130) 'i' (simple case folding) 'i' + U+0307 (full folding) matches Trino
upper('ß') (U+00DF) 'ẞ' (U+1E9E) 'SS' matches Trino
reverse('cafe'+U+0301) grapheme-aware code-point-only matches Trino
trim (tab/LF/CR/FF/VT) not stripped Java Character.isWhitespace strips them matches Trino
xxhash64(varbinary) no direct built-in XXH64, big-endian bytes matches Trino

Funktionsinventar

trino_meta() katalogisiert die zehn nativen Funktionen der Erweiterung:

  • String (ICU): trino_lower/1, trino_upper/1, trino_reverse/1, trino_trim/1, trino_ltrim/1, trino_rtrim/1, trino_normalize/1 — Full Case Folding der Root-Locale, Codepoint-Reverse und Character.isWhitespace-Trim, über statisch gelinktes, in die Binärdatei eingebettetes ICU (sodass das Unicode-Verhalten unabhängig vom Host-DuckDB-Build ist).
  • Hash (mitgeliefert): trino_xxhash64/1, trino_sha512/1, trino_hmac_sha256/2 — über rohes VARBINARY, eigenständig (keine Abhängigkeit von den Community-Erweiterungen crypto / hashfuncs).

Abgestimmte Trino-Funktionen (z. B. length, abs, year, substring, regexp_extract) werden bewusst NICHT mitgeliefert — ein Aufrufer gibt sie als bloßes DuckDB-SQL aus. Die vollständige Trino↔DuckDB-Abbildung je Funktion und die empirischen Audits, die jede Entscheidung begründen, liegen in docs/ des Repositories.

Quelle und vollständiger Abweichungskatalog: https://github.com/brikk/duckdb-trino-parity-extension

Hinzugefügte Funktionen

function_name function_type description comment examples
trino_hmac_sha256 scalar NULL NULL
trino_lower scalar NULL NULL
trino_ltrim scalar NULL NULL
trino_meta table_macro NULL NULL
trino_normalize scalar NULL NULL
trino_reverse scalar NULL NULL
trino_rtrim scalar NULL NULL
trino_sha512 scalar NULL NULL
trino_trim scalar NULL NULL
trino_upper scalar NULL NULL
trino_xxhash64 scalar NULL NULL

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.