Řekl jsem si, že trochu opráším NotORM a nakonec z toho bylo 170 commitů. V API se přitom nic zásadního nezměnilo, většina je jen údržba:
#[\ReturnTypeWillChange].NotORM.declare(strict_types=1).insertUpdate().fetch() místo false vrací null. K této zpětně nekompatibilní změně jsem se odhodlal kvůli jednoduchému zápisu $app->fetch('title') ?? 'No such app'.fetchPairs() umí vracet vícerozměrné pole.NotORM\Structure\Discovery podporuje kromě MySQL i SQLite, PostgreSQL, MS SQL a Oracle.Ve verzi 2.1 jsem odstranil podporu $db->table[$array]. Byl to skvělý nástroj, jak se střelit do vlastní nohy: Stačilo prosté $db->table[$_GET["id"]] a SQLi bylo na světě. Klíčům pole se totiž věří, což u zápisu $db->table[["iso_code" => $code]] dávalo smysl. Náhradou je $db->table($array)->fetch(), což s $_GET["id"] nedává smysl použít.
Vyřešil jsem všechny otevřené issues, pull requesty a připomínky na fóru, které jsem zavřel. Nepříjemná byla chyba schovávající řádky, pokud dotaz vracel stejnou hodnotu primárního klíče víckrát (#80) – ty se nyní vrací bez ID v klíčích.
Zdvojnásobil jsem počet testů na 76. Ty nyní procházejí ve všech pěti podporovaných databázových systémech. Umožnil jsem měřit coverage, na základě čehož jsem přidal několik testů – ty našly skutečné chyby.
Vytvořil jsem demo, které ukazuje, jak jednoduchý kód stačí k vykonání efektivních SQL dotazů.
Rozhodl jsem se nepokračovat v experimentu then, který by umožnil vykonávat více dotazů při jednom round-tripu. Claude mi na to řekl, že jsem předběhl dobu.
Adminer 6.1.1 přináší skoro 50 změn, nejvýraznější je zvýrazňování nalezeného textu. Nechtěl jsem, aby při hledání group = 6 byla šestka vysvícená ve všech řádcích, proto se zvýrazňuje jen při hledání podřetězce nebo ve všech sloupcích.

Další zajímavé změny:
json_decode má sice volbu JSON_BIGINT_AS_STRING, ta je ale zase převede na řetězce. Při řešení jsem se dozvěděl o (*SKIP) a (*FAIL) v regulárech: preg_replace('~"(?:[^"\\\\]|\\\\.)*+"(*SKIP)(*FAIL)|-?\d[-+.\deE]*+~', '"\\\\u0001$0"', $json) při značkování čísel přeskočí řetězce a je to rychlejší než preg_replace_callback.ATTACH umožňuje vytvářet soubory. Zakázal jsem to metodou SQLite3::setAuthorizer.namePattern(), kterou se dá ovlivnit výchozí způsob pojmenování vytvářených objektů. Plugin name-patterns to dovoluje změnit. Výchozí pojmenování triggerů je nově podle všech událostí (např. iu pro INSERT OR UPDATE).