Compile error when symbols SQLITE_OMIT_SHARED_CACHE and SQLITE_USER_AUTHENTICATION=1 are both defined
(1) By Aloys (aloys) on 2021-07-22 11:59:01 [link]
If the preprocessor symbol `SQLITE_OMIT_SHARED_CACHE` is defined, the member `nTableLock` is **not** defined in the structure `Parse`. If the preprocessor symbol `SQLITE_USER_AUTHENTICATION=1` is also defined, the compiler emits an error message for the line ``` if( pParse->nTableLock>0 && db->init.busy==0 ){ ``` in function `sqlite3FinishCoding` (line 112602 in the SQLite amalgamation for version 3.36.0), because the undefined member `nTableLock` is referenced in this statement. It would be nice if this issue could be fixed for the next SQLite version. Thanks in advance.
(2.1) By TripeHound on 2021-07-22 22:06:00 edited from 2.0 in reply to 1 [link]
Are you building from the amalgamation, or the full sources? _Some_ options (including many of the `..._OMIT_...` ones) only work when building from the full sources. See [Options To Omit Features](https://www.sqlite.org/compile.html#_options_to_omit_features) in the SQLite docs.
(3) By Aloys (aloys) on 2021-07-23 07:36:27 in reply to 2.1
I'm building from the amalgamation. I'm aware of the fact that not all `_OMIT_` options work as expected when building from the amalgamation. However, the option `SQLITE_OMIT_SHARED_CACHE` has no influence on the lemon-generated parser. Therefore I suppose that building from the amalgamation with this option enabled should work. In the light of [DRH's comment](https://www.sqlite.org/forum/forumpost/1f291cdca460abf3?t=h) regarding shared cache mode about a year ago I would almost call it _good practice_ to **omit** shared cache mode. As far as I can tell using option `SQLITE_OMIT_SHARED_CACHE` seems to work properly when compiling from the amalgamation. However, it's not a question of _working at runtime_. If the combination of the options `SQLITE_OMIT_SHARED_CACHE` and `SQLITE_USER_AUTHENTICATION` is used the code does not compile, because the compiler complains about the missing definition for `nTableLock` (in line 188 of `build.c`). That is, the problem exists also when building from canonical sources. The reason is simply that the use of the member `nTableLock` is not guarded by some `#ifndef SQLITE_OMIT_SHARED_CACHE` preprocessor instruction, as it most likeley should.
(4) By Aloys (aloys) on 2021-07-26 11:42:16 in reply to 1 [link]
After inspecting the code in more detail, I get the impression that the fix for the compile issue I have is rather simple. If `SQLITE_OMIT_SHARED_CACHE` is **not** defined, then no tables will be locked and therefore the member `nTableLock` would be always 0. That is, lines 187 ff in `build.c` would not be executed at all: ```c #if SQLITE_USER_AUTHENTICATION if( pParse->nTableLock>0 && db->init.busy==0 ){ sqlite3UserAuthInit(db); if( db->auth.authLevel<UAUTH_User ){ sqlite3ErrorMsg(pParse, "user not authenticated"); pParse->rc = SQLITE_AUTH_USER; return; } } #endif ``` That is, adding a check for symbol `SQLITE_OMIT_SHARED_CACHE` should fix the issue: ```c #ifndef SQLITE_OMIT_SHARED_CACHE #if SQLITE_USER_AUTHENTICATION if( pParse->nTableLock>0 && db->init.busy==0 ){ sqlite3UserAuthInit(db); if( db->auth.authLevel<UAUTH_User ){ sqlite3ErrorMsg(pParse, "user not authenticated"); pParse->rc = SQLITE_AUTH_USER; return; } } #endif #endif ``` It would be nice if the SQLite developer would consider to apply this modification for the next SQLite version. Thanks in advance.
(5) By Nuno Cruces (ncruces) on 2024-01-22 12:01:55 in reply to 4 [link]
Can any of the developers chime in and validate this fix? `SQLITE_OMIT_SHARED_CACHE` is a [recommended compile time option](https://www.sqlite.org/compile.html#recommended_compile_time_options). Is it really supposed to be incompatible with `SQLITE_USER_AUTHENTICATION`?