PlyxSQL 109 – Report dei bug risolti e miglioramenti implementati
Introduzione
Durante le ultime attività di sviluppo e revisione del progetto PlyxSQL, sono stati individuati e corretti numerosi problemi che riguardavano la gestione dei database, la compatibilità SQL tra diversi DBMS, l'esecuzione delle query, il Query Builder, l'Editor SQL, l'autenticazione e le operazioni asincrone.
L'obiettivo principale degli interventi è stato rendere l'applicazione più affidabile e coerente quando lavora con database differenti, evitando che una funzionalità corretta per un DBMS producesse comportamenti errati su un altro. Particolare attenzione è stata dedicata alla gestione dei dialetti SQL, alle informazioni sulla versione del server e alle differenze tra i vari database supportati.
Questo documento riassume i principali bug già risolti.
1. Corretto il problema del contesto SQL tra Editor, Core e Query Builder
Uno dei problemi più importanti riguardava la gestione del contesto SQL. In precedenza alcune funzionalità potevano utilizzare informazioni diverse sul database corrente a seconda del componente che le eseguiva.
Il problema è stato corretto introducendo una gestione più strutturata del contesto del server e del dialetto SQL. Il sistema ora distingue in modo più affidabile:
DBMS
versione del server
major/minor/patch
build
update
compatibilità
caratteristiche specifiche del database
impostazioni della sessione SQL
Questo permette all'Editor, al SQL Core e al Query Builder di lavorare con informazioni coerenti.
2. Corretto il problema del RETURNING
È stata corretta la gestione della clausola RETURNING. Il supporto non viene più trattato genericamente per tutte le operazioni DML. La gestione è stata separata per:
INSERT
UPDATE
DELETE
Questo evita di generare SQL non valido quando un particolare DBMS supporta RETURNING soltanto per alcune operazioni. La capability viene quindi valutata in funzione del dialetto e dell'operazione effettivamente richiesta.
3. Corretta la gestione di PostgreSQL LATERAL
È stato corretto il supporto a LATERAL per PostgreSQL. La gestione tiene conto della versione del database, evitando di generare SQL con funzionalità non disponibili sulle versioni più vecchie.
Questo è particolarmente importante per PostgreSQL 9.3 e versioni successive, dove la disponibilità della funzionalità deve essere verificata in relazione alla versione del server.
4. Migliorata la gestione del dialetto Firebird/InterBase
È stata rivista la gestione delle differenze tra Firebird e InterBase. Il sistema ora dispone di una gestione più specifica del dialetto SQL invece di trattare indistintamente tutti i database appartenenti alla stessa famiglia.
Questo ha permesso di migliorare:
quoting degli identificatori
generazione SQL
rilevamento del DBMS
gestione delle capability
gestione della versione
comportamento del Query Builder
5. Corretta la gestione delle impostazioni sql_mode
Per MySQL e MariaDB è stata aggiunta una gestione più accurata delle impostazioni di sessione. Vengono considerate impostazioni come:
ANSI_QUOTES
NO_BACKSLASH_ESCAPES
PIPES_AS_CONCAT
Queste impostazioni possono modificare concretamente il significato del codice SQL. La loro rilevazione permette quindi al motore SQL di evitare di interpretare sempre le stringhe e gli identificatori secondo un'unica sintassi.
6. Corretta la gestione della versione Oracle
È stata corretta la rilevazione della versione Oracle. Il sistema ora dispone di informazioni più precise sulla versione del server e può utilizzarle per determinare la disponibilità delle funzionalità SQL.
Questo evita che il generatore SQL utilizzi automaticamente funzionalità appartenenti a versioni più recenti del database.
7. Corretta la gestione dei BLOB/Base64
È stata migliorata la conversione dei dati BLOB in Base64. La gestione precedente poteva produrre risultati errati con determinati dati binari. La conversione è stata resa più robusta, evitando problemi nella rappresentazione e nell'esportazione dei dati binari.
8. Corretta la gestione dei numeri con separatori delle migliaia
È stato corretto il parsing dei valori numerici contenenti separatori delle migliaia. Il sistema distingue ora meglio tra:
separatore decimale
separatore delle migliaia
formato numerico specifico del database
Questo evita che un valore numerico venga interpretato come un numero differente oppure come una stringa.
9. Corretto il funzionamento asincrono dello Schema Compare
È stato corretto il funzionamento asincrono delle operazioni di Schema Compare. Le operazioni più pesanti non devono bloccare inutilmente l'interfaccia grafica.
Sono stati inoltre migliorati:
gestione dei task asincroni
aggiornamento dell'interfaccia
gestione della cancellazione
sincronizzazione dei risultati
10. Corretta la gestione degli errori durante l'introspezione
È stata migliorata la gestione degli errori durante le operazioni di introspezione del database. Gli errori non vengono più ignorati indiscriminatamente.
Questo permette di distinguere meglio tra:
oggetti realmente assenti
oggetti non supportati
errori SQL
errori di connessione
problemi di permessi
Il risultato è una diagnostica più affidabile.
11. Corretta la gestione dei nomi SQL non escapati
Sono stati corretti diversi casi in cui i nomi di database, schema, tabelle, colonne e oggetti SQL potevano essere utilizzati senza un corretto escaping.
La generazione SQL utilizza ora le regole di quoting appropriate per il dialetto. Questo è fondamentale quando un identificatore:
contiene spazi
contiene caratteri speciali
coincide con una parola riservata
utilizza maiuscole/minuscole significative
12. Corretta la gestione del tokenizer per le REST table
È stato corretto il tokenizer utilizzato nella gestione delle REST table. Il parser ora gestisce meglio le strutture SQL/API contenenti caratteri e delimitatori che precedentemente potevano essere interpretati in modo errato.
Questo riduce gli errori durante il parsing delle definizioni.
13. Corretto il calcolo dell'ultima pagina dei risultati
È stato corretto il problema relativo al calcolo di hasMore nell'ultima pagina dei risultati. In precedenza il sistema poteva indicare erroneamente la presenza di ulteriori record anche quando era già stata raggiunta l'ultima pagina.
La logica ora tiene conto correttamente del numero effettivo di record disponibili.
14. Corretta la gestione dei contatori a 64 bit
È stata migliorata la gestione dei contatori utilizzati per:
COUNT
offset
limit
paginazione
numero di record
I valori vengono gestiti con maggiore attenzione anche quando superano i limiti tipici degli interi a 32 bit. Questo evita overflow e conversioni errate durante le operazioni su grandi quantità di dati.
15. Corretta la gestione delle credenziali in modalità debug
Sono state rimosse/evitate situazioni in cui credenziali sensibili potevano essere esposte attraverso codice o configurazioni utilizzate durante il debugging.
L'obiettivo è impedire che username e password reali vengano accidentalmente inseriti nel codice sorgente o nei log di sviluppo.
16. Corretta la gestione del SessionKey
È stato corretto il problema relativo alla gestione del SessionKey. La sessione viene ora identificata in modo più coerente evitando collisioni o associazioni errate tra connessioni differenti.
Questo è particolarmente importante per le operazioni asincrone e per quelle che utilizzano più connessioni contemporaneamente.
17. Migliorata la rilevazione delle capability runtime di SQLite
È stata migliorata la gestione delle funzionalità disponibili a runtime in SQLite. In particolare vengono rilevate capability come:
JSON1
REGEXP
Questo permette di distinguere tra ciò che SQLite supporta teoricamente e ciò che è effettivamente disponibile nella build/runtime utilizzata.
18. Corretta la distinzione tra MySQL e MariaDB
È stata corretta la gestione della famiglia MySQL/MariaDB. Il sistema non si basa più esclusivamente sul nome del driver, ma considera anche le informazioni restituite dal server.
Questo permette di distinguere correttamente:
MySQL
MariaDB
La distinzione è importante perché i due DBMS possono avere differenze di sintassi e di capability nonostante la compatibilità generale.
19. Migliorata la gestione di DB2 e Informix nel Core e nell'Editor
È stata introdotta una gestione dedicata di DB2 e Informix nel SQL Core e nell'Editor. Questo evita che questi database vengano trattati semplicemente come SQL standard.
Il sistema dispone ora di regole specifiche per:
riconoscimento del dialetto
capability
quoting
paginazione
generazione SQL
Nel Query Builder il supporto rimane volutamente più limitato per le funzionalità che richiedono una conoscenza completa del dialetto.
20. Centralizzata la matrice delle capability SQL
È stata introdotta una matrice centralizzata per le capability dei vari DBMS. Il sistema dispone ora di regole che permettono di stabilire se una funzionalità è:
supportata
non supportata
supportata in modo condizionale
disponibile a partire da una determinata versione
Questo riduce la quantità di controlli sparsi nel codice e rende più coerente il comportamento dei vari componenti.
21. Distinta la generazione SQL nativa da quella emulata
È stata introdotta una distinzione più chiara tra:
funzionalità SQL native del database
funzionalità emulate dall'applicazione
Questo è importante perché il generatore SQL non deve presentare come nativa una funzionalità che in realtà viene ottenuta attraverso una trasformazione o un'emulazione.
22. Migliorata la gestione della paginazione dell'Editor
La paginazione dell'Editor è stata rivista utilizzando un approccio più strutturato. Il sistema distingue le strategie di paginazione in base al DBMS e cerca di utilizzare la sintassi corretta per ciascun database.
Sono state inoltre migliorate le operazioni di:
COUNT
OFFSET
LIMIT
gestione dell'ultima pagina
rilevamento della presenza di ulteriori record
23. Corretta la paginazione specifica di Firebird nel Query Builder
È stato corretto un problema nella generazione della paginazione Firebird quando veniva utilizzato SELECT DISTINCT. La posizione delle clausole SQL è stata corretta affinché la query generata rispettasse la sintassi prevista da Firebird.
24. Corretto il problema della paginazione DB2/Standard
È stato corretto un problema per cui la richiesta di una paginazione poteva essere ignorata e produrre SQL senza LIMIT/OFFSET o equivalente. La generazione è stata aggiornata per gestire correttamente le strategie supportate dal database.
25. Corretto un problema di invalidazione dei puntatori in DBTagCompare
È stato corretto un problema di gestione della memoria in DBTagCompare. Una struttura utilizzava riferimenti/puntatori verso elementi di un container che potevano essere invalidati quando il container veniva modificato.
Il codice è stato corretto evitando di mantenere riferimenti non più validi agli elementi. Questo elimina un potenziale comportamento indefinito e possibili crash.
26. Corretto un problema di gestione dell'utente corrente
È stato corretto un problema relativo a FCurrentUser nel sistema di autenticazione. La precedente implementazione poteva conservare un puntatore verso un elemento di una struttura dinamica dopo una modifica della struttura stessa.
La gestione è stata resa più sicura evitando riferimenti dangling.
27. Resa cancellabile l'importazione dello Schema Designer
L'importazione nello Schema Designer è stata resa:
asincrona
cancellabile
più sicura rispetto al blocco dell'interfaccia
Questo consente di interrompere operazioni lunghe senza lasciare l'applicazione in uno stato inconsistente.
28. Corretta la gestione degli errori di ReadStoredProcs
Gli errori durante la lettura delle stored procedure non vengono più semplicemente ignorati. Il sistema ora mantiene una maggiore visibilità sull'errore riscontrato durante l'introspezione.
Questo permette di distinguere meglio tra assenza di stored procedure e impossibilità di leggerle.
29. Migliorato il lint dell'Editor SQL
Il lint dell'Editor è stato aggiornato per considerare correttamente il contesto SQL. Questo evita falsi positivi generati quando il codice SQL veniva analizzato senza conoscere il database e il dialetto effettivamente utilizzato.
30. Corrette dichiarazioni mancanti nel sistema di autenticazione
Sono state corrette alcune dichiarazioni relative al sistema di autenticazione/header. Questo ha eliminato problemi di compilazione e di visibilità delle funzioni tra i diversi moduli.
Risultato complessivo
Gli interventi hanno portato a un miglioramento significativo dell'architettura del progetto. Le aree che hanno ricevuto i miglioramenti più importanti sono:
SQL Dialect Engine: il sistema è ora maggiormente consapevole del DBMS e della relativa versione.
SQL Core: le regole SQL sono state centralizzate e rese più coerenti tra i vari componenti.
Query Builder: la generazione SQL è stata migliorata per diversi DBMS, soprattutto per quanto riguarda capability e paginazione.
Editor SQL: sono stati corretti problemi relativi a paginazione, lint, conteggi e contesto SQL.
Schema Compare: sono state migliorate le operazioni asincrone, la gestione degli errori e l'introspezione.
Autenticazione: sono stati corretti problemi di lifetime e gestione delle informazioni di sessione.
SQLite: sono state aggiunte verifiche delle capability effettivamente disponibili a runtime.
MySQL/MariaDB: è stata migliorata la distinzione tra i due database e la gestione delle modalità SQL della sessione.
Il lavoro di revisione ha eliminato un numero significativo di bug e ha soprattutto migliorato la struttura interna del progetto. Il risultato più importante non è soltanto la correzione dei singoli errori, ma la costruzione di una base più solida per la gestione dei differenti DBMS.
La gestione del dialetto SQL è diventata progressivamente più centralizzata e consapevole del contesto del server, della versione e delle capability disponibili. Questo permette a SQL Manager di produrre SQL più affidabile e riduce il rischio che una funzionalità corretta su un database venga erroneamente applicata a un altro.
Restano naturalmente alcune aree di miglioramento, in particolare nella completa uniformità del contesto SQL tra tutti i componenti e nell'introspezione avanzata di alcuni DBMS. Tali aspetti appartengono però alla fase successiva di sviluppo e non fanno parte dell'elenco dei bug già risolti riportato in questo documento.
Nessun commento:
Posta un commento