Am 26.11.2015 um 01:30 schrieb Simon Slavin:
>
> On 25 Nov 2015, at 8:25pm, Ulrich Telle <ulrich.telle at gmx.de> wrote:
>
>> SELECT name, rootpage, sql FROM 'main'.sqlite_master ORDER BY rowid
>
> Can you try that again without the quotes around "main" ?
>
> SELECT name, rootpage, sql FROM main.sqlite_master ORDER BY rowid

No. The reason is that this is an SQL statement generated by SQLite 
itself internally while initializing an empty database.

In fact, I finally found out that the lines 379-384 in build.c (or 
93143-93148 in the amalgamation) are the cause of the problem:

#if SQLITE_USER_AUTHENTICATION
   else if( pParse->db->auth.authLevel<UAUTH_User ){
     sqlite3ErrorMsg(pParse, "user not authenticated");
     p = 0;
   }
#endif

This code "worked" in prior versions (before 3.9.0), because the symbol 
SQLITE_USER_AUTHENTICATION was misspelled as SQLITE_USER_AUTHENICATION 
... and the code was not executed at all.

The problem is that during initialization of a new database the value of 
authLevel is still 0. In that case the check should either not be 
prformed at all, or the user authentication should be initialized:

a) Change line 380 to:

else if( pParse->db->auth.authLevel!=0 && 
pParse->db->auth.authLevel<UAUTH_User ){

or

b) Add initialization

#if SQLITE_USER_AUTHENTICATION
else {
   if( pParse->db->auth.authLevel==UAUTH_Unknown ){
     sqlite3UserAuthInit(pParse->db);
   }
   if( pParse->db->auth.authLevel<UAUTH_User ){
     sqlite3ErrorMsg(pParse, "user not authenticated");
     p = 0;
   }
}
#endif


Probably something like b) should be preferred. However, I really don't 
know whether other conditions have to be checked before calling 
sqlite3UserAuthInit. I assume the SQLite developers will know that.

Regards,

Ulrich


Reply via email to