SQLite Forum

Compile error when symbols SQLITE_OMIT_SHARED_CACHE and SQLITE_USER_AUTHENTICATION=1 are both defined
Login

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

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 [link]

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`?

(6) By Nuno Cruces (ncruces) on 2024-01-22 22:29:31 in reply to 5 [link]

So it seems the extension is formally deprecated:
https://www.sqlite.org/src/info/249048b0cbc37058

That settles my use case, I won't be wrapping this API.