luajit
In-Process-LuaJIT-UDFs für DuckDB — JIT-kompiliert, parallel (Zustände pro Thread), vertrauenswürdige Sandbox, GROUP-BY-Aggregate, LIST-/STRUCT-/MAP-Brücken, eingebetteter Fennel-Compiler
Maintainer: alitrack
Installation und Laden
INSTALL luajit FROM community;LOAD luajit;Beispiel
-- Load and compile a UDF in one shotLOAD luajit;SELECT message FROM luajit_module( mode := 'quick_compile', source := 'return function(x) return x * 2 + 1 end', sql_name := 'x2p1');-- Use it immediately (auto-macro generated)SELECT x2p1(5);-- → 11Über luajit
luajit — JIT-kompilierte Lua-UDFs für DuckDB
Schreiben und führen Sie Lua-Funktionen direkt in SQL aus. LuaJIT kompiliert sie mit trace-basiertem JIT zu nativem Maschinen- code, mit paralleler Ausführung: jeder DuckDB-Worker-Thread besitzt einen eigenen lua_State (keine globale Sperre), sodass Thread-Parallelität direkt auf LuaJIT-Parallelität abgebildet wird.
16 Funktionen:
luajit_i/luajit_f/luajit_b— typisierte Skalar-UDFs (BIGINT, DOUBLE, BOOLEAN)luajit_v/luajit_vi/luajit_vs— chunk-gebündelte Skalare (1 Lua-Aufruf pro Chunk, ~1,9× Zeilenmodus)luajit_m— Auto-Cast für gemischte Typenluajit_l/luajit_s/luajit_map— LIST-/STRUCT-/MAP-Typbrücken (verschachtelte Typen einschl. DATE)luajit_agg— Aggregat-UDFs mit GROUP-BY-Unterstützung (volle Wertetabelle pro Gruppe)luajit_table— streamende tabellenerzeugende UDFs (O(1)-Speicher, 1 Mio. Zeilen)luajit_module— Modulverwaltung (14 Modi: compile, quick_compile, fennel, trusted, inspect, macro, list, drop, reset, save, load, last_error, info)
Funktionen:
- Autoerkennung (v0.23): quick_compile prüft die UDF (int/date/STRUCT/array) und erzeugt automatisch das passende Skalar- oder Batch-Makro — keine manuelle Stilwahl
- lua_State-Pool pro Thread (P4): keine globale Sperre bei der Lua-Ausführung — DuckDB- Parallelität → LuaJIT-Parallelität (~2,6× bei 4 Threads, CPU-gebundene UDFs)
- trusted-Sandbox-Modus: entfernt io/ffi/package/require/load*/debug, reduziert os (wird verzögert pro State angewendet, ein/aus über Threads hinweg)
_duckdb_query-Brücke: SQL aus Lua ausführen, Ergebnismengen als Lua-Tabellen erhalten- Eingebetteter Fennel-Compiler (
mode:='fennel'): Lisp-Syntax (match-Muster, Compile-Zeit-Makros) nach Lua kompiliert — keine Laufzeitkosten - DATE-/TIMESTAMP-/DECIMAL-/HUGEINT-Brücken (einschl. int64-/int128-Dezimalspeicher)
- GROUP-BY-Aggregate mit vollen Wertetabellen (Median, Standardabweichung, Perzentil, …)
- GC64-Build: keine 2-GB-Speichergrenze; ~1 MB eigenständige Binärdatei, keine Laufzeitabhängigkeiten
- save/load-Persistenz mit Escaping mehrzeiliger Quellen
Leistung (1 Mio. Zeilen, 2 BIGINT-Argumente, a*b+a, 4 Threads):
- Batch
luajit_vi: 13 ms; Zeileluajit_i: 13 ms (2,6× gegenüber Zeile+seriell) - Einzelthread: Batch 18 ms (1,9× Zeilenmodus 34 ms)
Plattformen: Linux x64/arm64, Windows (MSVC), macOS x64/arm64. WASM und mingw/rtools ausgeschlossen (LuaJIT erfordert bestimmte Toolchains); linux_arm64 geprüft (v0.31, CI + arm64-Laufzeittest).
Hinzugefügte Funktionen
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| luajit | scalar | NULL | NULL | |
| luajit_agg | aggregate | NULL | NULL | |
| luajit_b | scalar | NULL | NULL | |
| luajit_blob | scalar | NULL | NULL | |
| luajit_f | scalar | NULL | NULL | |
| luajit_i | scalar | NULL | NULL | |
| luajit_l | scalar | NULL | NULL | |
| luajit_m | scalar | NULL | NULL | |
| luajit_map | scalar | NULL | NULL | |
| luajit_module | table | NULL | NULL | |
| luajit_s | scalar | NULL | NULL | |
| luajit_table | table | NULL | NULL | |
| luajit_v | scalar | NULL | NULL | |
| luajit_vi | scalar | NULL | NULL | |
| luajit_vs | 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.