Dennis Cote <[EMAIL PROTECTED]> wrote: > > > I can imagine that a version of Sqlite which does not include its SQL > > compiler and which uses precompiled VDBE code would provide similar > > functionality to DeviceSQL, particularly if the Sqlite compiler were > > extended to generate VDBE from PL/SQl. I can imagine that the higher > > information density of the VDBE code could deliver the advantage =of a > > smaller memory footprint. > > I thought that this already existed as a commercial product that Richard > offered, but I can't find any reference to it on the paid support page > at http://www.hwaci.com/sw/sqlite/prosupport.html. My recollection was > an offline compiler that ran on a PC and generated VDBE code to execute > SQL statements, along with source code for a runtime execution engine > that would execute those pre-compiled statements. The execution engine > could be built for any target, and was much smaller than SQLite because > it eliminated the parser and code generator functionality. Does this > exist, or was I just imagining it? >
That would be the Serialized Statement Extension, SSE. The SSE provides the programmer with two new APIs: int sqlite3_serialize(sqlite3_stmt*, void**, int*); int sqlite3_deserialize(sqlite3*, void*, int, sqlite3_stmt**); The first routine takes an SQL statement that was generated by sqlite3_prepare() and converts it into a form that can be stored on disk or compiled into a program. The second routine does the reverse; it takes the serialization of a statement and converts it back into a working SQL statement that can be used just like any other statement created by sqlite3_prepare(). You compile SQLite normally on your development workstation, but for you embedded target you add -DSQLITE_OMIT_PARSER to leave off the parser. By omitting other optional features (date/time functions, views, triggers) you can get the size of the library down to the 70KiB range or less. On a workstation, you can sqlite3_prepare() statements, then hand them to sqlite3_serialize(). The results can be hard coded into C programs to be manually deserialized later, if you like, though that is a lot of work. A simpler approach is to use the special sqlite_statement table: CREATE TABLE sqlite_statement( id INTEGER PRIMARY KEY, sql TEXT, serial BLOB ); A new API is available that will automatically extract and deserialize an SQL statement from the sqlite_statement table given its id number: int sqlite3_fetch_statement(sqlite3*, int id, sqlite3_stmt**); The idea here is that the SQL statements needed by an application can be inserted as plain text into the sqlite_statement table. For example: INSERT INTO sqlite_statement(sql) VALUES('SELECT * FROM table1'); After many such statements are inserted, they can all be serialized as follows: UPDATE sqlite_statement SET serial = sqlite_serialize(sql,id); Then the complete database can be moved from the development platform over to the embedded device and the embedded device can use the sqlite3_fetch_statement() API to extract the statements it needs to execute. To be useful, your precompiled statements will normally contain parameters (ex: "INSERT INTO tx VALUES(?,?,?)") and the embedded application will using sqlite3_bind_xxx() interfaces to attach values to these parameter prior to invoking sqlite3_step(). The SSE has not been kept current with the base SQLite. But if there is interest, we could resurrect it easily enough. -- D. Richard Hipp <[EMAIL PROTECTED]> ----------------------------------------------------------------------------- To unsubscribe, send email to [EMAIL PROTECTED] -----------------------------------------------------------------------------