È stata pubblicata la versione 3.35 di SQLite, un sistema di gestione di database leggero, disponibile come libreria condivisibile. Il codice di SQLite è distribuito come pubblico dominio, il che significa che può essere utilizzato senza restrizioni e gratuitamente per qualsiasi scopo. Il supporto finanziario per gli sviluppatori di SQLite è fornito da un consorzio creato appositamente, che include aziende come Adobe, Oracle, Mozilla, Bentley e Bloomberg.
Principali modifiche:
- Sono state aggiunte funzioni matematiche integrate (log2(), cos(), tg(), exp(), ln(), pow(), ecc.) che possono essere utilizzate in SQL. Per abilitare le funzioni integrate è necessaria la compilazione con l'opzione «-DSQLITE_ENABLE_MATH_FUNCTIONS».
- È stato implementato il supporto per l'istruzione «ALTER TABLE DROP COLUMN» per rimuovere colonne da una tabella e cancellare i dati precedentemente memorizzati in quella colonna.
- È stata ampliata l'implementazione dell'operazione UPSERT (inserisci-o-modifica), che consente di ignorare l'errore o di eseguire un aggiornamento invece di un'inserimento in caso di impossibilità di aggiungere dati tramite l'istruzione «INSERT … ON CONFLICT DO NOTHING/UPDATE» (ad esempio, se il record esiste già, è possibile eseguire un UPDATE invece di INSERT). Nella nuova versione è consentita la specifica di più blocchi «ON CONFLICT», che verranno elaborati in ordine di apparizione. Nell'ultimo blocco «ON CONFLICT» non è necessario specificare il parametro di definizione del conflitto per utilizzare «DO UPDATE».
- Nelle operazioni DELETE, INSERT e UPDATE è stata implementata la supporto per l'espressione RETURNING, che consente di restituire il contenuto del record eliminato, inserito o modificato. Ad esempio, l'istruzione «insert into … returning id» restituirà l'identificatore della riga aggiunta, mentre «update … set price = price * 1.10 returning price» restituirà il valore modificato del prezzo.
- Per le espressioni di tabella comuni (Common Table Expression, CTE), che consentono di utilizzare set di risultati temporanei denominati definiti tramite l'operatore WITH, sono disponibili le modalità "MATERIALIZED" e "NOT MATERIALIZED". "MATERIALIZED" implica la memorizzazione nella cache della query definita in una tabella fisica separata, con successiva estrazione dei dati da quella tabella, mentre con "NOT MATERIALIZED" verranno effettuate richieste ripetute ogni volta che si accede alla vista. Inizialmente, SQLite utilizzava per default la modalità "NOT MATERIALIZED", ma ora per i CTE utilizzati più di una volta è stata cambiata in "MATERIALIZED".
- Ridotto il consumo di memoria durante l'esecuzione dell'operazione VACUUM per i database che includono valori molto grandi con tipi TEXT o BLOB.
- Lavori sono stati effettuati per aumentare le prestazioni dell'ottimizzatore e del pianificatore delle query:
- Aggiunte ottimizzazioni per l'uso delle funzioni min e max con l'espressione "IN".
- Accelerata l'esecuzione dell'operatore EXISTS.
- Implementato il dispiegamento di sottoquery da espressioni UNION ALL utilizzate in un JOIN.
- Utilizzato l'indice per espressioni IS NOT NULL.
- È stata assicurata la conversione di «x IS NULL» e «x IS NOT NULL» in FALSE o TRUE per le colonne contrassegnate come «NOT NULL».
- Mancava il controllo delle chiavi esterne nell'UPDATE, se l'operazione non modifica colonne correlate alla chiave esterna.
- È consentito spostare parti del blocco WHERE in sottoquery contenenti funzioni di finestra, se queste parti sono limitate all'elaborazione di costanti e copie di espressioni dai blocchi «PARTITION BY» utilizzati nelle funzioni di finestra.
- Modifiche all'interfaccia della riga di comando:
- Aggiunta la comando «.filectrl data_version».
- Nei comandi «.once» e «.output» è stata aggiunta la supporto per la redirezione dell'output a un gestore chiamato utilizzando canali non nominati («|»).
- Nel comando «.stats» sono stati aggiunti gli argomenti «stmt» e «vmstep» per l'output delle statistiche sulle espressioni e sui contatori della macchina virtuale.
Fonte: opennet.ru
