Thank you all for your replies. As suggested, I am going to call sqlite3_column_count each time (after the first sqlite3_step).
On Mon, Sep 21, 2015 at 5:57 PM, Scott Robison <scott at casaderobison.com> wrote: > On Mon, Sep 21, 2015 at 5:48 AM, Richard Hipp <drh at sqlite.org> wrote: > >> On 9/21/15, Dominique Devienne <ddevienne at gmail.com> wrote: >> > On Sun, Sep 20, 2015 at 4:10 PM, Igor Tandetnik <igor at tandetnik.org> >> wrote: >> > >> >> On 9/20/2015 9:55 AM, gwenn wrote: >> >> >> >>> If there is no way to know that the statement has been recompiled, I >> >>> guess that the column count should not be cached... >> >>> >> >> >> >> You could use sqlite3_prepare (no _v2), then you'd get an error on >> schema >> >> change. You would then re-prepare the statement and update your caches. >> > >> > >> > Could perhaps also use the change counter >> > https://www.sqlite.org/fileformat2.html#chngctr, if you're not using WAL >> > mode. >> > You'd get false positives I guess, since both DML and DDL changes would >> > increment it, and I'm not sure that's any different from checking the >> > column_count anyway, but just in case it's useful. --DD >> >> PRAGMA schema_version >> (https://www.sqlite.org/pragma.html#pragma_schema_version) does what >> you want. >> >> But here the thing: It is probably far more expensive to run PRAGMA >> schema_version than it is to just rerun sqlite3_column_count(). I >> think this whole conversation is an exercise in premature >> optimization. Has anybody actually *measured* a performance problem >> with sqlite3_column_count()? >> > > I have not, and I don't have the environment to check. The original premise > as I understand it was that a function call was not expensive because the > API function itself was expensive, but transitions through the language > binding in use might be too expensive. I indicated the same thought last > night, that this might be premature optimization, but even if it is not, I > can't imagine any way to get this information (that the schema changed so > discard cached column count) without making *some* api call, and all api > calls will have the same problem: an expensive language binding transition. > > One person did suggest using sqlite3_prepare instead of v2, since it will > return a schema change error code. My gut instinct is that it'll be easier > / at least as performant to just continue to use v2 and not cache column > count after finishing stepping / resetting a statement. But as indicated, I > can't check that. > > The only reason I jumped into this however is that several responses > weren't answering the asked question, assuring the OP that what was being > asked couldn't happen. It can and does by design. In order to cache info > beyond a statement reset, there needs to be a way to invalidate it. > > In any case, I think the knowledge on the list has exhausted its ability to > answer. To summarize: > > 1. Checking the schema version will result in at least one language binding > transition (two if the version changed), whereas checking the column count > will always only be one transition. Might as well just check the column > count. > > 2. Using prepare vs prepare_v2 would return a schema error, at which point > the caller could finalize / re-prepare the statement and update his cached > values. This still involves extra language binding transitions to handle > the schema change that would have been automatically dealt with by > prepare_v2. OP would have to test to see if it benefits his use case, > though it seems unlikely to be any faster than using the easier v2 > interface and calling column count after each first step. > > -- > Scott Robison > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users