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 undCharacter.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 rohesVARBINARY, eigenständig (keine Abhängigkeit von den Community-Erweiterungencrypto/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.