On Sun, Dec 15, 2013 at 6:04 PM, James K. Lowden <jklow...@schemamania.org>wrote:
> http://www.sqlite.org/c3ref/result_blob.html > > I found a documentation typo and have a question about SQLITE_STATIC. > > The documentation for sqlite3_result_text says, > > "If the 3rd parameter is non-negative, then it must be the byte > offset into the string where the NUL terminator would appear if the > string where NUL terminated." > > I believe the intent is subjunctive, > > "if the string were NUL terminated". > > meaning no NUL is required. It continues: > > "If the 4th parameter to the sqlite3_result_text* interfaces or > to sqlite3_result_blob is the special constant SQLITE_STATIC, then > SQLite assumes that the text or BLOB result is in constant space and > does not copy the content...." > That statement would be more precise if it read: "... does not copy the content RIGHT AWAY..." If you are inserting into the database, obviously SQLite needs to copy the content in order to put it on disk. If you later query for the content, then it will copy off of disk again. If your statements is: SELECT ?1; And you bind a string that is not zero-terminated then request the result using sqlite3_column_text(), then SQLite will make a copy of the string in order to add the zero-terminator. But, if you request the string using sqlite3_column_blob() it will not make a copy. In other words, it delays copying the string until it really must, and avoids making a copy if possible. The application has no idea if and when SQLite might make a copy of the SQLITE_STATIC-bound string, so the application must guarantee that the string does not change until the statement is finalized or until the same parameter is rebound to a different value. > > My data are static (a read-only mmap'ed file), and the columns are not > null-terminated. > > The documentation for the usual column-reading function > sqlite3_column_text() says it always returns a null-terminated string: > > "Strings returned by sqlite3_column_text() and > sqlite3_column_text16(), even empty strings, are always > zero-terminated." > > According to the above, the user gets a null-terminated string from > static data in a virtual table that is not copied and need not contain a > NUL terminator. That seems unlikely. I would think either a copy is > made or the supplied static data must end in NUL. > > If sqlite3_result_text() is provided data with a nonzero length > marked as SQLITE_STATIC, where does the NUL come from that is returned > to the application by sqlite3_column_text()? > > --jkl > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users