Találtam egy hibát az SQLite3-ban. Illetve éppen az a (némiképp filozófiai) kérdés, hogy hibáról van-e szó, vagy egyszerűen ez a működése.
Mielőtt továbbmennénk, leszögezem, hogy nem vagyok érdekelt a kérdésben. Nincsenek SQLite3-ra alapozott alkalmazásaim. Az SQLite csak annyiban érdekel, hogy interfészeket írok különböző adatbázisokhoz: Oracle, Postgres, MySQL, DB2 mellett az SQLite-hoz is. Az SQLite lehetőségeit letapogató programjaim egyikével akadtam a jelenségre. Vettem magamnak a fáradságot egy bug report elkészítésére, megírtam a jelenséget demonstráló programot Rubyban (azért Rubyban, hogy mindenki könnyen tanulmányozhassa) és beküldtem az SQLite3 users mailing listre.
A kérdéses Ruby program:
http://comfirm.hu/pub/sqlite3-regression.rb
Érdekelnének a vélemények.
Várhatóan meg fognak jelenni olyan posztok, amikben tanácsokat kapok, hogyan tudom elkerülni azt a jelenséget, amit demonstrálni akarok. Ezért itt leírok néhány lehetőséget, amit érdemes kipróbálni. Egy részüket leírtam a ruby script alján levő kommentekben is:
1) Ha nincs bekapcsolva a WAL mód (write ahead log, 6. sor kikommentezve), a jelenség megmarad, tehát nem függ a WAL-tól.
2) Ha nincs létrehozva a "proba_nev" index (28. sor kikommentezve), a jelenség megszűnik.
3) Ha a select bármilyen módon rendezve van, azaz írunk egy _akármilyen_ plusz order by klózt az 54. sorba, a jelenség megszűnik.
4) Ha teljesen kihagyjuk az 56. sorban levő update-et, a jelenség megszűnik.
5) Ha úgy módosítjuk, az 56. sorban levő update-et, hogy ne módosítsa a "megnevezes" mezőt, a jelenség megszűnik.
6) Ha az sqlite3 könyvtár mostani változatai helyett a 3.7.9 verzióval futtatjuk a programot, a jelenség megszűnik.
Még biztos lehetnek további ötletek is. Nem érdekelnek az olyan megjegyzések, hogy a design pattern jó vagy rossz. Ezek legális SQL utasítások, amiket az adatbázisnak így vagy úgy végre kell hajtania. A kérdés az, hogy amit az SQLite3 csinál, az hiba-e. Az bizonyos hogy _regresszió_ (vagyis magyar szóval _eltérés_), hiszen látjuk, hogy a 3.7.9 még másképp működik, mint a későbbiek.