I don't believe in relational databases. Obviously an ACID transaction upon relational data (ie ennumerated objects that refer to other ennumerated objects) are sometimes specifically useful, and often will kind of work and besides, that's what vendors are still selling... rsdoiel's recent phost is about the lack of an equivalency mechanism between CSVs and SQL tables. I believe in sqlite3 this is called a virtual table module. It makes me feel a little like a sell-out (like death) but with the game my non-cyber-space computer group is making, we are using sqlite3 for saving state (focus of next month) so this is on my mind. However I haven't used the csv virtual table module mechanism, it just exists on the periphery of my knowledge. Eskwewel wizards by the way can you improve my quick what-does-an-sql-ite3-statement-look-like-in-C example (that creates a table in test.db) ? ```C #include <stdlib.h> #include <stdio.h> #include <sqlite3.h> static int callback(void *, int, char **, char **); int main(void) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "Can't open db: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return EXIT_FAILURE; } rc = sqlite3_exec(db, "CREATE TABLE Foo (" "Key int, " "Name varchar(255), " "Story text)", callback, 0, &zErrMsg); if (rc) { fprintf(stderr, "SQL failure: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return EXIT_FAILURE; } sqlite3_close(db); puts(""); return EXIT_SUCCESS; } static int callback(void *NotUsed, int N, char **results, char **azColName) { return EXIT_SUCCESS; } ```