| | @@ -1,8 +1,8 @@ |
| 1 | 1 | /****************************************************************************** |
| 2 | 2 | ** This file is an amalgamation of many separate C source files from SQLite |
| 3 | | -** version 3.14.1. By combining all the individual C code files into this |
| 3 | +** version 3.15.0. By combining all the individual C code files into this |
| 4 | 4 | ** single large file, the entire code can be compiled as a single translation |
| 5 | 5 | ** unit. This allows many compilers to do optimizations that would not be |
| 6 | 6 | ** possible if the files were compiled separately. Performance improvements |
| 7 | 7 | ** of 5% or more are commonly seen when SQLite is compiled as a single |
| 8 | 8 | ** translation unit. |
| | @@ -378,13 +378,13 @@ |
| 378 | 378 | ** |
| 379 | 379 | ** See also: [sqlite3_libversion()], |
| 380 | 380 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 381 | 381 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 382 | 382 | */ |
| 383 | | -#define SQLITE_VERSION "3.14.1" |
| 384 | | -#define SQLITE_VERSION_NUMBER 3014001 |
| 385 | | -#define SQLITE_SOURCE_ID "2016-08-11 18:53:32 a12d8059770df4bca59e321c266410344242bf7b" |
| 383 | +#define SQLITE_VERSION "3.15.0" |
| 384 | +#define SQLITE_VERSION_NUMBER 3015000 |
| 385 | +#define SQLITE_SOURCE_ID "2016-08-18 22:44:22 d6e3d5796c9991ca0af45ed92ce36f55efc02348" |
| 386 | 386 | |
| 387 | 387 | /* |
| 388 | 388 | ** CAPI3REF: Run-Time Library Version Numbers |
| 389 | 389 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 390 | 390 | ** |
| | @@ -2227,12 +2227,22 @@ |
| 2227 | 2227 | ** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface |
| 2228 | 2228 | ** is disabled or enabled following this call. The second parameter may |
| 2229 | 2229 | ** be a NULL pointer, in which case the new setting is not reported back. |
| 2230 | 2230 | ** </dd> |
| 2231 | 2231 | ** |
| 2232 | +** <dt>SQLITE_DBCONFIG_MAINDBNAME</dt> |
| 2233 | +** <dd> ^This option is used to change the name of the "main" database |
| 2234 | +** schema. ^The sole argument is a pointer to a constant UTF8 string |
| 2235 | +** which will become the new schema name in place of "main". ^SQLite |
| 2236 | +** does not make a copy of the new main schema name string, so the application |
| 2237 | +** must ensure that the argument passed into this DBCONFIG option is unchanged |
| 2238 | +** until after the database connection closes. |
| 2239 | +** </dd> |
| 2240 | +** |
| 2232 | 2241 | ** </dl> |
| 2233 | 2242 | */ |
| 2243 | +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ |
| 2234 | 2244 | #define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ |
| 2235 | 2245 | #define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ |
| 2236 | 2246 | #define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ |
| 2237 | 2247 | #define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ |
| 2238 | 2248 | #define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ |
| | @@ -13694,11 +13704,11 @@ |
| 13694 | 13704 | ** in the sqlite.aDb[] array. aDb[0] is the main database file and |
| 13695 | 13705 | ** aDb[1] is the database file used to hold temporary tables. Additional |
| 13696 | 13706 | ** databases may be attached. |
| 13697 | 13707 | */ |
| 13698 | 13708 | struct Db { |
| 13699 | | - char *zName; /* Name of this database */ |
| 13709 | + char *zDbSName; /* Name of this database. (schema name, not filename) */ |
| 13700 | 13710 | Btree *pBt; /* The B*Tree structure for this database file */ |
| 13701 | 13711 | u8 safety_level; /* How aggressive at syncing data to disk */ |
| 13702 | 13712 | u8 bSyncSet; /* True if "PRAGMA synchronous=N" has been run */ |
| 13703 | 13713 | Schema *pSchema; /* Pointer to database schema (possibly shared) */ |
| 13704 | 13714 | }; |
| | @@ -34851,10 +34861,31 @@ |
| 34851 | 34861 | unixLeaveMutex(); |
| 34852 | 34862 | } |
| 34853 | 34863 | #endif /* if !OS_VXWORKS */ |
| 34854 | 34864 | return pUnused; |
| 34855 | 34865 | } |
| 34866 | + |
| 34867 | +/* |
| 34868 | +** Find the mode, uid and gid of file zFile. |
| 34869 | +*/ |
| 34870 | +static int getFileMode( |
| 34871 | + const char *zFile, /* File name */ |
| 34872 | + mode_t *pMode, /* OUT: Permissions of zFile */ |
| 34873 | + uid_t *pUid, /* OUT: uid of zFile. */ |
| 34874 | + gid_t *pGid /* OUT: gid of zFile. */ |
| 34875 | +){ |
| 34876 | + struct stat sStat; /* Output of stat() on database file */ |
| 34877 | + int rc = SQLITE_OK; |
| 34878 | + if( 0==osStat(zFile, &sStat) ){ |
| 34879 | + *pMode = sStat.st_mode & 0777; |
| 34880 | + *pUid = sStat.st_uid; |
| 34881 | + *pGid = sStat.st_gid; |
| 34882 | + }else{ |
| 34883 | + rc = SQLITE_IOERR_FSTAT; |
| 34884 | + } |
| 34885 | + return rc; |
| 34886 | +} |
| 34856 | 34887 | |
| 34857 | 34888 | /* |
| 34858 | 34889 | ** This function is called by unixOpen() to determine the unix permissions |
| 34859 | 34890 | ** to create new files with. If no error occurs, then SQLITE_OK is returned |
| 34860 | 34891 | ** and a value suitable for passing as the third argument to open(2) is |
| | @@ -34887,11 +34918,10 @@ |
| 34887 | 34918 | *pUid = 0; |
| 34888 | 34919 | *pGid = 0; |
| 34889 | 34920 | if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ |
| 34890 | 34921 | char zDb[MAX_PATHNAME+1]; /* Database file path */ |
| 34891 | 34922 | int nDb; /* Number of valid bytes in zDb */ |
| 34892 | | - struct stat sStat; /* Output of stat() on database file */ |
| 34893 | 34923 | |
| 34894 | 34924 | /* zPath is a path to a WAL or journal file. The following block derives |
| 34895 | 34925 | ** the path to the associated database file from zPath. This block handles |
| 34896 | 34926 | ** the following naming conventions: |
| 34897 | 34927 | ** |
| | @@ -34918,19 +34948,22 @@ |
| 34918 | 34948 | nDb--; |
| 34919 | 34949 | } |
| 34920 | 34950 | memcpy(zDb, zPath, nDb); |
| 34921 | 34951 | zDb[nDb] = '\0'; |
| 34922 | 34952 | |
| 34923 | | - if( 0==osStat(zDb, &sStat) ){ |
| 34924 | | - *pMode = sStat.st_mode & 0777; |
| 34925 | | - *pUid = sStat.st_uid; |
| 34926 | | - *pGid = sStat.st_gid; |
| 34927 | | - }else{ |
| 34928 | | - rc = SQLITE_IOERR_FSTAT; |
| 34929 | | - } |
| 34953 | + rc = getFileMode(zDb, pMode, pUid, pGid); |
| 34930 | 34954 | }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ |
| 34931 | 34955 | *pMode = 0600; |
| 34956 | + }else if( flags & SQLITE_OPEN_URI ){ |
| 34957 | + /* If this is a main database file and the file was opened using a URI |
| 34958 | + ** filename, check for the "modeof" parameter. If present, interpret |
| 34959 | + ** its value as a filename and try to copy the mode, uid and gid from |
| 34960 | + ** that file. */ |
| 34961 | + const char *z = sqlite3_uri_parameter(zPath, "modeof"); |
| 34962 | + if( z ){ |
| 34963 | + rc = getFileMode(z, pMode, pUid, pGid); |
| 34964 | + } |
| 34932 | 34965 | } |
| 34933 | 34966 | return rc; |
| 34934 | 34967 | } |
| 34935 | 34968 | |
| 34936 | 34969 | /* |
| | @@ -75441,11 +75474,11 @@ |
| 75441 | 75474 | int nEntry; |
| 75442 | 75475 | sqlite3BtreeEnter(pBt); |
| 75443 | 75476 | nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt)); |
| 75444 | 75477 | sqlite3BtreeLeave(pBt); |
| 75445 | 75478 | if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){ |
| 75446 | | - rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zName, nEntry); |
| 75479 | + rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zDbSName, nEntry); |
| 75447 | 75480 | } |
| 75448 | 75481 | } |
| 75449 | 75482 | } |
| 75450 | 75483 | #endif |
| 75451 | 75484 | return rc; |
| | @@ -81472,11 +81505,11 @@ |
| 81472 | 81505 | } |
| 81473 | 81506 | |
| 81474 | 81507 | if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ |
| 81475 | 81508 | assert( pC->isTable ); |
| 81476 | 81509 | assert( pC->iDb>=0 ); |
| 81477 | | - zDb = db->aDb[pC->iDb].zName; |
| 81510 | + zDb = db->aDb[pC->iDb].zDbSName; |
| 81478 | 81511 | pTab = pOp->p4.pTab; |
| 81479 | 81512 | assert( HasRowid(pTab) ); |
| 81480 | 81513 | op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); |
| 81481 | 81514 | }else{ |
| 81482 | 81515 | pTab = 0; /* Not needed. Silence a comiler warning. */ |
| | @@ -81589,11 +81622,11 @@ |
| 81589 | 81622 | ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set |
| 81590 | 81623 | ** VdbeCursor.movetoTarget to the current rowid. */ |
| 81591 | 81624 | if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ |
| 81592 | 81625 | assert( pC->iDb>=0 ); |
| 81593 | 81626 | assert( pOp->p4.pTab!=0 ); |
| 81594 | | - zDb = db->aDb[pC->iDb].zName; |
| 81627 | + zDb = db->aDb[pC->iDb].zDbSName; |
| 81595 | 81628 | pTab = pOp->p4.pTab; |
| 81596 | 81629 | if( (pOp->p5 & OPFLAG_SAVEPOSITION)!=0 && pC->isTable ){ |
| 81597 | 81630 | pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor); |
| 81598 | 81631 | } |
| 81599 | 81632 | }else{ |
| | @@ -82559,11 +82592,11 @@ |
| 82559 | 82592 | initData.db = db; |
| 82560 | 82593 | initData.iDb = pOp->p1; |
| 82561 | 82594 | initData.pzErrMsg = &p->zErrMsg; |
| 82562 | 82595 | zSql = sqlite3MPrintf(db, |
| 82563 | 82596 | "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", |
| 82564 | | - db->aDb[iDb].zName, zMaster, pOp->p4.z); |
| 82597 | + db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); |
| 82565 | 82598 | if( zSql==0 ){ |
| 82566 | 82599 | rc = SQLITE_NOMEM_BKPT; |
| 82567 | 82600 | }else{ |
| 82568 | 82601 | assert( db->init.busy==0 ); |
| 82569 | 82602 | db->init.busy = 1; |
| | @@ -83943,11 +83976,11 @@ |
| 83943 | 83976 | zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); |
| 83944 | 83977 | if( zTrace ){ |
| 83945 | 83978 | int i; |
| 83946 | 83979 | for(i=0; i<db->nDb; i++){ |
| 83947 | 83980 | if( DbMaskTest(p->btreeMask, i)==0 ) continue; |
| 83948 | | - sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, zTrace); |
| 83981 | + sqlite3_file_control(db, db->aDb[i].zDbSName, SQLITE_FCNTL_TRACE, zTrace); |
| 83949 | 83982 | } |
| 83950 | 83983 | } |
| 83951 | 83984 | #endif /* SQLITE_USE_FCNTL_TRACE */ |
| 83952 | 83985 | #ifdef SQLITE_DEBUG |
| 83953 | 83986 | if( (db->flags & SQLITE_SqlTrace)!=0 |
| | @@ -84279,11 +84312,11 @@ |
| 84279 | 84312 | rc = SQLITE_ERROR; |
| 84280 | 84313 | sqlite3BtreeLeaveAll(db); |
| 84281 | 84314 | goto blob_open_out; |
| 84282 | 84315 | } |
| 84283 | 84316 | pBlob->pTab = pTab; |
| 84284 | | - pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zName; |
| 84317 | + pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName; |
| 84285 | 84318 | |
| 84286 | 84319 | /* Now search pTab for the exact column. */ |
| 84287 | 84320 | for(iCol=0; iCol<pTab->nCol; iCol++) { |
| 84288 | 84321 | if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){ |
| 84289 | 84322 | break; |
| | @@ -87831,21 +87864,19 @@ |
| 87831 | 87864 | static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ |
| 87832 | 87865 | int rc; |
| 87833 | 87866 | testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); |
| 87834 | 87867 | testcase( ExprHasProperty(pExpr, EP_Reduced) ); |
| 87835 | 87868 | rc = pWalker->xExprCallback(pWalker, pExpr); |
| 87836 | | - if( rc==WRC_Continue |
| 87837 | | - && !ExprHasProperty(pExpr,EP_TokenOnly) ){ |
| 87838 | | - if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; |
| 87839 | | - if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort; |
| 87840 | | - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ |
| 87841 | | - if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; |
| 87842 | | - }else{ |
| 87843 | | - if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; |
| 87844 | | - } |
| 87845 | | - } |
| 87846 | | - return rc & WRC_Abort; |
| 87869 | + if( rc || ExprHasProperty(pExpr,EP_TokenOnly) ) return rc & WRC_Abort; |
| 87870 | + if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; |
| 87871 | + if( pExpr->pRight && walkExpr(pWalker, pExpr->pRight) ) return WRC_Abort; |
| 87872 | + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ |
| 87873 | + if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; |
| 87874 | + }else{ |
| 87875 | + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; |
| 87876 | + } |
| 87877 | + return WRC_Continue; |
| 87847 | 87878 | } |
| 87848 | 87879 | SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ |
| 87849 | 87880 | return pExpr ? walkExpr(pWalker,pExpr) : WRC_Continue; |
| 87850 | 87881 | } |
| 87851 | 87882 | |
| | @@ -88175,12 +88206,12 @@ |
| 88175 | 88206 | ** legacy and because it does not hurt anything to just ignore the |
| 88176 | 88207 | ** database name. */ |
| 88177 | 88208 | zDb = 0; |
| 88178 | 88209 | }else{ |
| 88179 | 88210 | for(i=0; i<db->nDb; i++){ |
| 88180 | | - assert( db->aDb[i].zName ); |
| 88181 | | - if( sqlite3StrICmp(db->aDb[i].zName,zDb)==0 ){ |
| 88211 | + assert( db->aDb[i].zDbSName ); |
| 88212 | + if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ |
| 88182 | 88213 | pSchema = db->aDb[i].pSchema; |
| 88183 | 88214 | break; |
| 88184 | 88215 | } |
| 88185 | 88216 | } |
| 88186 | 88217 | } |
| | @@ -94249,11 +94280,11 @@ |
| 94249 | 94280 | assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); |
| 94250 | 94281 | |
| 94251 | 94282 | pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); |
| 94252 | 94283 | if( !pTab ) goto exit_rename_table; |
| 94253 | 94284 | iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); |
| 94254 | | - zDb = db->aDb[iDb].zName; |
| 94285 | + zDb = db->aDb[iDb].zDbSName; |
| 94255 | 94286 | db->flags |= SQLITE_PreferBuiltin; |
| 94256 | 94287 | |
| 94257 | 94288 | /* Get a NULL terminated version of the new table name. */ |
| 94258 | 94289 | zName = sqlite3NameFromToken(db, pName); |
| 94259 | 94290 | if( !zName ) goto exit_rename_table; |
| | @@ -94447,11 +94478,11 @@ |
| 94447 | 94478 | pNew = pParse->pNewTable; |
| 94448 | 94479 | assert( pNew ); |
| 94449 | 94480 | |
| 94450 | 94481 | assert( sqlite3BtreeHoldsAllMutexes(db) ); |
| 94451 | 94482 | iDb = sqlite3SchemaToIndex(db, pNew->pSchema); |
| 94452 | | - zDb = db->aDb[iDb].zName; |
| 94483 | + zDb = db->aDb[iDb].zDbSName; |
| 94453 | 94484 | zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ |
| 94454 | 94485 | pCol = &pNew->aCol[pNew->nCol-1]; |
| 94455 | 94486 | pDflt = pCol->pDflt; |
| 94456 | 94487 | pTab = sqlite3FindTable(db, zTab, zDb); |
| 94457 | 94488 | assert( pTab ); |
| | @@ -94857,18 +94888,18 @@ |
| 94857 | 94888 | ** if they do already exist. |
| 94858 | 94889 | */ |
| 94859 | 94890 | for(i=0; i<ArraySize(aTable); i++){ |
| 94860 | 94891 | const char *zTab = aTable[i].zName; |
| 94861 | 94892 | Table *pStat; |
| 94862 | | - if( (pStat = sqlite3FindTable(db, zTab, pDb->zName))==0 ){ |
| 94893 | + if( (pStat = sqlite3FindTable(db, zTab, pDb->zDbSName))==0 ){ |
| 94863 | 94894 | if( aTable[i].zCols ){ |
| 94864 | 94895 | /* The sqlite_statN table does not exist. Create it. Note that a |
| 94865 | 94896 | ** side-effect of the CREATE TABLE statement is to leave the rootpage |
| 94866 | 94897 | ** of the new table in register pParse->regRoot. This is important |
| 94867 | 94898 | ** because the OpenWrite opcode below will be needing it. */ |
| 94868 | 94899 | sqlite3NestedParse(pParse, |
| 94869 | | - "CREATE TABLE %Q.%s(%s)", pDb->zName, zTab, aTable[i].zCols |
| 94900 | + "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols |
| 94870 | 94901 | ); |
| 94871 | 94902 | aRoot[i] = pParse->regRoot; |
| 94872 | 94903 | aCreateTbl[i] = OPFLAG_P2ISREG; |
| 94873 | 94904 | } |
| 94874 | 94905 | }else{ |
| | @@ -94879,11 +94910,11 @@ |
| 94879 | 94910 | aCreateTbl[i] = 0; |
| 94880 | 94911 | sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab); |
| 94881 | 94912 | if( zWhere ){ |
| 94882 | 94913 | sqlite3NestedParse(pParse, |
| 94883 | 94914 | "DELETE FROM %Q.%s WHERE %s=%Q", |
| 94884 | | - pDb->zName, zTab, zWhereType, zWhere |
| 94915 | + pDb->zDbSName, zTab, zWhereType, zWhere |
| 94885 | 94916 | ); |
| 94886 | 94917 | }else{ |
| 94887 | 94918 | /* The sqlite_stat[134] table already exists. Delete all rows. */ |
| 94888 | 94919 | sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb); |
| 94889 | 94920 | } |
| | @@ -95641,11 +95672,11 @@ |
| 95641 | 95672 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 95642 | 95673 | assert( iDb>=0 ); |
| 95643 | 95674 | assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 95644 | 95675 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 95645 | 95676 | if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, |
| 95646 | | - db->aDb[iDb].zName ) ){ |
| 95677 | + db->aDb[iDb].zDbSName ) ){ |
| 95647 | 95678 | return; |
| 95648 | 95679 | } |
| 95649 | 95680 | #endif |
| 95650 | 95681 | |
| 95651 | 95682 | /* Establish a read-lock on the table at the shared-cache level. |
| | @@ -96031,11 +96062,11 @@ |
| 96031 | 96062 | } |
| 96032 | 96063 | }else{ |
| 96033 | 96064 | /* Form 3: Analyze the fully qualified table name */ |
| 96034 | 96065 | iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); |
| 96035 | 96066 | if( iDb>=0 ){ |
| 96036 | | - zDb = db->aDb[iDb].zName; |
| 96067 | + zDb = db->aDb[iDb].zDbSName; |
| 96037 | 96068 | z = sqlite3NameFromToken(db, pTableName); |
| 96038 | 96069 | if( z ){ |
| 96039 | 96070 | if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ |
| 96040 | 96071 | analyzeTable(pParse, pIdx->pTable, pIdx); |
| 96041 | 96072 | }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){ |
| | @@ -96491,11 +96522,11 @@ |
| 96491 | 96522 | #endif |
| 96492 | 96523 | } |
| 96493 | 96524 | |
| 96494 | 96525 | /* Load new statistics out of the sqlite_stat1 table */ |
| 96495 | 96526 | sInfo.db = db; |
| 96496 | | - sInfo.zDatabase = db->aDb[iDb].zName; |
| 96527 | + sInfo.zDatabase = db->aDb[iDb].zDbSName; |
| 96497 | 96528 | if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){ |
| 96498 | 96529 | zSql = sqlite3MPrintf(db, |
| 96499 | 96530 | "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); |
| 96500 | 96531 | if( zSql==0 ){ |
| 96501 | 96532 | rc = SQLITE_NOMEM_BKPT; |
| | @@ -96634,11 +96665,11 @@ |
| 96634 | 96665 | if( !db->autoCommit ){ |
| 96635 | 96666 | zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction"); |
| 96636 | 96667 | goto attach_error; |
| 96637 | 96668 | } |
| 96638 | 96669 | for(i=0; i<db->nDb; i++){ |
| 96639 | | - char *z = db->aDb[i].zName; |
| 96670 | + char *z = db->aDb[i].zDbSName; |
| 96640 | 96671 | assert( z && zName ); |
| 96641 | 96672 | if( sqlite3StrICmp(z, zName)==0 ){ |
| 96642 | 96673 | zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); |
| 96643 | 96674 | goto attach_error; |
| 96644 | 96675 | } |
| | @@ -96699,12 +96730,12 @@ |
| 96699 | 96730 | PAGER_SYNCHRONOUS_FULL | (db->flags & PAGER_FLAGS_MASK)); |
| 96700 | 96731 | #endif |
| 96701 | 96732 | sqlite3BtreeLeave(aNew->pBt); |
| 96702 | 96733 | } |
| 96703 | 96734 | aNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; |
| 96704 | | - aNew->zName = sqlite3DbStrDup(db, zName); |
| 96705 | | - if( rc==SQLITE_OK && aNew->zName==0 ){ |
| 96735 | + aNew->zDbSName = sqlite3DbStrDup(db, zName); |
| 96736 | + if( rc==SQLITE_OK && aNew->zDbSName==0 ){ |
| 96706 | 96737 | rc = SQLITE_NOMEM_BKPT; |
| 96707 | 96738 | } |
| 96708 | 96739 | |
| 96709 | 96740 | |
| 96710 | 96741 | #ifdef SQLITE_HAS_CODEC |
| | @@ -96812,11 +96843,11 @@ |
| 96812 | 96843 | |
| 96813 | 96844 | if( zName==0 ) zName = ""; |
| 96814 | 96845 | for(i=0; i<db->nDb; i++){ |
| 96815 | 96846 | pDb = &db->aDb[i]; |
| 96816 | 96847 | if( pDb->pBt==0 ) continue; |
| 96817 | | - if( sqlite3StrICmp(pDb->zName, zName)==0 ) break; |
| 96848 | + if( sqlite3StrICmp(pDb->zDbSName, zName)==0 ) break; |
| 96818 | 96849 | } |
| 96819 | 96850 | |
| 96820 | 96851 | if( i>=db->nDb ){ |
| 96821 | 96852 | sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); |
| 96822 | 96853 | goto detach_error; |
| | @@ -96970,11 +97001,11 @@ |
| 96970 | 97001 | sqlite3 *db; |
| 96971 | 97002 | |
| 96972 | 97003 | db = pParse->db; |
| 96973 | 97004 | assert( db->nDb>iDb ); |
| 96974 | 97005 | pFix->pParse = pParse; |
| 96975 | | - pFix->zDb = db->aDb[iDb].zName; |
| 97006 | + pFix->zDb = db->aDb[iDb].zDbSName; |
| 96976 | 97007 | pFix->pSchema = db->aDb[iDb].pSchema; |
| 96977 | 97008 | pFix->zType = zType; |
| 96978 | 97009 | pFix->pName = pName; |
| 96979 | 97010 | pFix->bVarOnly = (iDb==1); |
| 96980 | 97011 | } |
| | @@ -97228,13 +97259,13 @@ |
| 97228 | 97259 | Parse *pParse, /* The parser context */ |
| 97229 | 97260 | const char *zTab, /* Table name */ |
| 97230 | 97261 | const char *zCol, /* Column name */ |
| 97231 | 97262 | int iDb /* Index of containing database. */ |
| 97232 | 97263 | ){ |
| 97233 | | - sqlite3 *db = pParse->db; /* Database handle */ |
| 97234 | | - char *zDb = db->aDb[iDb].zName; /* Name of attached database */ |
| 97235 | | - int rc; /* Auth callback return code */ |
| 97264 | + sqlite3 *db = pParse->db; /* Database handle */ |
| 97265 | + char *zDb = db->aDb[iDb].zDbSName; /* Schema name of attached database */ |
| 97266 | + int rc; /* Auth callback return code */ |
| 97236 | 97267 | |
| 97237 | 97268 | if( db->init.busy ) return SQLITE_OK; |
| 97238 | 97269 | rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext |
| 97239 | 97270 | #ifdef SQLITE_USER_AUTHENTICATION |
| 97240 | 97271 | ,db->auth.zAuthUser |
| | @@ -97703,14 +97734,15 @@ |
| 97703 | 97734 | return 0; |
| 97704 | 97735 | } |
| 97705 | 97736 | #endif |
| 97706 | 97737 | for(i=OMIT_TEMPDB; i<db->nDb; i++){ |
| 97707 | 97738 | int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ |
| 97708 | | - if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; |
| 97709 | | - assert( sqlite3SchemaMutexHeld(db, j, 0) ); |
| 97710 | | - p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); |
| 97711 | | - if( p ) break; |
| 97739 | + if( zDatabase==0 || sqlite3StrICmp(zDatabase, db->aDb[j].zDbSName)==0 ){ |
| 97740 | + assert( sqlite3SchemaMutexHeld(db, j, 0) ); |
| 97741 | + p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); |
| 97742 | + if( p ) break; |
| 97743 | + } |
| 97712 | 97744 | } |
| 97713 | 97745 | return p; |
| 97714 | 97746 | } |
| 97715 | 97747 | |
| 97716 | 97748 | /* |
| | @@ -97780,11 +97812,11 @@ |
| 97780 | 97812 | ){ |
| 97781 | 97813 | const char *zDb; |
| 97782 | 97814 | assert( p->pSchema==0 || p->zDatabase==0 ); |
| 97783 | 97815 | if( p->pSchema ){ |
| 97784 | 97816 | int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema); |
| 97785 | | - zDb = pParse->db->aDb[iDb].zName; |
| 97817 | + zDb = pParse->db->aDb[iDb].zDbSName; |
| 97786 | 97818 | }else{ |
| 97787 | 97819 | zDb = p->zDatabase; |
| 97788 | 97820 | } |
| 97789 | 97821 | return sqlite3LocateTable(pParse, flags, p->zName, zDb); |
| 97790 | 97822 | } |
| | @@ -97808,11 +97840,11 @@ |
| 97808 | 97840 | assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); |
| 97809 | 97841 | for(i=OMIT_TEMPDB; i<db->nDb; i++){ |
| 97810 | 97842 | int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ |
| 97811 | 97843 | Schema *pSchema = db->aDb[j].pSchema; |
| 97812 | 97844 | assert( pSchema ); |
| 97813 | | - if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue; |
| 97845 | + if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zDbSName) ) continue; |
| 97814 | 97846 | assert( sqlite3SchemaMutexHeld(db, j, 0) ); |
| 97815 | 97847 | p = sqlite3HashFind(&pSchema->idxHash, zName); |
| 97816 | 97848 | if( p ) break; |
| 97817 | 97849 | } |
| 97818 | 97850 | return p; |
| | @@ -97877,12 +97909,12 @@ |
| 97877 | 97909 | SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ |
| 97878 | 97910 | int i, j; |
| 97879 | 97911 | for(i=j=2; i<db->nDb; i++){ |
| 97880 | 97912 | struct Db *pDb = &db->aDb[i]; |
| 97881 | 97913 | if( pDb->pBt==0 ){ |
| 97882 | | - sqlite3DbFree(db, pDb->zName); |
| 97883 | | - pDb->zName = 0; |
| 97914 | + sqlite3DbFree(db, pDb->zDbSName); |
| 97915 | + pDb->zDbSName = 0; |
| 97884 | 97916 | continue; |
| 97885 | 97917 | } |
| 97886 | 97918 | if( j<i ){ |
| 97887 | 97919 | db->aDb[j] = db->aDb[i]; |
| 97888 | 97920 | } |
| | @@ -98098,11 +98130,11 @@ |
| 98098 | 98130 | SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ |
| 98099 | 98131 | int i = -1; /* Database number */ |
| 98100 | 98132 | if( zName ){ |
| 98101 | 98133 | Db *pDb; |
| 98102 | 98134 | for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ |
| 98103 | | - if( 0==sqlite3StrICmp(pDb->zName, zName) ) break; |
| 98135 | + if( 0==sqlite3StrICmp(pDb->zDbSName, zName) ) break; |
| 98104 | 98136 | } |
| 98105 | 98137 | } |
| 98106 | 98138 | return i; |
| 98107 | 98139 | } |
| 98108 | 98140 | |
| | @@ -98268,11 +98300,11 @@ |
| 98268 | 98300 | SQLITE_CREATE_TABLE, |
| 98269 | 98301 | SQLITE_CREATE_TEMP_TABLE, |
| 98270 | 98302 | SQLITE_CREATE_VIEW, |
| 98271 | 98303 | SQLITE_CREATE_TEMP_VIEW |
| 98272 | 98304 | }; |
| 98273 | | - char *zDb = db->aDb[iDb].zName; |
| 98305 | + char *zDb = db->aDb[iDb].zDbSName; |
| 98274 | 98306 | if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ |
| 98275 | 98307 | goto begin_table_error; |
| 98276 | 98308 | } |
| 98277 | 98309 | if( !isVirtual && sqlite3AuthCheck(pParse, (int)aCode[isTemp+2*isView], |
| 98278 | 98310 | zName, 0, zDb) ){ |
| | @@ -98287,11 +98319,11 @@ |
| 98287 | 98319 | ** to an sqlite3_declare_vtab() call. In that case only the column names |
| 98288 | 98320 | ** and types will be used, so there is no need to test for namespace |
| 98289 | 98321 | ** collisions. |
| 98290 | 98322 | */ |
| 98291 | 98323 | if( !IN_DECLARE_VTAB ){ |
| 98292 | | - char *zDb = db->aDb[iDb].zName; |
| 98324 | + char *zDb = db->aDb[iDb].zDbSName; |
| 98293 | 98325 | if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ |
| 98294 | 98326 | goto begin_table_error; |
| 98295 | 98327 | } |
| 98296 | 98328 | pTable = sqlite3FindTable(db, zName, zDb); |
| 98297 | 98329 | if( pTable ){ |
| | @@ -99380,11 +99412,11 @@ |
| 99380 | 99412 | */ |
| 99381 | 99413 | sqlite3NestedParse(pParse, |
| 99382 | 99414 | "UPDATE %Q.%s " |
| 99383 | 99415 | "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " |
| 99384 | 99416 | "WHERE rowid=#%d", |
| 99385 | | - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), |
| 99417 | + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), |
| 99386 | 99418 | zType, |
| 99387 | 99419 | p->zName, |
| 99388 | 99420 | p->zName, |
| 99389 | 99421 | pParse->regRoot, |
| 99390 | 99422 | zStmt, |
| | @@ -99401,11 +99433,11 @@ |
| 99401 | 99433 | Db *pDb = &db->aDb[iDb]; |
| 99402 | 99434 | assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 99403 | 99435 | if( pDb->pSchema->pSeqTab==0 ){ |
| 99404 | 99436 | sqlite3NestedParse(pParse, |
| 99405 | 99437 | "CREATE TABLE %Q.sqlite_sequence(name,seq)", |
| 99406 | | - pDb->zName |
| 99438 | + pDb->zDbSName |
| 99407 | 99439 | ); |
| 99408 | 99440 | } |
| 99409 | 99441 | } |
| 99410 | 99442 | #endif |
| 99411 | 99443 | |
| | @@ -99715,11 +99747,11 @@ |
| 99715 | 99747 | ** is in register NNN. See grammar rules associated with the TK_REGISTER |
| 99716 | 99748 | ** token for additional information. |
| 99717 | 99749 | */ |
| 99718 | 99750 | sqlite3NestedParse(pParse, |
| 99719 | 99751 | "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", |
| 99720 | | - pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable, r1, r1); |
| 99752 | + pParse->db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), iTable, r1, r1); |
| 99721 | 99753 | #endif |
| 99722 | 99754 | sqlite3ReleaseTempReg(pParse, r1); |
| 99723 | 99755 | } |
| 99724 | 99756 | |
| 99725 | 99757 | /* |
| | @@ -99791,11 +99823,11 @@ |
| 99791 | 99823 | int iDb, /* The database number */ |
| 99792 | 99824 | const char *zType, /* "idx" or "tbl" */ |
| 99793 | 99825 | const char *zName /* Name of index or table */ |
| 99794 | 99826 | ){ |
| 99795 | 99827 | int i; |
| 99796 | | - const char *zDbName = pParse->db->aDb[iDb].zName; |
| 99828 | + const char *zDbName = pParse->db->aDb[iDb].zDbSName; |
| 99797 | 99829 | for(i=1; i<=4; i++){ |
| 99798 | 99830 | char zTab[24]; |
| 99799 | 99831 | sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i); |
| 99800 | 99832 | if( sqlite3FindTable(pParse->db, zTab, zDbName) ){ |
| 99801 | 99833 | sqlite3NestedParse(pParse, |
| | @@ -99844,11 +99876,11 @@ |
| 99844 | 99876 | ** move as a result of the drop (can happen in auto-vacuum mode). |
| 99845 | 99877 | */ |
| 99846 | 99878 | if( pTab->tabFlags & TF_Autoincrement ){ |
| 99847 | 99879 | sqlite3NestedParse(pParse, |
| 99848 | 99880 | "DELETE FROM %Q.sqlite_sequence WHERE name=%Q", |
| 99849 | | - pDb->zName, pTab->zName |
| 99881 | + pDb->zDbSName, pTab->zName |
| 99850 | 99882 | ); |
| 99851 | 99883 | } |
| 99852 | 99884 | #endif |
| 99853 | 99885 | |
| 99854 | 99886 | /* Drop all SQLITE_MASTER table and index entries that refer to the |
| | @@ -99858,11 +99890,11 @@ |
| 99858 | 99890 | ** created in the temp database that refers to a table in another |
| 99859 | 99891 | ** database. |
| 99860 | 99892 | */ |
| 99861 | 99893 | sqlite3NestedParse(pParse, |
| 99862 | 99894 | "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", |
| 99863 | | - pDb->zName, SCHEMA_TABLE(iDb), pTab->zName); |
| 99895 | + pDb->zDbSName, SCHEMA_TABLE(iDb), pTab->zName); |
| 99864 | 99896 | if( !isView && !IsVirtual(pTab) ){ |
| 99865 | 99897 | destroyTable(pParse, pTab); |
| 99866 | 99898 | } |
| 99867 | 99899 | |
| 99868 | 99900 | /* Remove the table entry from SQLite's internal schema and modify |
| | @@ -99912,11 +99944,11 @@ |
| 99912 | 99944 | } |
| 99913 | 99945 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 99914 | 99946 | { |
| 99915 | 99947 | int code; |
| 99916 | 99948 | const char *zTab = SCHEMA_TABLE(iDb); |
| 99917 | | - const char *zDb = db->aDb[iDb].zName; |
| 99949 | + const char *zDb = db->aDb[iDb].zDbSName; |
| 99918 | 99950 | const char *zArg2 = 0; |
| 99919 | 99951 | if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ |
| 99920 | 99952 | goto exit_drop_table; |
| 99921 | 99953 | } |
| 99922 | 99954 | if( isView ){ |
| | @@ -100153,11 +100185,11 @@ |
| 100153 | 100185 | sqlite3 *db = pParse->db; /* The database connection */ |
| 100154 | 100186 | int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); |
| 100155 | 100187 | |
| 100156 | 100188 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 100157 | 100189 | if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, |
| 100158 | | - db->aDb[iDb].zName ) ){ |
| 100190 | + db->aDb[iDb].zDbSName ) ){ |
| 100159 | 100191 | return; |
| 100160 | 100192 | } |
| 100161 | 100193 | #endif |
| 100162 | 100194 | |
| 100163 | 100195 | /* Require a write-lock on the table to perform this operation */ |
| | @@ -100405,11 +100437,11 @@ |
| 100405 | 100437 | if( sqlite3FindTable(db, zName, 0)!=0 ){ |
| 100406 | 100438 | sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); |
| 100407 | 100439 | goto exit_create_index; |
| 100408 | 100440 | } |
| 100409 | 100441 | } |
| 100410 | | - if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){ |
| 100442 | + if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){ |
| 100411 | 100443 | if( !ifNotExist ){ |
| 100412 | 100444 | sqlite3ErrorMsg(pParse, "index %s already exists", zName); |
| 100413 | 100445 | }else{ |
| 100414 | 100446 | assert( !db->init.busy ); |
| 100415 | 100447 | sqlite3CodeVerifySchema(pParse, iDb); |
| | @@ -100435,11 +100467,11 @@ |
| 100435 | 100467 | |
| 100436 | 100468 | /* Check for authorization to create an index. |
| 100437 | 100469 | */ |
| 100438 | 100470 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 100439 | 100471 | { |
| 100440 | | - const char *zDb = pDb->zName; |
| 100472 | + const char *zDb = pDb->zDbSName; |
| 100441 | 100473 | if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ |
| 100442 | 100474 | goto exit_create_index; |
| 100443 | 100475 | } |
| 100444 | 100476 | i = SQLITE_CREATE_INDEX; |
| 100445 | 100477 | if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX; |
| | @@ -100750,11 +100782,11 @@ |
| 100750 | 100782 | |
| 100751 | 100783 | /* Add an entry in sqlite_master for this index |
| 100752 | 100784 | */ |
| 100753 | 100785 | sqlite3NestedParse(pParse, |
| 100754 | 100786 | "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", |
| 100755 | | - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), |
| 100787 | + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), |
| 100756 | 100788 | pIndex->zName, |
| 100757 | 100789 | pTab->zName, |
| 100758 | 100790 | iMem, |
| 100759 | 100791 | zStmt |
| 100760 | 100792 | ); |
| | @@ -100884,11 +100916,11 @@ |
| 100884 | 100916 | iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); |
| 100885 | 100917 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 100886 | 100918 | { |
| 100887 | 100919 | int code = SQLITE_DROP_INDEX; |
| 100888 | 100920 | Table *pTab = pIndex->pTable; |
| 100889 | | - const char *zDb = db->aDb[iDb].zName; |
| 100921 | + const char *zDb = db->aDb[iDb].zDbSName; |
| 100890 | 100922 | const char *zTab = SCHEMA_TABLE(iDb); |
| 100891 | 100923 | if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ |
| 100892 | 100924 | goto exit_drop_index; |
| 100893 | 100925 | } |
| 100894 | 100926 | if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX; |
| | @@ -100902,11 +100934,11 @@ |
| 100902 | 100934 | v = sqlite3GetVdbe(pParse); |
| 100903 | 100935 | if( v ){ |
| 100904 | 100936 | sqlite3BeginWriteOperation(pParse, 1, iDb); |
| 100905 | 100937 | sqlite3NestedParse(pParse, |
| 100906 | 100938 | "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", |
| 100907 | | - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pIndex->zName |
| 100939 | + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), pIndex->zName |
| 100908 | 100940 | ); |
| 100909 | 100941 | sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); |
| 100910 | 100942 | sqlite3ChangeCookie(pParse, iDb); |
| 100911 | 100943 | destroyRootPage(pParse, pIndex->tnum, iDb); |
| 100912 | 100944 | sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0); |
| | @@ -101447,11 +101479,11 @@ |
| 101447 | 101479 | SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){ |
| 101448 | 101480 | sqlite3 *db = pParse->db; |
| 101449 | 101481 | int i; |
| 101450 | 101482 | for(i=0; i<db->nDb; i++){ |
| 101451 | 101483 | Db *pDb = &db->aDb[i]; |
| 101452 | | - if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zName)) ){ |
| 101484 | + if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zDbSName)) ){ |
| 101453 | 101485 | sqlite3CodeVerifySchema(pParse, i); |
| 101454 | 101486 | } |
| 101455 | 101487 | } |
| 101456 | 101488 | } |
| 101457 | 101489 | |
| | @@ -101694,11 +101726,11 @@ |
| 101694 | 101726 | } |
| 101695 | 101727 | iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); |
| 101696 | 101728 | if( iDb<0 ) return; |
| 101697 | 101729 | z = sqlite3NameFromToken(db, pObjName); |
| 101698 | 101730 | if( z==0 ) return; |
| 101699 | | - zDb = db->aDb[iDb].zName; |
| 101731 | + zDb = db->aDb[iDb].zDbSName; |
| 101700 | 101732 | pTab = sqlite3FindTable(db, z, zDb); |
| 101701 | 101733 | if( pTab ){ |
| 101702 | 101734 | reindexTable(pParse, pTab, 0); |
| 101703 | 101735 | sqlite3DbFree(db, z); |
| 101704 | 101736 | return; |
| | @@ -102408,11 +102440,11 @@ |
| 102408 | 102440 | pWhere = sqlite3ExprDup(db, pWhere, 0); |
| 102409 | 102441 | pFrom = sqlite3SrcListAppend(db, 0, 0, 0); |
| 102410 | 102442 | if( pFrom ){ |
| 102411 | 102443 | assert( pFrom->nSrc==1 ); |
| 102412 | 102444 | pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); |
| 102413 | | - pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName); |
| 102445 | + pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); |
| 102414 | 102446 | assert( pFrom->a[0].pOn==0 ); |
| 102415 | 102447 | assert( pFrom->a[0].pUsing==0 ); |
| 102416 | 102448 | } |
| 102417 | 102449 | pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, |
| 102418 | 102450 | SF_IncludeHidden, 0, 0); |
| | @@ -102595,11 +102627,11 @@ |
| 102595 | 102627 | if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ |
| 102596 | 102628 | goto delete_from_cleanup; |
| 102597 | 102629 | } |
| 102598 | 102630 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 102599 | 102631 | assert( iDb<db->nDb ); |
| 102600 | | - zDb = db->aDb[iDb].zName; |
| 102632 | + zDb = db->aDb[iDb].zDbSName; |
| 102601 | 102633 | rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb); |
| 102602 | 102634 | assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE ); |
| 102603 | 102635 | if( rcauth==SQLITE_DENY ){ |
| 102604 | 102636 | goto delete_from_cleanup; |
| 102605 | 102637 | } |
| | @@ -105927,11 +105959,11 @@ |
| 105927 | 105959 | |
| 105928 | 105960 | /* If foreign-keys are disabled, this function is a no-op. */ |
| 105929 | 105961 | if( (db->flags&SQLITE_ForeignKeys)==0 ) return; |
| 105930 | 105962 | |
| 105931 | 105963 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 105932 | | - zDb = db->aDb[iDb].zName; |
| 105964 | + zDb = db->aDb[iDb].zDbSName; |
| 105933 | 105965 | |
| 105934 | 105966 | /* Loop through all the foreign key constraints for which pTab is the |
| 105935 | 105967 | ** child table (the table that the foreign key definition is part of). */ |
| 105936 | 105968 | for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ |
| 105937 | 105969 | Table *pTo; /* Parent table of foreign key pFKey */ |
| | @@ -107014,11 +107046,11 @@ |
| 107014 | 107046 | goto insert_cleanup; |
| 107015 | 107047 | } |
| 107016 | 107048 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 107017 | 107049 | assert( iDb<db->nDb ); |
| 107018 | 107050 | pDb = &db->aDb[iDb]; |
| 107019 | | - zDb = pDb->zName; |
| 107051 | + zDb = pDb->zDbSName; |
| 107020 | 107052 | if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){ |
| 107021 | 107053 | goto insert_cleanup; |
| 107022 | 107054 | } |
| 107023 | 107055 | withoutRowid = !HasRowid(pTab); |
| 107024 | 107056 | |
| | @@ -110972,11 +111004,11 @@ |
| 110972 | 111004 | }else{ |
| 110973 | 111005 | zRight = sqlite3NameFromToken(db, pValue); |
| 110974 | 111006 | } |
| 110975 | 111007 | |
| 110976 | 111008 | assert( pId2 ); |
| 110977 | | - zDb = pId2->n>0 ? pDb->zName : 0; |
| 111009 | + zDb = pId2->n>0 ? pDb->zDbSName : 0; |
| 110978 | 111010 | if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ |
| 110979 | 111011 | goto pragma_out; |
| 110980 | 111012 | } |
| 110981 | 111013 | |
| 110982 | 111014 | /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS |
| | @@ -111825,14 +111857,14 @@ |
| 111825 | 111857 | int i; |
| 111826 | 111858 | pParse->nMem = 3; |
| 111827 | 111859 | setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); |
| 111828 | 111860 | for(i=0; i<db->nDb; i++){ |
| 111829 | 111861 | if( db->aDb[i].pBt==0 ) continue; |
| 111830 | | - assert( db->aDb[i].zName!=0 ); |
| 111862 | + assert( db->aDb[i].zDbSName!=0 ); |
| 111831 | 111863 | sqlite3VdbeMultiLoad(v, 1, "iss", |
| 111832 | 111864 | i, |
| 111833 | | - db->aDb[i].zName, |
| 111865 | + db->aDb[i].zDbSName, |
| 111834 | 111866 | sqlite3BtreeGetFilename(db->aDb[i].pBt)); |
| 111835 | 111867 | sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); |
| 111836 | 111868 | } |
| 111837 | 111869 | } |
| 111838 | 111870 | break; |
| | @@ -112117,11 +112149,11 @@ |
| 112117 | 112149 | /* Do the b-tree integrity checks */ |
| 112118 | 112150 | sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); |
| 112119 | 112151 | sqlite3VdbeChangeP5(v, (u8)i); |
| 112120 | 112152 | addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); |
| 112121 | 112153 | sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, |
| 112122 | | - sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName), |
| 112154 | + sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName), |
| 112123 | 112155 | P4_DYNAMIC); |
| 112124 | 112156 | sqlite3VdbeAddOp3(v, OP_Move, 2, 4, 1); |
| 112125 | 112157 | sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2); |
| 112126 | 112158 | sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1); |
| 112127 | 112159 | sqlite3VdbeJumpHere(v, addr); |
| | @@ -112556,19 +112588,19 @@ |
| 112556 | 112588 | pParse->nMem = 2; |
| 112557 | 112589 | for(i=0; i<db->nDb; i++){ |
| 112558 | 112590 | Btree *pBt; |
| 112559 | 112591 | const char *zState = "unknown"; |
| 112560 | 112592 | int j; |
| 112561 | | - if( db->aDb[i].zName==0 ) continue; |
| 112593 | + if( db->aDb[i].zDbSName==0 ) continue; |
| 112562 | 112594 | pBt = db->aDb[i].pBt; |
| 112563 | 112595 | if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ |
| 112564 | 112596 | zState = "closed"; |
| 112565 | | - }else if( sqlite3_file_control(db, i ? db->aDb[i].zName : 0, |
| 112597 | + }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, |
| 112566 | 112598 | SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ |
| 112567 | 112599 | zState = azLockName[j]; |
| 112568 | 112600 | } |
| 112569 | | - sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zName, zState); |
| 112601 | + sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); |
| 112570 | 112602 | sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); |
| 112571 | 112603 | } |
| 112572 | 112604 | break; |
| 112573 | 112605 | } |
| 112574 | 112606 | #endif |
| | @@ -112734,11 +112766,11 @@ |
| 112734 | 112766 | ** constraint for a CREATE TABLE. The index should have already |
| 112735 | 112767 | ** been created when we processed the CREATE TABLE. All we have |
| 112736 | 112768 | ** to do here is record the root page number for that index. |
| 112737 | 112769 | */ |
| 112738 | 112770 | Index *pIndex; |
| 112739 | | - pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zName); |
| 112771 | + pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); |
| 112740 | 112772 | if( pIndex==0 ){ |
| 112741 | 112773 | /* This can occur if there exists an index on a TEMP table which |
| 112742 | 112774 | ** has the same name as another index on a permanent index. Since |
| 112743 | 112775 | ** the permanent table is hidden by the TEMP table, we can also |
| 112744 | 112776 | ** safely ignore the index on the permanent table. |
| | @@ -112913,11 +112945,11 @@ |
| 112913 | 112945 | assert( db->init.busy ); |
| 112914 | 112946 | { |
| 112915 | 112947 | char *zSql; |
| 112916 | 112948 | zSql = sqlite3MPrintf(db, |
| 112917 | 112949 | "SELECT name, rootpage, sql FROM \"%w\".%s ORDER BY rowid", |
| 112918 | | - db->aDb[iDb].zName, zMasterName); |
| 112950 | + db->aDb[iDb].zDbSName, zMasterName); |
| 112919 | 112951 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 112920 | 112952 | { |
| 112921 | 112953 | sqlite3_xauth xAuth; |
| 112922 | 112954 | xAuth = db->xAuth; |
| 112923 | 112955 | db->xAuth = 0; |
| | @@ -113188,11 +113220,11 @@ |
| 113188 | 113220 | Btree *pBt = db->aDb[i].pBt; |
| 113189 | 113221 | if( pBt ){ |
| 113190 | 113222 | assert( sqlite3BtreeHoldsMutex(pBt) ); |
| 113191 | 113223 | rc = sqlite3BtreeSchemaLocked(pBt); |
| 113192 | 113224 | if( rc ){ |
| 113193 | | - const char *zDb = db->aDb[i].zName; |
| 113225 | + const char *zDb = db->aDb[i].zDbSName; |
| 113194 | 113226 | sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); |
| 113195 | 113227 | testcase( db->flags & SQLITE_ReadUncommitted ); |
| 113196 | 113228 | goto end_prepare; |
| 113197 | 113229 | } |
| 113198 | 113230 | } |
| | @@ -114944,11 +114976,11 @@ |
| 114944 | 114976 | estWidth = pTab->aCol[iCol].szEst; |
| 114945 | 114977 | } |
| 114946 | 114978 | zOrigTab = pTab->zName; |
| 114947 | 114979 | if( pNC->pParse ){ |
| 114948 | 114980 | int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); |
| 114949 | | - zOrigDb = pNC->pParse->db->aDb[iDb].zName; |
| 114981 | + zOrigDb = pNC->pParse->db->aDb[iDb].zDbSName; |
| 114950 | 114982 | } |
| 114951 | 114983 | #else |
| 114952 | 114984 | if( iCol<0 ){ |
| 114953 | 114985 | zType = "INTEGER"; |
| 114954 | 114986 | }else{ |
| | @@ -117900,11 +117932,11 @@ |
| 117900 | 117932 | pSub = 0; |
| 117901 | 117933 | if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ |
| 117902 | 117934 | continue; |
| 117903 | 117935 | } |
| 117904 | 117936 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 117905 | | - zSchemaName = iDb>=0 ? db->aDb[iDb].zName : "*"; |
| 117937 | + zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; |
| 117906 | 117938 | } |
| 117907 | 117939 | for(j=0; j<pTab->nCol; j++){ |
| 117908 | 117940 | char *zName = pTab->aCol[j].zName; |
| 117909 | 117941 | char *zColname; /* The computed column name */ |
| 117910 | 117942 | char *zToFree; /* Malloced string that needs to be freed */ |
| | @@ -119612,12 +119644,12 @@ |
| 119612 | 119644 | iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 119613 | 119645 | |
| 119614 | 119646 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 119615 | 119647 | { |
| 119616 | 119648 | int code = SQLITE_CREATE_TRIGGER; |
| 119617 | | - const char *zDb = db->aDb[iTabDb].zName; |
| 119618 | | - const char *zDbTrig = isTemp ? db->aDb[1].zName : zDb; |
| 119649 | + const char *zDb = db->aDb[iTabDb].zDbSName; |
| 119650 | + const char *zDbTrig = isTemp ? db->aDb[1].zDbSName : zDb; |
| 119619 | 119651 | if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; |
| 119620 | 119652 | if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){ |
| 119621 | 119653 | goto trigger_cleanup; |
| 119622 | 119654 | } |
| 119623 | 119655 | if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb),0,zDb)){ |
| | @@ -119707,11 +119739,11 @@ |
| 119707 | 119739 | if( v==0 ) goto triggerfinish_cleanup; |
| 119708 | 119740 | sqlite3BeginWriteOperation(pParse, 0, iDb); |
| 119709 | 119741 | z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); |
| 119710 | 119742 | sqlite3NestedParse(pParse, |
| 119711 | 119743 | "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", |
| 119712 | | - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName, |
| 119744 | + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), zName, |
| 119713 | 119745 | pTrig->table, z); |
| 119714 | 119746 | sqlite3DbFree(db, z); |
| 119715 | 119747 | sqlite3ChangeCookie(pParse, iDb); |
| 119716 | 119748 | sqlite3VdbeAddParseSchemaOp(v, iDb, |
| 119717 | 119749 | sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName)); |
| | @@ -119896,11 +119928,11 @@ |
| 119896 | 119928 | zDb = pName->a[0].zDatabase; |
| 119897 | 119929 | zName = pName->a[0].zName; |
| 119898 | 119930 | assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); |
| 119899 | 119931 | for(i=OMIT_TEMPDB; i<db->nDb; i++){ |
| 119900 | 119932 | int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ |
| 119901 | | - if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue; |
| 119933 | + if( zDb && sqlite3StrICmp(db->aDb[j].zDbSName, zDb) ) continue; |
| 119902 | 119934 | assert( sqlite3SchemaMutexHeld(db, j, 0) ); |
| 119903 | 119935 | pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName); |
| 119904 | 119936 | if( pTrigger ) break; |
| 119905 | 119937 | } |
| 119906 | 119938 | if( !pTrigger ){ |
| | @@ -119942,11 +119974,11 @@ |
| 119942 | 119974 | assert( pTable ); |
| 119943 | 119975 | assert( pTable->pSchema==pTrigger->pSchema || iDb==1 ); |
| 119944 | 119976 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 119945 | 119977 | { |
| 119946 | 119978 | int code = SQLITE_DROP_TRIGGER; |
| 119947 | | - const char *zDb = db->aDb[iDb].zName; |
| 119979 | + const char *zDb = db->aDb[iDb].zDbSName; |
| 119948 | 119980 | const char *zTab = SCHEMA_TABLE(iDb); |
| 119949 | 119981 | if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; |
| 119950 | 119982 | if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || |
| 119951 | 119983 | sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ |
| 119952 | 119984 | return; |
| | @@ -119958,11 +119990,11 @@ |
| 119958 | 119990 | */ |
| 119959 | 119991 | assert( pTable!=0 ); |
| 119960 | 119992 | if( (v = sqlite3GetVdbe(pParse))!=0 ){ |
| 119961 | 119993 | sqlite3NestedParse(pParse, |
| 119962 | 119994 | "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", |
| 119963 | | - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pTrigger->zName |
| 119995 | + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), pTrigger->zName |
| 119964 | 119996 | ); |
| 119965 | 119997 | sqlite3ChangeCookie(pParse, iDb); |
| 119966 | 119998 | sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); |
| 119967 | 119999 | } |
| 119968 | 120000 | } |
| | @@ -120061,12 +120093,14 @@ |
| 120061 | 120093 | if( pSrc ){ |
| 120062 | 120094 | assert( pSrc->nSrc>0 ); |
| 120063 | 120095 | pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); |
| 120064 | 120096 | iDb = sqlite3SchemaToIndex(db, pStep->pTrig->pSchema); |
| 120065 | 120097 | if( iDb==0 || iDb>=2 ){ |
| 120098 | + const char *zDb; |
| 120066 | 120099 | assert( iDb<db->nDb ); |
| 120067 | | - pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName); |
| 120100 | + zDb = db->aDb[iDb].zDbSName; |
| 120101 | + pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, zDb); |
| 120068 | 120102 | } |
| 120069 | 120103 | } |
| 120070 | 120104 | return pSrc; |
| 120071 | 120105 | } |
| 120072 | 120106 | |
| | @@ -120749,11 +120783,11 @@ |
| 120749 | 120783 | #ifndef SQLITE_OMIT_AUTHORIZATION |
| 120750 | 120784 | { |
| 120751 | 120785 | int rc; |
| 120752 | 120786 | rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, |
| 120753 | 120787 | j<0 ? "ROWID" : pTab->aCol[j].zName, |
| 120754 | | - db->aDb[iDb].zName); |
| 120788 | + db->aDb[iDb].zDbSName); |
| 120755 | 120789 | if( rc==SQLITE_DENY ){ |
| 120756 | 120790 | goto update_cleanup; |
| 120757 | 120791 | }else if( rc==SQLITE_IGNORE ){ |
| 120758 | 120792 | aXRef[j] = -1; |
| 120759 | 120793 | } |
| | @@ -121506,11 +121540,11 @@ |
| 121506 | 121540 | zSql = "ATTACH '' AS vacuum_db;"; |
| 121507 | 121541 | } |
| 121508 | 121542 | rc = execSql(db, pzErrMsg, zSql); |
| 121509 | 121543 | if( db->nDb>nDb ){ |
| 121510 | 121544 | pDb = &db->aDb[db->nDb-1]; |
| 121511 | | - assert( strcmp(pDb->zName,"vacuum_db")==0 ); |
| 121545 | + assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); |
| 121512 | 121546 | } |
| 121513 | 121547 | if( rc!=SQLITE_OK ) goto end_of_vacuum; |
| 121514 | 121548 | pTemp = db->aDb[db->nDb-1].pBt; |
| 121515 | 121549 | |
| 121516 | 121550 | /* The call to execSql() to attach the temp database has left the file |
| | @@ -122055,11 +122089,11 @@ |
| 122055 | 122089 | ** sqlite_master table, has already been made by sqlite3StartTable(). |
| 122056 | 122090 | ** The second call, to obtain permission to create the table, is made now. |
| 122057 | 122091 | */ |
| 122058 | 122092 | if( pTable->azModuleArg ){ |
| 122059 | 122093 | sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, |
| 122060 | | - pTable->azModuleArg[0], pParse->db->aDb[iDb].zName); |
| 122094 | + pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); |
| 122061 | 122095 | } |
| 122062 | 122096 | #endif |
| 122063 | 122097 | } |
| 122064 | 122098 | |
| 122065 | 122099 | /* |
| | @@ -122119,11 +122153,11 @@ |
| 122119 | 122153 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 122120 | 122154 | sqlite3NestedParse(pParse, |
| 122121 | 122155 | "UPDATE %Q.%s " |
| 122122 | 122156 | "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " |
| 122123 | 122157 | "WHERE rowid=#%d", |
| 122124 | | - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), |
| 122158 | + db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), |
| 122125 | 122159 | pTab->zName, |
| 122126 | 122160 | pTab->zName, |
| 122127 | 122161 | zStmt, |
| 122128 | 122162 | pParse->regRowid |
| 122129 | 122163 | ); |
| | @@ -122229,11 +122263,11 @@ |
| 122229 | 122263 | } |
| 122230 | 122264 | pVTable->db = db; |
| 122231 | 122265 | pVTable->pMod = pMod; |
| 122232 | 122266 | |
| 122233 | 122267 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 122234 | | - pTab->azModuleArg[1] = db->aDb[iDb].zName; |
| 122268 | + pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; |
| 122235 | 122269 | |
| 122236 | 122270 | /* Invoke the virtual table constructor */ |
| 122237 | 122271 | assert( &db->pVtabCtx ); |
| 122238 | 122272 | assert( xConstruct ); |
| 122239 | 122273 | sCtx.pTab = pTab; |
| | @@ -122393,11 +122427,11 @@ |
| 122393 | 122427 | int rc = SQLITE_OK; |
| 122394 | 122428 | Table *pTab; |
| 122395 | 122429 | Module *pMod; |
| 122396 | 122430 | const char *zMod; |
| 122397 | 122431 | |
| 122398 | | - pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName); |
| 122432 | + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); |
| 122399 | 122433 | assert( pTab && (pTab->tabFlags & TF_Virtual)!=0 && !pTab->pVTable ); |
| 122400 | 122434 | |
| 122401 | 122435 | /* Locate the required virtual table module */ |
| 122402 | 122436 | zMod = pTab->azModuleArg[0]; |
| 122403 | 122437 | pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); |
| | @@ -122517,11 +122551,11 @@ |
| 122517 | 122551 | */ |
| 122518 | 122552 | SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ |
| 122519 | 122553 | int rc = SQLITE_OK; |
| 122520 | 122554 | Table *pTab; |
| 122521 | 122555 | |
| 122522 | | - pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName); |
| 122556 | + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); |
| 122523 | 122557 | if( pTab!=0 && ALWAYS(pTab->pVTable!=0) ){ |
| 122524 | 122558 | VTable *p; |
| 122525 | 122559 | int (*xDestroy)(sqlite3_vtab *); |
| 122526 | 122560 | for(p=pTab->pVTable; p; p=p->pNext){ |
| 122527 | 122561 | assert( p->pVtab ); |
| | @@ -125630,11 +125664,11 @@ |
| 125630 | 125664 | */ |
| 125631 | 125665 | static int isMatchOfColumn( |
| 125632 | 125666 | Expr *pExpr, /* Test this expression */ |
| 125633 | 125667 | unsigned char *peOp2 /* OUT: 0 for MATCH, or else an op2 value */ |
| 125634 | 125668 | ){ |
| 125635 | | - struct Op2 { |
| 125669 | + static const struct Op2 { |
| 125636 | 125670 | const char *zOp; |
| 125637 | 125671 | unsigned char eOp2; |
| 125638 | 125672 | } aOp[] = { |
| 125639 | 125673 | { "match", SQLITE_INDEX_CONSTRAINT_MATCH }, |
| 125640 | 125674 | { "glob", SQLITE_INDEX_CONSTRAINT_GLOB }, |
| | @@ -126615,17 +126649,18 @@ |
| 126615 | 126649 | ** These routines walk (recursively) an expression tree and generate |
| 126616 | 126650 | ** a bitmask indicating which tables are used in that expression |
| 126617 | 126651 | ** tree. |
| 126618 | 126652 | */ |
| 126619 | 126653 | SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ |
| 126620 | | - Bitmask mask = 0; |
| 126654 | + Bitmask mask; |
| 126621 | 126655 | if( p==0 ) return 0; |
| 126622 | 126656 | if( p->op==TK_COLUMN ){ |
| 126623 | 126657 | mask = sqlite3WhereGetMask(pMaskSet, p->iTable); |
| 126624 | 126658 | return mask; |
| 126625 | 126659 | } |
| 126626 | | - mask = sqlite3WhereExprUsage(pMaskSet, p->pRight); |
| 126660 | + assert( !ExprHasProperty(p, EP_TokenOnly) ); |
| 126661 | + mask = p->pRight ? sqlite3WhereExprUsage(pMaskSet, p->pRight) : 0; |
| 126627 | 126662 | if( p->pLeft ) mask |= sqlite3WhereExprUsage(pMaskSet, p->pLeft); |
| 126628 | 126663 | if( ExprHasProperty(p, EP_xIsSelect) ){ |
| 126629 | 126664 | mask |= exprSelectUsage(pMaskSet, p->x.pSelect); |
| 126630 | 126665 | }else if( p->x.pList ){ |
| 126631 | 126666 | mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); |
| | @@ -131868,29 +131903,33 @@ |
| 131868 | 131903 | ** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then |
| 131869 | 131904 | ** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. |
| 131870 | 131905 | ** |
| 131871 | 131906 | ** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE |
| 131872 | 131907 | ** and YY_MAX_REDUCE |
| 131873 | | - |
| 131908 | +** |
| 131874 | 131909 | ** N == YY_ERROR_ACTION A syntax error has occurred. |
| 131875 | 131910 | ** |
| 131876 | 131911 | ** N == YY_ACCEPT_ACTION The parser accepts its input. |
| 131877 | 131912 | ** |
| 131878 | 131913 | ** N == YY_NO_ACTION No such action. Denotes unused |
| 131879 | 131914 | ** slots in the yy_action[] table. |
| 131880 | 131915 | ** |
| 131881 | 131916 | ** The action table is constructed as a single large table named yy_action[]. |
| 131882 | | -** Given state S and lookahead X, the action is computed as |
| 131883 | | -** |
| 131884 | | -** yy_action[ yy_shift_ofst[S] + X ] |
| 131885 | | -** |
| 131886 | | -** If the index value yy_shift_ofst[S]+X is out of range or if the value |
| 131887 | | -** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] |
| 131888 | | -** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table |
| 131889 | | -** and that yy_default[S] should be used instead. |
| 131890 | | -** |
| 131891 | | -** The formula above is for computing the action when the lookahead is |
| 131917 | +** Given state S and lookahead X, the action is computed as either: |
| 131918 | +** |
| 131919 | +** (A) N = yy_action[ yy_shift_ofst[S] + X ] |
| 131920 | +** (B) N = yy_default[S] |
| 131921 | +** |
| 131922 | +** The (A) formula is preferred. The B formula is used instead if: |
| 131923 | +** (1) The yy_shift_ofst[S]+X value is out of range, or |
| 131924 | +** (2) yy_lookahead[yy_shift_ofst[S]+X] is not equal to X, or |
| 131925 | +** (3) yy_shift_ofst[S] equal YY_SHIFT_USE_DFLT. |
| 131926 | +** (Implementation note: YY_SHIFT_USE_DFLT is chosen so that |
| 131927 | +** YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. |
| 131928 | +** Hence only tests (1) and (2) need to be evaluated.) |
| 131929 | +** |
| 131930 | +** The formulas above are for computing the action when the lookahead is |
| 131892 | 131931 | ** a terminal symbol. If the lookahead is a non-terminal (as occurs after |
| 131893 | 131932 | ** a reduce action) then the yy_reduce_ofst[] array is used in place of |
| 131894 | 131933 | ** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of |
| 131895 | 131934 | ** YY_SHIFT_USE_DFLT. |
| 131896 | 131935 | ** |
| | @@ -132211,14 +132250,14 @@ |
| 132211 | 132250 | /* 1470 */ 122, 23, 23, 64, 22, 124, 26, 26, 64, 64, |
| 132212 | 132251 | /* 1480 */ 23, 23, 23, 23, 11, 23, 22, 26, 23, 22, |
| 132213 | 132252 | /* 1490 */ 24, 1, 23, 22, 26, 122, 24, 23, 22, 122, |
| 132214 | 132253 | /* 1500 */ 23, 23, 22, 122, 122, 23, 15, |
| 132215 | 132254 | }; |
| 132216 | | -#define YY_SHIFT_USE_DFLT (-95) |
| 132217 | | -#define YY_SHIFT_COUNT (442) |
| 132218 | | -#define YY_SHIFT_MIN (-94) |
| 132219 | | -#define YY_SHIFT_MAX (1491) |
| 132255 | +#define YY_SHIFT_USE_DFLT (1507) |
| 132256 | +#define YY_SHIFT_COUNT (442) |
| 132257 | +#define YY_SHIFT_MIN (-94) |
| 132258 | +#define YY_SHIFT_MAX (1491) |
| 132220 | 132259 | static const short yy_shift_ofst[] = { |
| 132221 | 132260 | /* 0 */ 40, 564, 869, 577, 725, 725, 725, 725, 690, -19, |
| 132222 | 132261 | /* 10 */ 16, 16, 100, 725, 725, 725, 725, 725, 725, 725, |
| 132223 | 132262 | /* 20 */ 841, 841, 538, 507, 684, 565, 61, 137, 172, 207, |
| 132224 | 132263 | /* 30 */ 242, 277, 312, 347, 382, 424, 424, 424, 424, 424, |
| | @@ -132227,16 +132266,16 @@ |
| 132227 | 132266 | /* 60 */ 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, |
| 132228 | 132267 | /* 70 */ 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, |
| 132229 | 132268 | /* 80 */ 725, 725, 725, 725, 821, 725, 725, 725, 725, 725, |
| 132230 | 132269 | /* 90 */ 725, 725, 725, 725, 725, 725, 725, 725, 952, 711, |
| 132231 | 132270 | /* 100 */ 711, 711, 711, 711, 766, 23, 32, 924, 637, 825, |
| 132232 | | - /* 110 */ 837, 837, 924, 73, 183, -51, -95, -95, -95, 501, |
| 132271 | + /* 110 */ 837, 837, 924, 73, 183, -51, 1507, 1507, 1507, 501, |
| 132233 | 132272 | /* 120 */ 501, 501, 903, 903, 632, 205, 241, 924, 924, 924, |
| 132234 | 132273 | /* 130 */ 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, |
| 132235 | 132274 | /* 140 */ 924, 924, 924, 924, 924, 924, 924, 192, 1027, 1106, |
| 132236 | | - /* 150 */ 1106, 183, 176, 176, 176, 176, 176, 176, -95, -95, |
| 132237 | | - /* 160 */ -95, 880, -94, -94, 578, 734, 99, 730, 769, 349, |
| 132275 | + /* 150 */ 1106, 183, 176, 176, 176, 176, 176, 176, 1507, 1507, |
| 132276 | + /* 160 */ 1507, 880, -94, -94, 578, 734, 99, 730, 769, 349, |
| 132238 | 132277 | /* 170 */ 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, |
| 132239 | 132278 | /* 180 */ 924, 924, 924, 924, 924, 924, 924, 954, 954, 954, |
| 132240 | 132279 | /* 190 */ 924, 924, 622, 924, 924, 924, -18, 924, 924, 914, |
| 132241 | 132280 | /* 200 */ 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, |
| 132242 | 132281 | /* 210 */ 441, 1020, 1107, 1107, 1107, 569, 45, 217, 510, 423, |
| | @@ -132246,12 +132285,12 @@ |
| 132246 | 132285 | /* 250 */ 1297, 1183, 1277, 1285, 1285, 1183, 1176, 1297, 1182, 1250, |
| 132247 | 132286 | /* 260 */ 1176, 1176, 1297, 1311, 1176, 1297, 1176, 1297, 1311, 1234, |
| 132248 | 132287 | /* 270 */ 1234, 1234, 1267, 1311, 1234, 1244, 1234, 1267, 1234, 1234, |
| 132249 | 132288 | /* 280 */ 1232, 1247, 1232, 1247, 1232, 1247, 1232, 1247, 1176, 1334, |
| 132250 | 132289 | /* 290 */ 1176, 1235, 1311, 1318, 1318, 1311, 1248, 1253, 1245, 1249, |
| 132251 | | - /* 300 */ 1183, 1355, 1357, 1368, 1368, 1378, 1378, 1378, 1378, -95, |
| 132252 | | - /* 310 */ -95, -95, -95, -95, -95, -95, -95, 451, 936, 816, |
| 132290 | + /* 300 */ 1183, 1355, 1357, 1368, 1368, 1378, 1378, 1378, 1378, 1507, |
| 132291 | + /* 310 */ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 451, 936, 816, |
| 132253 | 132292 | /* 320 */ 888, 1069, 799, 1111, 1197, 1193, 1201, 1202, 1203, 1213, |
| 132254 | 132293 | /* 330 */ 1134, 1117, 1230, 497, 1218, 1219, 1154, 1223, 1115, 1120, |
| 132255 | 132294 | /* 340 */ 1231, 1164, 1160, 1392, 1394, 1376, 1257, 1385, 1307, 1386, |
| 132256 | 132295 | /* 350 */ 1383, 1388, 1292, 1282, 1303, 1294, 1395, 1293, 1403, 1419, |
| 132257 | 132296 | /* 360 */ 1298, 1291, 1389, 1390, 1314, 1372, 1365, 1308, 1430, 1427, |
| | @@ -133200,54 +133239,51 @@ |
| 133200 | 133239 | |
| 133201 | 133240 | if( stateno>=YY_MIN_REDUCE ) return stateno; |
| 133202 | 133241 | assert( stateno <= YY_SHIFT_COUNT ); |
| 133203 | 133242 | do{ |
| 133204 | 133243 | i = yy_shift_ofst[stateno]; |
| 133205 | | - if( i==YY_SHIFT_USE_DFLT ) return yy_default[stateno]; |
| 133206 | 133244 | assert( iLookAhead!=YYNOCODE ); |
| 133207 | 133245 | i += iLookAhead; |
| 133208 | 133246 | if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ |
| 133209 | | - if( iLookAhead>0 ){ |
| 133210 | 133247 | #ifdef YYFALLBACK |
| 133211 | | - YYCODETYPE iFallback; /* Fallback token */ |
| 133212 | | - if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) |
| 133213 | | - && (iFallback = yyFallback[iLookAhead])!=0 ){ |
| 133248 | + YYCODETYPE iFallback; /* Fallback token */ |
| 133249 | + if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) |
| 133250 | + && (iFallback = yyFallback[iLookAhead])!=0 ){ |
| 133214 | 133251 | #ifndef NDEBUG |
| 133215 | | - if( yyTraceFILE ){ |
| 133216 | | - fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", |
| 133217 | | - yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); |
| 133218 | | - } |
| 133252 | + if( yyTraceFILE ){ |
| 133253 | + fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", |
| 133254 | + yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); |
| 133255 | + } |
| 133219 | 133256 | #endif |
| 133220 | | - assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ |
| 133221 | | - iLookAhead = iFallback; |
| 133222 | | - continue; |
| 133223 | | - } |
| 133257 | + assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ |
| 133258 | + iLookAhead = iFallback; |
| 133259 | + continue; |
| 133260 | + } |
| 133224 | 133261 | #endif |
| 133225 | 133262 | #ifdef YYWILDCARD |
| 133226 | | - { |
| 133227 | | - int j = i - iLookAhead + YYWILDCARD; |
| 133228 | | - if( |
| 133263 | + { |
| 133264 | + int j = i - iLookAhead + YYWILDCARD; |
| 133265 | + if( |
| 133229 | 133266 | #if YY_SHIFT_MIN+YYWILDCARD<0 |
| 133230 | | - j>=0 && |
| 133267 | + j>=0 && |
| 133231 | 133268 | #endif |
| 133232 | 133269 | #if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT |
| 133233 | | - j<YY_ACTTAB_COUNT && |
| 133270 | + j<YY_ACTTAB_COUNT && |
| 133234 | 133271 | #endif |
| 133235 | | - yy_lookahead[j]==YYWILDCARD |
| 133236 | | - ){ |
| 133272 | + yy_lookahead[j]==YYWILDCARD && iLookAhead>0 |
| 133273 | + ){ |
| 133237 | 133274 | #ifndef NDEBUG |
| 133238 | | - if( yyTraceFILE ){ |
| 133239 | | - fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", |
| 133240 | | - yyTracePrompt, yyTokenName[iLookAhead], |
| 133241 | | - yyTokenName[YYWILDCARD]); |
| 133242 | | - } |
| 133275 | + if( yyTraceFILE ){ |
| 133276 | + fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", |
| 133277 | + yyTracePrompt, yyTokenName[iLookAhead], |
| 133278 | + yyTokenName[YYWILDCARD]); |
| 133279 | + } |
| 133243 | 133280 | #endif /* NDEBUG */ |
| 133244 | | - return yy_action[j]; |
| 133245 | | - } |
| 133281 | + return yy_action[j]; |
| 133246 | 133282 | } |
| 133283 | + } |
| 133247 | 133284 | #endif /* YYWILDCARD */ |
| 133248 | | - } |
| 133249 | 133285 | return yy_default[stateno]; |
| 133250 | 133286 | }else{ |
| 133251 | 133287 | return yy_action[i]; |
| 133252 | 133288 | } |
| 133253 | 133289 | }while(1); |
| | @@ -136006,18 +136042,30 @@ |
| 136006 | 136042 | assert( pParse->pNewTable==0 ); |
| 136007 | 136043 | assert( pParse->pNewTrigger==0 ); |
| 136008 | 136044 | assert( pParse->nVar==0 ); |
| 136009 | 136045 | assert( pParse->nzVar==0 ); |
| 136010 | 136046 | assert( pParse->azVar==0 ); |
| 136011 | | - while( zSql[i]!=0 ){ |
| 136047 | + while( 1 ){ |
| 136012 | 136048 | assert( i>=0 ); |
| 136013 | | - pParse->sLastToken.z = &zSql[i]; |
| 136014 | | - pParse->sLastToken.n = sqlite3GetToken((unsigned char*)&zSql[i],&tokenType); |
| 136015 | | - i += pParse->sLastToken.n; |
| 136016 | | - if( i>mxSqlLen ){ |
| 136017 | | - pParse->rc = SQLITE_TOOBIG; |
| 136018 | | - break; |
| 136049 | + if( zSql[i]!=0 ){ |
| 136050 | + pParse->sLastToken.z = &zSql[i]; |
| 136051 | + pParse->sLastToken.n = sqlite3GetToken((u8*)&zSql[i],&tokenType); |
| 136052 | + i += pParse->sLastToken.n; |
| 136053 | + if( i>mxSqlLen ){ |
| 136054 | + pParse->rc = SQLITE_TOOBIG; |
| 136055 | + break; |
| 136056 | + } |
| 136057 | + }else{ |
| 136058 | + /* Upon reaching the end of input, call the parser two more times |
| 136059 | + ** with tokens TK_SEMI and 0, in that order. */ |
| 136060 | + if( lastTokenParsed==TK_SEMI ){ |
| 136061 | + tokenType = 0; |
| 136062 | + }else if( lastTokenParsed==0 ){ |
| 136063 | + break; |
| 136064 | + }else{ |
| 136065 | + tokenType = TK_SEMI; |
| 136066 | + } |
| 136019 | 136067 | } |
| 136020 | 136068 | if( tokenType>=TK_SPACE ){ |
| 136021 | 136069 | assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); |
| 136022 | 136070 | if( db->u1.isInterrupted ){ |
| 136023 | 136071 | pParse->rc = SQLITE_INTERRUPT; |
| | @@ -136034,19 +136082,10 @@ |
| 136034 | 136082 | if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; |
| 136035 | 136083 | } |
| 136036 | 136084 | } |
| 136037 | 136085 | assert( nErr==0 ); |
| 136038 | 136086 | pParse->zTail = &zSql[i]; |
| 136039 | | - if( pParse->rc==SQLITE_OK && db->mallocFailed==0 ){ |
| 136040 | | - assert( zSql[i]==0 ); |
| 136041 | | - if( lastTokenParsed!=TK_SEMI ){ |
| 136042 | | - sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse); |
| 136043 | | - } |
| 136044 | | - if( pParse->rc==SQLITE_OK && db->mallocFailed==0 ){ |
| 136045 | | - sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse); |
| 136046 | | - } |
| 136047 | | - } |
| 136048 | 136087 | #ifdef YYTRACKMAXSTACKDEPTH |
| 136049 | 136088 | sqlite3_mutex_enter(sqlite3MallocMutex()); |
| 136050 | 136089 | sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, |
| 136051 | 136090 | sqlite3ParserStackPeak(pEngine) |
| 136052 | 136091 | ); |
| | @@ -137282,10 +137321,15 @@ |
| 137282 | 137321 | SQLITE_API int SQLITE_CDECL sqlite3_db_config(sqlite3 *db, int op, ...){ |
| 137283 | 137322 | va_list ap; |
| 137284 | 137323 | int rc; |
| 137285 | 137324 | va_start(ap, op); |
| 137286 | 137325 | switch( op ){ |
| 137326 | + case SQLITE_DBCONFIG_MAINDBNAME: { |
| 137327 | + db->aDb[0].zDbSName = va_arg(ap,char*); |
| 137328 | + rc = SQLITE_OK; |
| 137329 | + break; |
| 137330 | + } |
| 137287 | 137331 | case SQLITE_DBCONFIG_LOOKASIDE: { |
| 137288 | 137332 | void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ |
| 137289 | 137333 | int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ |
| 137290 | 137334 | int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */ |
| 137291 | 137335 | rc = setupLookaside(db, pBuf, sz, cnt); |
| | @@ -139425,13 +139469,13 @@ |
| 139425 | 139469 | db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); |
| 139426 | 139470 | |
| 139427 | 139471 | /* The default safety_level for the main database is FULL; for the temp |
| 139428 | 139472 | ** database it is OFF. This matches the pager layer defaults. |
| 139429 | 139473 | */ |
| 139430 | | - db->aDb[0].zName = "main"; |
| 139474 | + db->aDb[0].zDbSName = "main"; |
| 139431 | 139475 | db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; |
| 139432 | | - db->aDb[1].zName = "temp"; |
| 139476 | + db->aDb[1].zDbSName = "temp"; |
| 139433 | 139477 | db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF; |
| 139434 | 139478 | |
| 139435 | 139479 | db->magic = SQLITE_MAGIC_OPEN; |
| 139436 | 139480 | if( db->mallocFailed ){ |
| 139437 | 139481 | goto opendb_out; |
| | @@ -140388,11 +140432,11 @@ |
| 140388 | 140432 | */ |
| 140389 | 140433 | SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ |
| 140390 | 140434 | int i; |
| 140391 | 140435 | for(i=0; i<db->nDb; i++){ |
| 140392 | 140436 | if( db->aDb[i].pBt |
| 140393 | | - && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zName)==0) |
| 140437 | + && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zDbSName)==0) |
| 140394 | 140438 | ){ |
| 140395 | 140439 | return db->aDb[i].pBt; |
| 140396 | 140440 | } |
| 140397 | 140441 | } |
| 140398 | 140442 | return 0; |
| | @@ -164754,19 +164798,25 @@ |
| 164754 | 164798 | /* |
| 164755 | 164799 | ** Open an RBU handle to perform an RBU vacuum on database file zTarget. |
| 164756 | 164800 | ** An RBU vacuum is similar to SQLite's built-in VACUUM command, except |
| 164757 | 164801 | ** that it can be suspended and resumed like an RBU update. |
| 164758 | 164802 | ** |
| 164759 | | -** The second argument to this function, which may not be NULL, identifies |
| 164760 | | -** a database in which to store the state of the RBU vacuum operation if |
| 164761 | | -** it is suspended. The first time sqlite3rbu_vacuum() is called, to start |
| 164762 | | -** an RBU vacuum operation, the state database should either not exist or |
| 164763 | | -** be empty (contain no tables). If an RBU vacuum is suspended by calling |
| 164803 | +** The second argument to this function identifies a database in which |
| 164804 | +** to store the state of the RBU vacuum operation if it is suspended. The |
| 164805 | +** first time sqlite3rbu_vacuum() is called, to start an RBU vacuum |
| 164806 | +** operation, the state database should either not exist or be empty |
| 164807 | +** (contain no tables). If an RBU vacuum is suspended by calling |
| 164764 | 164808 | ** sqlite3rbu_close() on the RBU handle before sqlite3rbu_step() has |
| 164765 | 164809 | ** returned SQLITE_DONE, the vacuum state is stored in the state database. |
| 164766 | 164810 | ** The vacuum can be resumed by calling this function to open a new RBU |
| 164767 | 164811 | ** handle specifying the same target and state databases. |
| 164812 | +** |
| 164813 | +** If the second argument passed to this function is NULL, then the |
| 164814 | +** name of the state database is "<database>-vacuum", where <database> |
| 164815 | +** is the name of the target database file. In this case, on UNIX, if the |
| 164816 | +** state database is not already present in the file-system, it is created |
| 164817 | +** with the same permissions as the target db is made. |
| 164768 | 164818 | ** |
| 164769 | 164819 | ** This function does not delete the state database after an RBU vacuum |
| 164770 | 164820 | ** is completed, even if it created it. However, if the call to |
| 164771 | 164821 | ** sqlite3rbu_close() returns any value other than SQLITE_OK, the contents |
| 164772 | 164822 | ** of the state tables within the state database are zeroed. This way, |
| | @@ -167255,19 +167305,22 @@ |
| 167255 | 167305 | /* |
| 167256 | 167306 | ** Open the database handle and attach the RBU database as "rbu". If an |
| 167257 | 167307 | ** error occurs, leave an error code and message in the RBU handle. |
| 167258 | 167308 | */ |
| 167259 | 167309 | static void rbuOpenDatabase(sqlite3rbu *p){ |
| 167260 | | - assert( p->rc==SQLITE_OK ); |
| 167261 | | - assert( p->dbMain==0 && p->dbRbu==0 ); |
| 167262 | | - assert( rbuIsVacuum(p) || p->zTarget!=0 ); |
| 167310 | + assert( p->rc || (p->dbMain==0 && p->dbRbu==0) ); |
| 167311 | + assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 ); |
| 167263 | 167312 | |
| 167264 | 167313 | /* Open the RBU database */ |
| 167265 | 167314 | p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1); |
| 167266 | 167315 | |
| 167267 | 167316 | if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ |
| 167268 | 167317 | sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); |
| 167318 | + if( p->zState==0 ){ |
| 167319 | + const char *zFile = sqlite3_db_filename(p->dbRbu, "main"); |
| 167320 | + p->zState = rbuMPrintf(p, "file://%s-vacuum?modeof=%s", zFile, zFile); |
| 167321 | + } |
| 167269 | 167322 | } |
| 167270 | 167323 | |
| 167271 | 167324 | /* If using separate RBU and state databases, attach the state database to |
| 167272 | 167325 | ** the RBU db handle now. */ |
| 167273 | 167326 | if( p->zState ){ |
| | @@ -168398,12 +168451,11 @@ |
| 168398 | 168451 | const char *zState |
| 168399 | 168452 | ){ |
| 168400 | 168453 | sqlite3rbu *p; |
| 168401 | 168454 | size_t nTarget = zTarget ? strlen(zTarget) : 0; |
| 168402 | 168455 | size_t nRbu = strlen(zRbu); |
| 168403 | | - size_t nState = zState ? strlen(zState) : 0; |
| 168404 | | - size_t nByte = sizeof(sqlite3rbu) + nTarget+1 + nRbu+1+ nState+1; |
| 168456 | + size_t nByte = sizeof(sqlite3rbu) + nTarget+1 + nRbu+1; |
| 168405 | 168457 | |
| 168406 | 168458 | p = (sqlite3rbu*)sqlite3_malloc64(nByte); |
| 168407 | 168459 | if( p ){ |
| 168408 | 168460 | RbuState *pState = 0; |
| 168409 | 168461 | |
| | @@ -168421,12 +168473,11 @@ |
| 168421 | 168473 | } |
| 168422 | 168474 | p->zRbu = pCsr; |
| 168423 | 168475 | memcpy(p->zRbu, zRbu, nRbu+1); |
| 168424 | 168476 | pCsr += nRbu+1; |
| 168425 | 168477 | if( zState ){ |
| 168426 | | - p->zState = pCsr; |
| 168427 | | - memcpy(p->zState, zState, nState+1); |
| 168478 | + p->zState = rbuMPrintf(p, "%s", zState); |
| 168428 | 168479 | } |
| 168429 | 168480 | rbuOpenDatabase(p); |
| 168430 | 168481 | } |
| 168431 | 168482 | |
| 168432 | 168483 | if( p->rc==SQLITE_OK ){ |
| | @@ -168531,19 +168582,34 @@ |
| 168531 | 168582 | rbuFreeState(pState); |
| 168532 | 168583 | } |
| 168533 | 168584 | |
| 168534 | 168585 | return p; |
| 168535 | 168586 | } |
| 168587 | + |
| 168588 | +/* |
| 168589 | +** Allocate and return an RBU handle with all fields zeroed except for the |
| 168590 | +** error code, which is set to SQLITE_MISUSE. |
| 168591 | +*/ |
| 168592 | +static sqlite3rbu *rbuMisuseError(void){ |
| 168593 | + sqlite3rbu *pRet; |
| 168594 | + pRet = sqlite3_malloc64(sizeof(sqlite3rbu)); |
| 168595 | + if( pRet ){ |
| 168596 | + memset(pRet, 0, sizeof(sqlite3rbu)); |
| 168597 | + pRet->rc = SQLITE_MISUSE; |
| 168598 | + } |
| 168599 | + return pRet; |
| 168600 | +} |
| 168536 | 168601 | |
| 168537 | 168602 | /* |
| 168538 | 168603 | ** Open and return a new RBU handle. |
| 168539 | 168604 | */ |
| 168540 | 168605 | SQLITE_API sqlite3rbu *SQLITE_STDCALL sqlite3rbu_open( |
| 168541 | 168606 | const char *zTarget, |
| 168542 | 168607 | const char *zRbu, |
| 168543 | 168608 | const char *zState |
| 168544 | 168609 | ){ |
| 168610 | + if( zTarget==0 || zRbu==0 ){ return rbuMisuseError(); } |
| 168545 | 168611 | /* TODO: Check that zTarget and zRbu are non-NULL */ |
| 168546 | 168612 | return openRbuHandle(zTarget, zRbu, zState); |
| 168547 | 168613 | } |
| 168548 | 168614 | |
| 168549 | 168615 | /* |
| | @@ -168551,10 +168617,11 @@ |
| 168551 | 168617 | */ |
| 168552 | 168618 | SQLITE_API sqlite3rbu *SQLITE_STDCALL sqlite3rbu_vacuum( |
| 168553 | 168619 | const char *zTarget, |
| 168554 | 168620 | const char *zState |
| 168555 | 168621 | ){ |
| 168622 | + if( zTarget==0 ){ return rbuMisuseError(); } |
| 168556 | 168623 | /* TODO: Check that both arguments are non-NULL */ |
| 168557 | 168624 | return openRbuHandle(0, zTarget, zState); |
| 168558 | 168625 | } |
| 168559 | 168626 | |
| 168560 | 168627 | /* |
| | @@ -168628,10 +168695,11 @@ |
| 168628 | 168695 | sqlite3_free(p->aFrame); |
| 168629 | 168696 | |
| 168630 | 168697 | rbuEditErrmsg(p); |
| 168631 | 168698 | rc = p->rc; |
| 168632 | 168699 | *pzErrmsg = p->zErrmsg; |
| 168700 | + sqlite3_free(p->zState); |
| 168633 | 168701 | sqlite3_free(p); |
| 168634 | 168702 | }else{ |
| 168635 | 168703 | rc = SQLITE_NOMEM; |
| 168636 | 168704 | *pzErrmsg = 0; |
| 168637 | 168705 | } |
| | @@ -170239,11 +170307,11 @@ |
| 170239 | 170307 | zSql = sqlite3_mprintf( |
| 170240 | 170308 | "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" |
| 170241 | 170309 | " UNION ALL " |
| 170242 | 170310 | "SELECT name, rootpage, type" |
| 170243 | 170311 | " FROM \"%w\".%s WHERE rootpage!=0" |
| 170244 | | - " ORDER BY name", pTab->db->aDb[pCsr->iDb].zName, zMaster); |
| 170312 | + " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); |
| 170245 | 170313 | if( zSql==0 ){ |
| 170246 | 170314 | return SQLITE_NOMEM_BKPT; |
| 170247 | 170315 | }else{ |
| 170248 | 170316 | rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0); |
| 170249 | 170317 | sqlite3_free(zSql); |
| | @@ -170293,11 +170361,11 @@ |
| 170293 | 170361 | sqlite3_result_int(ctx, pCsr->szPage); |
| 170294 | 170362 | break; |
| 170295 | 170363 | default: { /* schema */ |
| 170296 | 170364 | sqlite3 *db = sqlite3_context_db_handle(ctx); |
| 170297 | 170365 | int iDb = pCsr->iDb; |
| 170298 | | - sqlite3_result_text(ctx, db->aDb[iDb].zName, -1, SQLITE_STATIC); |
| 170366 | + sqlite3_result_text(ctx, db->aDb[iDb].zDbSName, -1, SQLITE_STATIC); |
| 170299 | 170367 | break; |
| 170300 | 170368 | } |
| 170301 | 170369 | } |
| 170302 | 170370 | return SQLITE_OK; |
| 170303 | 170371 | } |
| | @@ -178530,10 +178598,11 @@ |
| 178530 | 178598 | static void sqlite3Fts5ParseNearsetFree(Fts5ExprNearset*); |
| 178531 | 178599 | static void sqlite3Fts5ParseNodeFree(Fts5ExprNode*); |
| 178532 | 178600 | |
| 178533 | 178601 | static void sqlite3Fts5ParseSetDistance(Fts5Parse*, Fts5ExprNearset*, Fts5Token*); |
| 178534 | 178602 | static void sqlite3Fts5ParseSetColset(Fts5Parse*, Fts5ExprNearset*, Fts5Colset*); |
| 178603 | +static Fts5Colset *sqlite3Fts5ParseColsetInvert(Fts5Parse*, Fts5Colset*); |
| 178535 | 178604 | static void sqlite3Fts5ParseFinished(Fts5Parse *pParse, Fts5ExprNode *p); |
| 178536 | 178605 | static void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token*); |
| 178537 | 178606 | |
| 178538 | 178607 | /* |
| 178539 | 178608 | ** End of interface to code in fts5_expr.c. |
| | @@ -178587,16 +178656,17 @@ |
| 178587 | 178656 | #define FTS5_NOT 3 |
| 178588 | 178657 | #define FTS5_TERM 4 |
| 178589 | 178658 | #define FTS5_COLON 5 |
| 178590 | 178659 | #define FTS5_LP 6 |
| 178591 | 178660 | #define FTS5_RP 7 |
| 178592 | | -#define FTS5_LCP 8 |
| 178593 | | -#define FTS5_RCP 9 |
| 178594 | | -#define FTS5_STRING 10 |
| 178595 | | -#define FTS5_COMMA 11 |
| 178596 | | -#define FTS5_PLUS 12 |
| 178597 | | -#define FTS5_STAR 13 |
| 178661 | +#define FTS5_MINUS 8 |
| 178662 | +#define FTS5_LCP 9 |
| 178663 | +#define FTS5_RCP 10 |
| 178664 | +#define FTS5_STRING 11 |
| 178665 | +#define FTS5_COMMA 12 |
| 178666 | +#define FTS5_PLUS 13 |
| 178667 | +#define FTS5_STAR 14 |
| 178598 | 178668 | |
| 178599 | 178669 | /* |
| 178600 | 178670 | ** 2000-05-29 |
| 178601 | 178671 | ** |
| 178602 | 178672 | ** The author disclaims copyright to this source code. In place of |
| | @@ -178706,39 +178776,39 @@ |
| 178706 | 178776 | #ifndef INTERFACE |
| 178707 | 178777 | # define INTERFACE 1 |
| 178708 | 178778 | #endif |
| 178709 | 178779 | /************* Begin control #defines *****************************************/ |
| 178710 | 178780 | #define fts5YYCODETYPE unsigned char |
| 178711 | | -#define fts5YYNOCODE 27 |
| 178781 | +#define fts5YYNOCODE 28 |
| 178712 | 178782 | #define fts5YYACTIONTYPE unsigned char |
| 178713 | 178783 | #define sqlite3Fts5ParserFTS5TOKENTYPE Fts5Token |
| 178714 | 178784 | typedef union { |
| 178715 | 178785 | int fts5yyinit; |
| 178716 | 178786 | sqlite3Fts5ParserFTS5TOKENTYPE fts5yy0; |
| 178717 | | - Fts5Colset* fts5yy3; |
| 178718 | | - Fts5ExprPhrase* fts5yy11; |
| 178719 | | - Fts5ExprNode* fts5yy18; |
| 178720 | | - int fts5yy20; |
| 178721 | | - Fts5ExprNearset* fts5yy26; |
| 178787 | + int fts5yy4; |
| 178788 | + Fts5Colset* fts5yy11; |
| 178789 | + Fts5ExprNode* fts5yy24; |
| 178790 | + Fts5ExprNearset* fts5yy46; |
| 178791 | + Fts5ExprPhrase* fts5yy53; |
| 178722 | 178792 | } fts5YYMINORTYPE; |
| 178723 | 178793 | #ifndef fts5YYSTACKDEPTH |
| 178724 | 178794 | #define fts5YYSTACKDEPTH 100 |
| 178725 | 178795 | #endif |
| 178726 | 178796 | #define sqlite3Fts5ParserARG_SDECL Fts5Parse *pParse; |
| 178727 | 178797 | #define sqlite3Fts5ParserARG_PDECL ,Fts5Parse *pParse |
| 178728 | 178798 | #define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse = fts5yypParser->pParse |
| 178729 | 178799 | #define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse = pParse |
| 178730 | | -#define fts5YYNSTATE 26 |
| 178731 | | -#define fts5YYNRULE 24 |
| 178732 | | -#define fts5YY_MAX_SHIFT 25 |
| 178733 | | -#define fts5YY_MIN_SHIFTREDUCE 40 |
| 178734 | | -#define fts5YY_MAX_SHIFTREDUCE 63 |
| 178735 | | -#define fts5YY_MIN_REDUCE 64 |
| 178736 | | -#define fts5YY_MAX_REDUCE 87 |
| 178737 | | -#define fts5YY_ERROR_ACTION 88 |
| 178738 | | -#define fts5YY_ACCEPT_ACTION 89 |
| 178739 | | -#define fts5YY_NO_ACTION 90 |
| 178800 | +#define fts5YYNSTATE 29 |
| 178801 | +#define fts5YYNRULE 26 |
| 178802 | +#define fts5YY_MAX_SHIFT 28 |
| 178803 | +#define fts5YY_MIN_SHIFTREDUCE 45 |
| 178804 | +#define fts5YY_MAX_SHIFTREDUCE 70 |
| 178805 | +#define fts5YY_MIN_REDUCE 71 |
| 178806 | +#define fts5YY_MAX_REDUCE 96 |
| 178807 | +#define fts5YY_ERROR_ACTION 97 |
| 178808 | +#define fts5YY_ACCEPT_ACTION 98 |
| 178809 | +#define fts5YY_NO_ACTION 99 |
| 178740 | 178810 | /************* End control #defines *******************************************/ |
| 178741 | 178811 | |
| 178742 | 178812 | /* Define the fts5yytestcase() macro to be a no-op if is not already defined |
| 178743 | 178813 | ** otherwise. |
| 178744 | 178814 | ** |
| | @@ -178766,29 +178836,33 @@ |
| 178766 | 178836 | ** N between fts5YY_MIN_SHIFTREDUCE Shift to an arbitrary state then |
| 178767 | 178837 | ** and fts5YY_MAX_SHIFTREDUCE reduce by rule N-fts5YY_MIN_SHIFTREDUCE. |
| 178768 | 178838 | ** |
| 178769 | 178839 | ** N between fts5YY_MIN_REDUCE Reduce by rule N-fts5YY_MIN_REDUCE |
| 178770 | 178840 | ** and fts5YY_MAX_REDUCE |
| 178771 | | - |
| 178841 | +** |
| 178772 | 178842 | ** N == fts5YY_ERROR_ACTION A syntax error has occurred. |
| 178773 | 178843 | ** |
| 178774 | 178844 | ** N == fts5YY_ACCEPT_ACTION The parser accepts its input. |
| 178775 | 178845 | ** |
| 178776 | 178846 | ** N == fts5YY_NO_ACTION No such action. Denotes unused |
| 178777 | 178847 | ** slots in the fts5yy_action[] table. |
| 178778 | 178848 | ** |
| 178779 | 178849 | ** The action table is constructed as a single large table named fts5yy_action[]. |
| 178780 | | -** Given state S and lookahead X, the action is computed as |
| 178781 | | -** |
| 178782 | | -** fts5yy_action[ fts5yy_shift_ofst[S] + X ] |
| 178783 | | -** |
| 178784 | | -** If the index value fts5yy_shift_ofst[S]+X is out of range or if the value |
| 178785 | | -** fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X or if fts5yy_shift_ofst[S] |
| 178786 | | -** is equal to fts5YY_SHIFT_USE_DFLT, it means that the action is not in the table |
| 178787 | | -** and that fts5yy_default[S] should be used instead. |
| 178788 | | -** |
| 178789 | | -** The formula above is for computing the action when the lookahead is |
| 178850 | +** Given state S and lookahead X, the action is computed as either: |
| 178851 | +** |
| 178852 | +** (A) N = fts5yy_action[ fts5yy_shift_ofst[S] + X ] |
| 178853 | +** (B) N = fts5yy_default[S] |
| 178854 | +** |
| 178855 | +** The (A) formula is preferred. The B formula is used instead if: |
| 178856 | +** (1) The fts5yy_shift_ofst[S]+X value is out of range, or |
| 178857 | +** (2) fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X, or |
| 178858 | +** (3) fts5yy_shift_ofst[S] equal fts5YY_SHIFT_USE_DFLT. |
| 178859 | +** (Implementation note: fts5YY_SHIFT_USE_DFLT is chosen so that |
| 178860 | +** fts5YY_SHIFT_USE_DFLT+X will be out of range for all possible lookaheads X. |
| 178861 | +** Hence only tests (1) and (2) need to be evaluated.) |
| 178862 | +** |
| 178863 | +** The formulas above are for computing the action when the lookahead is |
| 178790 | 178864 | ** a terminal symbol. If the lookahead is a non-terminal (as occurs after |
| 178791 | 178865 | ** a reduce action) then the fts5yy_reduce_ofst[] array is used in place of |
| 178792 | 178866 | ** the fts5yy_shift_ofst[] array and fts5YY_REDUCE_USE_DFLT is used in place of |
| 178793 | 178867 | ** fts5YY_SHIFT_USE_DFLT. |
| 178794 | 178868 | ** |
| | @@ -178802,52 +178876,54 @@ |
| 178802 | 178876 | ** fts5yy_reduce_ofst[] For each state, the offset into fts5yy_action for |
| 178803 | 178877 | ** shifting non-terminals after a reduce. |
| 178804 | 178878 | ** fts5yy_default[] Default action for each state. |
| 178805 | 178879 | ** |
| 178806 | 178880 | *********** Begin parsing tables **********************************************/ |
| 178807 | | -#define fts5YY_ACTTAB_COUNT (78) |
| 178881 | +#define fts5YY_ACTTAB_COUNT (85) |
| 178808 | 178882 | static const fts5YYACTIONTYPE fts5yy_action[] = { |
| 178809 | | - /* 0 */ 89, 15, 46, 5, 48, 24, 12, 19, 23, 14, |
| 178810 | | - /* 10 */ 46, 5, 48, 24, 20, 21, 23, 43, 46, 5, |
| 178811 | | - /* 20 */ 48, 24, 6, 18, 23, 17, 46, 5, 48, 24, |
| 178812 | | - /* 30 */ 75, 7, 23, 25, 46, 5, 48, 24, 62, 47, |
| 178813 | | - /* 40 */ 23, 48, 24, 7, 11, 23, 9, 3, 4, 2, |
| 178814 | | - /* 50 */ 62, 50, 52, 44, 64, 3, 4, 2, 49, 4, |
| 178815 | | - /* 60 */ 2, 1, 23, 11, 16, 9, 12, 2, 10, 61, |
| 178816 | | - /* 70 */ 53, 59, 62, 60, 22, 13, 55, 8, |
| 178883 | + /* 0 */ 98, 16, 51, 5, 53, 27, 83, 7, 26, 15, |
| 178884 | + /* 10 */ 51, 5, 53, 27, 13, 69, 26, 48, 51, 5, |
| 178885 | + /* 20 */ 53, 27, 19, 11, 26, 9, 20, 51, 5, 53, |
| 178886 | + /* 30 */ 27, 13, 22, 26, 28, 51, 5, 53, 27, 68, |
| 178887 | + /* 40 */ 1, 26, 19, 11, 17, 9, 52, 10, 53, 27, |
| 178888 | + /* 50 */ 23, 24, 26, 54, 3, 4, 2, 26, 6, 21, |
| 178889 | + /* 60 */ 49, 71, 3, 4, 2, 7, 56, 59, 55, 59, |
| 178890 | + /* 70 */ 4, 2, 12, 69, 58, 60, 18, 67, 62, 69, |
| 178891 | + /* 80 */ 25, 66, 8, 14, 2, |
| 178817 | 178892 | }; |
| 178818 | 178893 | static const fts5YYCODETYPE fts5yy_lookahead[] = { |
| 178819 | | - /* 0 */ 15, 16, 17, 18, 19, 20, 10, 11, 23, 16, |
| 178820 | | - /* 10 */ 17, 18, 19, 20, 23, 24, 23, 16, 17, 18, |
| 178821 | | - /* 20 */ 19, 20, 22, 23, 23, 16, 17, 18, 19, 20, |
| 178822 | | - /* 30 */ 5, 6, 23, 16, 17, 18, 19, 20, 13, 17, |
| 178823 | | - /* 40 */ 23, 19, 20, 6, 8, 23, 10, 1, 2, 3, |
| 178824 | | - /* 50 */ 13, 9, 10, 7, 0, 1, 2, 3, 19, 2, |
| 178825 | | - /* 60 */ 3, 6, 23, 8, 21, 10, 10, 3, 10, 25, |
| 178826 | | - /* 70 */ 10, 10, 13, 25, 12, 10, 7, 5, |
| 178827 | | -}; |
| 178828 | | -#define fts5YY_SHIFT_USE_DFLT (-5) |
| 178829 | | -#define fts5YY_SHIFT_COUNT (25) |
| 178830 | | -#define fts5YY_SHIFT_MIN (-4) |
| 178831 | | -#define fts5YY_SHIFT_MAX (72) |
| 178832 | | -static const signed char fts5yy_shift_ofst[] = { |
| 178833 | | - /* 0 */ 55, 55, 55, 55, 55, 36, -4, 56, 58, 25, |
| 178834 | | - /* 10 */ 37, 60, 59, 59, 46, 54, 42, 57, 62, 61, |
| 178835 | | - /* 20 */ 62, 69, 65, 62, 72, 64, |
| 178836 | | -}; |
| 178837 | | -#define fts5YY_REDUCE_USE_DFLT (-16) |
| 178838 | | -#define fts5YY_REDUCE_COUNT (13) |
| 178839 | | -#define fts5YY_REDUCE_MIN (-15) |
| 178840 | | -#define fts5YY_REDUCE_MAX (48) |
| 178894 | + /* 0 */ 16, 17, 18, 19, 20, 21, 5, 6, 24, 17, |
| 178895 | + /* 10 */ 18, 19, 20, 21, 11, 14, 24, 17, 18, 19, |
| 178896 | + /* 20 */ 20, 21, 8, 9, 24, 11, 17, 18, 19, 20, |
| 178897 | + /* 30 */ 21, 11, 12, 24, 17, 18, 19, 20, 21, 26, |
| 178898 | + /* 40 */ 6, 24, 8, 9, 22, 11, 18, 11, 20, 21, |
| 178899 | + /* 50 */ 24, 25, 24, 20, 1, 2, 3, 24, 23, 24, |
| 178900 | + /* 60 */ 7, 0, 1, 2, 3, 6, 10, 11, 10, 11, |
| 178901 | + /* 70 */ 2, 3, 9, 14, 11, 11, 22, 26, 7, 14, |
| 178902 | + /* 80 */ 13, 11, 5, 11, 3, |
| 178903 | +}; |
| 178904 | +#define fts5YY_SHIFT_USE_DFLT (85) |
| 178905 | +#define fts5YY_SHIFT_COUNT (28) |
| 178906 | +#define fts5YY_SHIFT_MIN (0) |
| 178907 | +#define fts5YY_SHIFT_MAX (81) |
| 178908 | +static const unsigned char fts5yy_shift_ofst[] = { |
| 178909 | + /* 0 */ 34, 34, 34, 34, 34, 14, 20, 3, 36, 1, |
| 178910 | + /* 10 */ 59, 64, 64, 65, 65, 53, 61, 56, 58, 63, |
| 178911 | + /* 20 */ 68, 67, 70, 67, 71, 72, 67, 77, 81, |
| 178912 | +}; |
| 178913 | +#define fts5YY_REDUCE_USE_DFLT (-17) |
| 178914 | +#define fts5YY_REDUCE_COUNT (14) |
| 178915 | +#define fts5YY_REDUCE_MIN (-16) |
| 178916 | +#define fts5YY_REDUCE_MAX (54) |
| 178841 | 178917 | static const signed char fts5yy_reduce_ofst[] = { |
| 178842 | | - /* 0 */ -15, -7, 1, 9, 17, 22, -9, 0, 39, 44, |
| 178843 | | - /* 10 */ 44, 43, 44, 48, |
| 178918 | + /* 0 */ -16, -8, 0, 9, 17, 28, 26, 35, 33, 13, |
| 178919 | + /* 10 */ 13, 22, 54, 13, 51, |
| 178844 | 178920 | }; |
| 178845 | 178921 | static const fts5YYACTIONTYPE fts5yy_default[] = { |
| 178846 | | - /* 0 */ 88, 88, 88, 88, 88, 69, 82, 88, 88, 87, |
| 178847 | | - /* 10 */ 87, 88, 87, 87, 88, 88, 88, 66, 80, 88, |
| 178848 | | - /* 20 */ 81, 88, 88, 78, 88, 65, |
| 178922 | + /* 0 */ 97, 97, 97, 97, 97, 76, 91, 97, 97, 96, |
| 178923 | + /* 10 */ 96, 97, 97, 96, 96, 97, 97, 97, 97, 97, |
| 178924 | + /* 20 */ 73, 89, 97, 90, 97, 97, 87, 97, 72, |
| 178849 | 178925 | }; |
| 178850 | 178926 | /********** End of lemon-generated parsing tables *****************************/ |
| 178851 | 178927 | |
| 178852 | 178928 | /* The next table maps tokens (terminal symbols) into fallback tokens. |
| 178853 | 178929 | ** If a construct like the following: |
| | @@ -178950,15 +179026,15 @@ |
| 178950 | 179026 | /* For tracing shifts, the names of all terminals and nonterminals |
| 178951 | 179027 | ** are required. The following table supplies these names */ |
| 178952 | 179028 | static const char *const fts5yyTokenName[] = { |
| 178953 | 179029 | "$", "OR", "AND", "NOT", |
| 178954 | 179030 | "TERM", "COLON", "LP", "RP", |
| 178955 | | - "LCP", "RCP", "STRING", "COMMA", |
| 178956 | | - "PLUS", "STAR", "error", "input", |
| 178957 | | - "expr", "cnearset", "exprlist", "nearset", |
| 178958 | | - "colset", "colsetlist", "nearphrases", "phrase", |
| 178959 | | - "neardist_opt", "star_opt", |
| 179031 | + "MINUS", "LCP", "RCP", "STRING", |
| 179032 | + "COMMA", "PLUS", "STAR", "error", |
| 179033 | + "input", "expr", "cnearset", "exprlist", |
| 179034 | + "nearset", "colset", "colsetlist", "nearphrases", |
| 179035 | + "phrase", "neardist_opt", "star_opt", |
| 178960 | 179036 | }; |
| 178961 | 179037 | #endif /* NDEBUG */ |
| 178962 | 179038 | |
| 178963 | 179039 | #ifndef NDEBUG |
| 178964 | 179040 | /* For tracing reduce actions, the names of all rules are required. |
| | @@ -178972,24 +179048,26 @@ |
| 178972 | 179048 | /* 5 */ "expr ::= exprlist", |
| 178973 | 179049 | /* 6 */ "exprlist ::= cnearset", |
| 178974 | 179050 | /* 7 */ "exprlist ::= exprlist cnearset", |
| 178975 | 179051 | /* 8 */ "cnearset ::= nearset", |
| 178976 | 179052 | /* 9 */ "cnearset ::= colset COLON nearset", |
| 178977 | | - /* 10 */ "colset ::= LCP colsetlist RCP", |
| 178978 | | - /* 11 */ "colset ::= STRING", |
| 178979 | | - /* 12 */ "colsetlist ::= colsetlist STRING", |
| 178980 | | - /* 13 */ "colsetlist ::= STRING", |
| 178981 | | - /* 14 */ "nearset ::= phrase", |
| 178982 | | - /* 15 */ "nearset ::= STRING LP nearphrases neardist_opt RP", |
| 178983 | | - /* 16 */ "nearphrases ::= phrase", |
| 178984 | | - /* 17 */ "nearphrases ::= nearphrases phrase", |
| 178985 | | - /* 18 */ "neardist_opt ::=", |
| 178986 | | - /* 19 */ "neardist_opt ::= COMMA STRING", |
| 178987 | | - /* 20 */ "phrase ::= phrase PLUS STRING star_opt", |
| 178988 | | - /* 21 */ "phrase ::= STRING star_opt", |
| 178989 | | - /* 22 */ "star_opt ::= STAR", |
| 178990 | | - /* 23 */ "star_opt ::=", |
| 179053 | + /* 10 */ "colset ::= MINUS LCP colsetlist RCP", |
| 179054 | + /* 11 */ "colset ::= LCP colsetlist RCP", |
| 179055 | + /* 12 */ "colset ::= STRING", |
| 179056 | + /* 13 */ "colset ::= MINUS STRING", |
| 179057 | + /* 14 */ "colsetlist ::= colsetlist STRING", |
| 179058 | + /* 15 */ "colsetlist ::= STRING", |
| 179059 | + /* 16 */ "nearset ::= phrase", |
| 179060 | + /* 17 */ "nearset ::= STRING LP nearphrases neardist_opt RP", |
| 179061 | + /* 18 */ "nearphrases ::= phrase", |
| 179062 | + /* 19 */ "nearphrases ::= nearphrases phrase", |
| 179063 | + /* 20 */ "neardist_opt ::=", |
| 179064 | + /* 21 */ "neardist_opt ::= COMMA STRING", |
| 179065 | + /* 22 */ "phrase ::= phrase PLUS STRING star_opt", |
| 179066 | + /* 23 */ "phrase ::= STRING star_opt", |
| 179067 | + /* 24 */ "star_opt ::= STAR", |
| 179068 | + /* 25 */ "star_opt ::=", |
| 178991 | 179069 | }; |
| 178992 | 179070 | #endif /* NDEBUG */ |
| 178993 | 179071 | |
| 178994 | 179072 | |
| 178995 | 179073 | #if fts5YYSTACKDEPTH<=0 |
| | @@ -179095,37 +179173,37 @@ |
| 179095 | 179173 | ** Note: during a reduce, the only symbols destroyed are those |
| 179096 | 179174 | ** which appear on the RHS of the rule, but which are *not* used |
| 179097 | 179175 | ** inside the C code. |
| 179098 | 179176 | */ |
| 179099 | 179177 | /********* Begin destructor definitions ***************************************/ |
| 179100 | | - case 15: /* input */ |
| 179178 | + case 16: /* input */ |
| 179101 | 179179 | { |
| 179102 | 179180 | (void)pParse; |
| 179103 | 179181 | } |
| 179104 | 179182 | break; |
| 179105 | | - case 16: /* expr */ |
| 179106 | | - case 17: /* cnearset */ |
| 179107 | | - case 18: /* exprlist */ |
| 179108 | | -{ |
| 179109 | | - sqlite3Fts5ParseNodeFree((fts5yypminor->fts5yy18)); |
| 179110 | | -} |
| 179111 | | - break; |
| 179112 | | - case 19: /* nearset */ |
| 179113 | | - case 22: /* nearphrases */ |
| 179114 | | -{ |
| 179115 | | - sqlite3Fts5ParseNearsetFree((fts5yypminor->fts5yy26)); |
| 179116 | | -} |
| 179117 | | - break; |
| 179118 | | - case 20: /* colset */ |
| 179119 | | - case 21: /* colsetlist */ |
| 179120 | | -{ |
| 179121 | | - sqlite3_free((fts5yypminor->fts5yy3)); |
| 179122 | | -} |
| 179123 | | - break; |
| 179124 | | - case 23: /* phrase */ |
| 179125 | | -{ |
| 179126 | | - sqlite3Fts5ParsePhraseFree((fts5yypminor->fts5yy11)); |
| 179183 | + case 17: /* expr */ |
| 179184 | + case 18: /* cnearset */ |
| 179185 | + case 19: /* exprlist */ |
| 179186 | +{ |
| 179187 | + sqlite3Fts5ParseNodeFree((fts5yypminor->fts5yy24)); |
| 179188 | +} |
| 179189 | + break; |
| 179190 | + case 20: /* nearset */ |
| 179191 | + case 23: /* nearphrases */ |
| 179192 | +{ |
| 179193 | + sqlite3Fts5ParseNearsetFree((fts5yypminor->fts5yy46)); |
| 179194 | +} |
| 179195 | + break; |
| 179196 | + case 21: /* colset */ |
| 179197 | + case 22: /* colsetlist */ |
| 179198 | +{ |
| 179199 | + sqlite3_free((fts5yypminor->fts5yy11)); |
| 179200 | +} |
| 179201 | + break; |
| 179202 | + case 24: /* phrase */ |
| 179203 | +{ |
| 179204 | + sqlite3Fts5ParsePhraseFree((fts5yypminor->fts5yy53)); |
| 179127 | 179205 | } |
| 179128 | 179206 | break; |
| 179129 | 179207 | /********* End destructor definitions *****************************************/ |
| 179130 | 179208 | default: break; /* If no destructor action specified: do nothing */ |
| 179131 | 179209 | } |
| | @@ -179198,54 +179276,51 @@ |
| 179198 | 179276 | |
| 179199 | 179277 | if( stateno>=fts5YY_MIN_REDUCE ) return stateno; |
| 179200 | 179278 | assert( stateno <= fts5YY_SHIFT_COUNT ); |
| 179201 | 179279 | do{ |
| 179202 | 179280 | i = fts5yy_shift_ofst[stateno]; |
| 179203 | | - if( i==fts5YY_SHIFT_USE_DFLT ) return fts5yy_default[stateno]; |
| 179204 | 179281 | assert( iLookAhead!=fts5YYNOCODE ); |
| 179205 | 179282 | i += iLookAhead; |
| 179206 | 179283 | if( i<0 || i>=fts5YY_ACTTAB_COUNT || fts5yy_lookahead[i]!=iLookAhead ){ |
| 179207 | | - if( iLookAhead>0 ){ |
| 179208 | 179284 | #ifdef fts5YYFALLBACK |
| 179209 | | - fts5YYCODETYPE iFallback; /* Fallback token */ |
| 179210 | | - if( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0]) |
| 179211 | | - && (iFallback = fts5yyFallback[iLookAhead])!=0 ){ |
| 179285 | + fts5YYCODETYPE iFallback; /* Fallback token */ |
| 179286 | + if( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0]) |
| 179287 | + && (iFallback = fts5yyFallback[iLookAhead])!=0 ){ |
| 179212 | 179288 | #ifndef NDEBUG |
| 179213 | | - if( fts5yyTraceFILE ){ |
| 179214 | | - fprintf(fts5yyTraceFILE, "%sFALLBACK %s => %s\n", |
| 179215 | | - fts5yyTracePrompt, fts5yyTokenName[iLookAhead], fts5yyTokenName[iFallback]); |
| 179216 | | - } |
| 179289 | + if( fts5yyTraceFILE ){ |
| 179290 | + fprintf(fts5yyTraceFILE, "%sFALLBACK %s => %s\n", |
| 179291 | + fts5yyTracePrompt, fts5yyTokenName[iLookAhead], fts5yyTokenName[iFallback]); |
| 179292 | + } |
| 179217 | 179293 | #endif |
| 179218 | | - assert( fts5yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ |
| 179219 | | - iLookAhead = iFallback; |
| 179220 | | - continue; |
| 179221 | | - } |
| 179294 | + assert( fts5yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ |
| 179295 | + iLookAhead = iFallback; |
| 179296 | + continue; |
| 179297 | + } |
| 179222 | 179298 | #endif |
| 179223 | 179299 | #ifdef fts5YYWILDCARD |
| 179224 | | - { |
| 179225 | | - int j = i - iLookAhead + fts5YYWILDCARD; |
| 179226 | | - if( |
| 179300 | + { |
| 179301 | + int j = i - iLookAhead + fts5YYWILDCARD; |
| 179302 | + if( |
| 179227 | 179303 | #if fts5YY_SHIFT_MIN+fts5YYWILDCARD<0 |
| 179228 | | - j>=0 && |
| 179304 | + j>=0 && |
| 179229 | 179305 | #endif |
| 179230 | 179306 | #if fts5YY_SHIFT_MAX+fts5YYWILDCARD>=fts5YY_ACTTAB_COUNT |
| 179231 | | - j<fts5YY_ACTTAB_COUNT && |
| 179307 | + j<fts5YY_ACTTAB_COUNT && |
| 179232 | 179308 | #endif |
| 179233 | | - fts5yy_lookahead[j]==fts5YYWILDCARD |
| 179234 | | - ){ |
| 179309 | + fts5yy_lookahead[j]==fts5YYWILDCARD && iLookAhead>0 |
| 179310 | + ){ |
| 179235 | 179311 | #ifndef NDEBUG |
| 179236 | | - if( fts5yyTraceFILE ){ |
| 179237 | | - fprintf(fts5yyTraceFILE, "%sWILDCARD %s => %s\n", |
| 179238 | | - fts5yyTracePrompt, fts5yyTokenName[iLookAhead], |
| 179239 | | - fts5yyTokenName[fts5YYWILDCARD]); |
| 179240 | | - } |
| 179312 | + if( fts5yyTraceFILE ){ |
| 179313 | + fprintf(fts5yyTraceFILE, "%sWILDCARD %s => %s\n", |
| 179314 | + fts5yyTracePrompt, fts5yyTokenName[iLookAhead], |
| 179315 | + fts5yyTokenName[fts5YYWILDCARD]); |
| 179316 | + } |
| 179241 | 179317 | #endif /* NDEBUG */ |
| 179242 | | - return fts5yy_action[j]; |
| 179243 | | - } |
| 179318 | + return fts5yy_action[j]; |
| 179244 | 179319 | } |
| 179320 | + } |
| 179245 | 179321 | #endif /* fts5YYWILDCARD */ |
| 179246 | | - } |
| 179247 | 179322 | return fts5yy_default[stateno]; |
| 179248 | 179323 | }else{ |
| 179249 | 179324 | return fts5yy_action[i]; |
| 179250 | 179325 | } |
| 179251 | 179326 | }while(1); |
| | @@ -179368,34 +179443,36 @@ |
| 179368 | 179443 | */ |
| 179369 | 179444 | static const struct { |
| 179370 | 179445 | fts5YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ |
| 179371 | 179446 | unsigned char nrhs; /* Number of right-hand side symbols in the rule */ |
| 179372 | 179447 | } fts5yyRuleInfo[] = { |
| 179373 | | - { 15, 1 }, |
| 179374 | | - { 16, 3 }, |
| 179375 | | - { 16, 3 }, |
| 179376 | | - { 16, 3 }, |
| 179377 | | - { 16, 3 }, |
| 179378 | 179448 | { 16, 1 }, |
| 179449 | + { 17, 3 }, |
| 179450 | + { 17, 3 }, |
| 179451 | + { 17, 3 }, |
| 179452 | + { 17, 3 }, |
| 179453 | + { 17, 1 }, |
| 179454 | + { 19, 1 }, |
| 179455 | + { 19, 2 }, |
| 179379 | 179456 | { 18, 1 }, |
| 179380 | | - { 18, 2 }, |
| 179381 | | - { 17, 1 }, |
| 179382 | | - { 17, 3 }, |
| 179383 | | - { 20, 3 }, |
| 179384 | | - { 20, 1 }, |
| 179457 | + { 18, 3 }, |
| 179458 | + { 21, 4 }, |
| 179459 | + { 21, 3 }, |
| 179460 | + { 21, 1 }, |
| 179385 | 179461 | { 21, 2 }, |
| 179386 | | - { 21, 1 }, |
| 179387 | | - { 19, 1 }, |
| 179388 | | - { 19, 5 }, |
| 179462 | + { 22, 2 }, |
| 179389 | 179463 | { 22, 1 }, |
| 179390 | | - { 22, 2 }, |
| 179391 | | - { 24, 0 }, |
| 179392 | | - { 24, 2 }, |
| 179393 | | - { 23, 4 }, |
| 179464 | + { 20, 1 }, |
| 179465 | + { 20, 5 }, |
| 179466 | + { 23, 1 }, |
| 179394 | 179467 | { 23, 2 }, |
| 179395 | | - { 25, 1 }, |
| 179396 | 179468 | { 25, 0 }, |
| 179469 | + { 25, 2 }, |
| 179470 | + { 24, 4 }, |
| 179471 | + { 24, 2 }, |
| 179472 | + { 26, 1 }, |
| 179473 | + { 26, 0 }, |
| 179397 | 179474 | }; |
| 179398 | 179475 | |
| 179399 | 179476 | static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */ |
| 179400 | 179477 | |
| 179401 | 179478 | /* |
| | @@ -179456,124 +179533,135 @@ |
| 179456 | 179533 | ** break; |
| 179457 | 179534 | */ |
| 179458 | 179535 | /********** Begin reduce actions **********************************************/ |
| 179459 | 179536 | fts5YYMINORTYPE fts5yylhsminor; |
| 179460 | 179537 | case 0: /* input ::= expr */ |
| 179461 | | -{ sqlite3Fts5ParseFinished(pParse, fts5yymsp[0].minor.fts5yy18); } |
| 179538 | +{ sqlite3Fts5ParseFinished(pParse, fts5yymsp[0].minor.fts5yy24); } |
| 179462 | 179539 | break; |
| 179463 | 179540 | case 1: /* expr ::= expr AND expr */ |
| 179464 | 179541 | { |
| 179465 | | - fts5yylhsminor.fts5yy18 = sqlite3Fts5ParseNode(pParse, FTS5_AND, fts5yymsp[-2].minor.fts5yy18, fts5yymsp[0].minor.fts5yy18, 0); |
| 179542 | + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_AND, fts5yymsp[-2].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24, 0); |
| 179466 | 179543 | } |
| 179467 | | - fts5yymsp[-2].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179544 | + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179468 | 179545 | break; |
| 179469 | 179546 | case 2: /* expr ::= expr OR expr */ |
| 179470 | 179547 | { |
| 179471 | | - fts5yylhsminor.fts5yy18 = sqlite3Fts5ParseNode(pParse, FTS5_OR, fts5yymsp[-2].minor.fts5yy18, fts5yymsp[0].minor.fts5yy18, 0); |
| 179548 | + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_OR, fts5yymsp[-2].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24, 0); |
| 179472 | 179549 | } |
| 179473 | | - fts5yymsp[-2].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179550 | + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179474 | 179551 | break; |
| 179475 | 179552 | case 3: /* expr ::= expr NOT expr */ |
| 179476 | 179553 | { |
| 179477 | | - fts5yylhsminor.fts5yy18 = sqlite3Fts5ParseNode(pParse, FTS5_NOT, fts5yymsp[-2].minor.fts5yy18, fts5yymsp[0].minor.fts5yy18, 0); |
| 179554 | + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_NOT, fts5yymsp[-2].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24, 0); |
| 179478 | 179555 | } |
| 179479 | | - fts5yymsp[-2].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179556 | + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179480 | 179557 | break; |
| 179481 | 179558 | case 4: /* expr ::= LP expr RP */ |
| 179482 | | -{fts5yymsp[-2].minor.fts5yy18 = fts5yymsp[-1].minor.fts5yy18;} |
| 179559 | +{fts5yymsp[-2].minor.fts5yy24 = fts5yymsp[-1].minor.fts5yy24;} |
| 179483 | 179560 | break; |
| 179484 | 179561 | case 5: /* expr ::= exprlist */ |
| 179485 | 179562 | case 6: /* exprlist ::= cnearset */ fts5yytestcase(fts5yyruleno==6); |
| 179486 | | -{fts5yylhsminor.fts5yy18 = fts5yymsp[0].minor.fts5yy18;} |
| 179487 | | - fts5yymsp[0].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179563 | +{fts5yylhsminor.fts5yy24 = fts5yymsp[0].minor.fts5yy24;} |
| 179564 | + fts5yymsp[0].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179488 | 179565 | break; |
| 179489 | 179566 | case 7: /* exprlist ::= exprlist cnearset */ |
| 179490 | 179567 | { |
| 179491 | | - fts5yylhsminor.fts5yy18 = sqlite3Fts5ParseImplicitAnd(pParse, fts5yymsp[-1].minor.fts5yy18, fts5yymsp[0].minor.fts5yy18); |
| 179568 | + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseImplicitAnd(pParse, fts5yymsp[-1].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24); |
| 179492 | 179569 | } |
| 179493 | | - fts5yymsp[-1].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179570 | + fts5yymsp[-1].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179494 | 179571 | break; |
| 179495 | 179572 | case 8: /* cnearset ::= nearset */ |
| 179496 | 179573 | { |
| 179497 | | - fts5yylhsminor.fts5yy18 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy26); |
| 179574 | + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); |
| 179498 | 179575 | } |
| 179499 | | - fts5yymsp[0].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179576 | + fts5yymsp[0].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179500 | 179577 | break; |
| 179501 | 179578 | case 9: /* cnearset ::= colset COLON nearset */ |
| 179502 | 179579 | { |
| 179503 | | - sqlite3Fts5ParseSetColset(pParse, fts5yymsp[0].minor.fts5yy26, fts5yymsp[-2].minor.fts5yy3); |
| 179504 | | - fts5yylhsminor.fts5yy18 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy26); |
| 179505 | | -} |
| 179506 | | - fts5yymsp[-2].minor.fts5yy18 = fts5yylhsminor.fts5yy18; |
| 179507 | | - break; |
| 179508 | | - case 10: /* colset ::= LCP colsetlist RCP */ |
| 179509 | | -{ fts5yymsp[-2].minor.fts5yy3 = fts5yymsp[-1].minor.fts5yy3; } |
| 179510 | | - break; |
| 179511 | | - case 11: /* colset ::= STRING */ |
| 179512 | | -{ |
| 179513 | | - fts5yylhsminor.fts5yy3 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); |
| 179514 | | -} |
| 179515 | | - fts5yymsp[0].minor.fts5yy3 = fts5yylhsminor.fts5yy3; |
| 179516 | | - break; |
| 179517 | | - case 12: /* colsetlist ::= colsetlist STRING */ |
| 179518 | | -{ |
| 179519 | | - fts5yylhsminor.fts5yy3 = sqlite3Fts5ParseColset(pParse, fts5yymsp[-1].minor.fts5yy3, &fts5yymsp[0].minor.fts5yy0); } |
| 179520 | | - fts5yymsp[-1].minor.fts5yy3 = fts5yylhsminor.fts5yy3; |
| 179521 | | - break; |
| 179522 | | - case 13: /* colsetlist ::= STRING */ |
| 179523 | | -{ |
| 179524 | | - fts5yylhsminor.fts5yy3 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); |
| 179525 | | -} |
| 179526 | | - fts5yymsp[0].minor.fts5yy3 = fts5yylhsminor.fts5yy3; |
| 179527 | | - break; |
| 179528 | | - case 14: /* nearset ::= phrase */ |
| 179529 | | -{ fts5yylhsminor.fts5yy26 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy11); } |
| 179530 | | - fts5yymsp[0].minor.fts5yy26 = fts5yylhsminor.fts5yy26; |
| 179531 | | - break; |
| 179532 | | - case 15: /* nearset ::= STRING LP nearphrases neardist_opt RP */ |
| 179580 | + sqlite3Fts5ParseSetColset(pParse, fts5yymsp[0].minor.fts5yy46, fts5yymsp[-2].minor.fts5yy11); |
| 179581 | + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); |
| 179582 | +} |
| 179583 | + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; |
| 179584 | + break; |
| 179585 | + case 10: /* colset ::= MINUS LCP colsetlist RCP */ |
| 179586 | +{ |
| 179587 | + fts5yymsp[-3].minor.fts5yy11 = sqlite3Fts5ParseColsetInvert(pParse, fts5yymsp[-1].minor.fts5yy11); |
| 179588 | +} |
| 179589 | + break; |
| 179590 | + case 11: /* colset ::= LCP colsetlist RCP */ |
| 179591 | +{ fts5yymsp[-2].minor.fts5yy11 = fts5yymsp[-1].minor.fts5yy11; } |
| 179592 | + break; |
| 179593 | + case 12: /* colset ::= STRING */ |
| 179594 | +{ |
| 179595 | + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); |
| 179596 | +} |
| 179597 | + fts5yymsp[0].minor.fts5yy11 = fts5yylhsminor.fts5yy11; |
| 179598 | + break; |
| 179599 | + case 13: /* colset ::= MINUS STRING */ |
| 179600 | +{ |
| 179601 | + fts5yymsp[-1].minor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); |
| 179602 | + fts5yymsp[-1].minor.fts5yy11 = sqlite3Fts5ParseColsetInvert(pParse, fts5yymsp[-1].minor.fts5yy11); |
| 179603 | +} |
| 179604 | + break; |
| 179605 | + case 14: /* colsetlist ::= colsetlist STRING */ |
| 179606 | +{ |
| 179607 | + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, fts5yymsp[-1].minor.fts5yy11, &fts5yymsp[0].minor.fts5yy0); } |
| 179608 | + fts5yymsp[-1].minor.fts5yy11 = fts5yylhsminor.fts5yy11; |
| 179609 | + break; |
| 179610 | + case 15: /* colsetlist ::= STRING */ |
| 179611 | +{ |
| 179612 | + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); |
| 179613 | +} |
| 179614 | + fts5yymsp[0].minor.fts5yy11 = fts5yylhsminor.fts5yy11; |
| 179615 | + break; |
| 179616 | + case 16: /* nearset ::= phrase */ |
| 179617 | +{ fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); } |
| 179618 | + fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46; |
| 179619 | + break; |
| 179620 | + case 17: /* nearset ::= STRING LP nearphrases neardist_opt RP */ |
| 179533 | 179621 | { |
| 179534 | 179622 | sqlite3Fts5ParseNear(pParse, &fts5yymsp[-4].minor.fts5yy0); |
| 179535 | | - sqlite3Fts5ParseSetDistance(pParse, fts5yymsp[-2].minor.fts5yy26, &fts5yymsp[-1].minor.fts5yy0); |
| 179536 | | - fts5yylhsminor.fts5yy26 = fts5yymsp[-2].minor.fts5yy26; |
| 179537 | | -} |
| 179538 | | - fts5yymsp[-4].minor.fts5yy26 = fts5yylhsminor.fts5yy26; |
| 179539 | | - break; |
| 179540 | | - case 16: /* nearphrases ::= phrase */ |
| 179541 | | -{ |
| 179542 | | - fts5yylhsminor.fts5yy26 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy11); |
| 179543 | | -} |
| 179544 | | - fts5yymsp[0].minor.fts5yy26 = fts5yylhsminor.fts5yy26; |
| 179545 | | - break; |
| 179546 | | - case 17: /* nearphrases ::= nearphrases phrase */ |
| 179547 | | -{ |
| 179548 | | - fts5yylhsminor.fts5yy26 = sqlite3Fts5ParseNearset(pParse, fts5yymsp[-1].minor.fts5yy26, fts5yymsp[0].minor.fts5yy11); |
| 179549 | | -} |
| 179550 | | - fts5yymsp[-1].minor.fts5yy26 = fts5yylhsminor.fts5yy26; |
| 179551 | | - break; |
| 179552 | | - case 18: /* neardist_opt ::= */ |
| 179623 | + sqlite3Fts5ParseSetDistance(pParse, fts5yymsp[-2].minor.fts5yy46, &fts5yymsp[-1].minor.fts5yy0); |
| 179624 | + fts5yylhsminor.fts5yy46 = fts5yymsp[-2].minor.fts5yy46; |
| 179625 | +} |
| 179626 | + fts5yymsp[-4].minor.fts5yy46 = fts5yylhsminor.fts5yy46; |
| 179627 | + break; |
| 179628 | + case 18: /* nearphrases ::= phrase */ |
| 179629 | +{ |
| 179630 | + fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); |
| 179631 | +} |
| 179632 | + fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46; |
| 179633 | + break; |
| 179634 | + case 19: /* nearphrases ::= nearphrases phrase */ |
| 179635 | +{ |
| 179636 | + fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, fts5yymsp[-1].minor.fts5yy46, fts5yymsp[0].minor.fts5yy53); |
| 179637 | +} |
| 179638 | + fts5yymsp[-1].minor.fts5yy46 = fts5yylhsminor.fts5yy46; |
| 179639 | + break; |
| 179640 | + case 20: /* neardist_opt ::= */ |
| 179553 | 179641 | { fts5yymsp[1].minor.fts5yy0.p = 0; fts5yymsp[1].minor.fts5yy0.n = 0; } |
| 179554 | 179642 | break; |
| 179555 | | - case 19: /* neardist_opt ::= COMMA STRING */ |
| 179643 | + case 21: /* neardist_opt ::= COMMA STRING */ |
| 179556 | 179644 | { fts5yymsp[-1].minor.fts5yy0 = fts5yymsp[0].minor.fts5yy0; } |
| 179557 | 179645 | break; |
| 179558 | | - case 20: /* phrase ::= phrase PLUS STRING star_opt */ |
| 179559 | | -{ |
| 179560 | | - fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseTerm(pParse, fts5yymsp[-3].minor.fts5yy11, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy20); |
| 179561 | | -} |
| 179562 | | - fts5yymsp[-3].minor.fts5yy11 = fts5yylhsminor.fts5yy11; |
| 179563 | | - break; |
| 179564 | | - case 21: /* phrase ::= STRING star_opt */ |
| 179565 | | -{ |
| 179566 | | - fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseTerm(pParse, 0, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy20); |
| 179567 | | -} |
| 179568 | | - fts5yymsp[-1].minor.fts5yy11 = fts5yylhsminor.fts5yy11; |
| 179569 | | - break; |
| 179570 | | - case 22: /* star_opt ::= STAR */ |
| 179571 | | -{ fts5yymsp[0].minor.fts5yy20 = 1; } |
| 179572 | | - break; |
| 179573 | | - case 23: /* star_opt ::= */ |
| 179574 | | -{ fts5yymsp[1].minor.fts5yy20 = 0; } |
| 179646 | + case 22: /* phrase ::= phrase PLUS STRING star_opt */ |
| 179647 | +{ |
| 179648 | + fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, fts5yymsp[-3].minor.fts5yy53, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4); |
| 179649 | +} |
| 179650 | + fts5yymsp[-3].minor.fts5yy53 = fts5yylhsminor.fts5yy53; |
| 179651 | + break; |
| 179652 | + case 23: /* phrase ::= STRING star_opt */ |
| 179653 | +{ |
| 179654 | + fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, 0, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4); |
| 179655 | +} |
| 179656 | + fts5yymsp[-1].minor.fts5yy53 = fts5yylhsminor.fts5yy53; |
| 179657 | + break; |
| 179658 | + case 24: /* star_opt ::= STAR */ |
| 179659 | +{ fts5yymsp[0].minor.fts5yy4 = 1; } |
| 179660 | + break; |
| 179661 | + case 25: /* star_opt ::= */ |
| 179662 | +{ fts5yymsp[1].minor.fts5yy4 = 0; } |
| 179575 | 179663 | break; |
| 179576 | 179664 | default: |
| 179577 | 179665 | break; |
| 179578 | 179666 | /********** End reduce actions ************************************************/ |
| 179579 | 179667 | }; |
| | @@ -180027,11 +180115,11 @@ |
| 180027 | 180115 | } |
| 180028 | 180116 | |
| 180029 | 180117 | if( p->iRangeEnd>0 && iPos==p->iRangeEnd ){ |
| 180030 | 180118 | fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); |
| 180031 | 180119 | p->iOff = iEndOff; |
| 180032 | | - if( iPos<p->iter.iEnd ){ |
| 180120 | + if( iPos>=p->iter.iStart && iPos<p->iter.iEnd ){ |
| 180033 | 180121 | fts5HighlightAppend(&rc, p, p->zClose, -1); |
| 180034 | 180122 | } |
| 180035 | 180123 | } |
| 180036 | 180124 | |
| 180037 | 180125 | return rc; |
| | @@ -180188,10 +180276,17 @@ |
| 180188 | 180276 | ctx.iRangeEnd = iBestStart + nToken - 1; |
| 180189 | 180277 | |
| 180190 | 180278 | if( iBestStart>0 ){ |
| 180191 | 180279 | fts5HighlightAppend(&rc, &ctx, zEllips, -1); |
| 180192 | 180280 | } |
| 180281 | + |
| 180282 | + /* Advance iterator ctx.iter so that it points to the first coalesced |
| 180283 | + ** phrase instance at or following position iBestStart. */ |
| 180284 | + while( ctx.iter.iStart>=0 && ctx.iter.iStart<iBestStart && rc==SQLITE_OK ){ |
| 180285 | + rc = fts5CInstIterNext(&ctx.iter); |
| 180286 | + } |
| 180287 | + |
| 180193 | 180288 | if( rc==SQLITE_OK ){ |
| 180194 | 180289 | rc = pApi->xTokenize(pFts, ctx.zIn, ctx.nIn, (void*)&ctx,fts5HighlightCb); |
| 180195 | 180290 | } |
| 180196 | 180291 | if( ctx.iRangeEnd>=(nColSize-1) ){ |
| 180197 | 180292 | fts5HighlightAppend(&rc, &ctx, &ctx.zIn[ctx.iOff], ctx.nIn - ctx.iOff); |
| | @@ -181923,10 +182018,11 @@ |
| 181923 | 182018 | case '}': tok = FTS5_RCP; break; |
| 181924 | 182019 | case ':': tok = FTS5_COLON; break; |
| 181925 | 182020 | case ',': tok = FTS5_COMMA; break; |
| 181926 | 182021 | case '+': tok = FTS5_PLUS; break; |
| 181927 | 182022 | case '*': tok = FTS5_STAR; break; |
| 182023 | + case '-': tok = FTS5_MINUS; break; |
| 181928 | 182024 | case '\0': tok = FTS5_EOF; break; |
| 181929 | 182025 | |
| 181930 | 182026 | case '"': { |
| 181931 | 182027 | const char *z2; |
| 181932 | 182028 | tok = FTS5_STRING; |
| | @@ -183414,11 +183510,11 @@ |
| 183414 | 183510 | sizeof(Fts5ExprNearset) + sizeof(Fts5ExprPhrase*)); |
| 183415 | 183511 | } |
| 183416 | 183512 | if( rc==SQLITE_OK ){ |
| 183417 | 183513 | Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; |
| 183418 | 183514 | if( pColsetOrig ){ |
| 183419 | | - int nByte = sizeof(Fts5Colset) + pColsetOrig->nCol * sizeof(int); |
| 183515 | + int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); |
| 183420 | 183516 | Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); |
| 183421 | 183517 | if( pColset ){ |
| 183422 | 183518 | memcpy(pColset, pColsetOrig, nByte); |
| 183423 | 183519 | } |
| 183424 | 183520 | pNew->pRoot->pNear->pColset = pColset; |
| | @@ -183548,10 +183644,38 @@ |
| 183548 | 183644 | #endif |
| 183549 | 183645 | } |
| 183550 | 183646 | |
| 183551 | 183647 | return pNew; |
| 183552 | 183648 | } |
| 183649 | + |
| 183650 | +/* |
| 183651 | +** Allocate and return an Fts5Colset object specifying the inverse of |
| 183652 | +** the colset passed as the second argument. Free the colset passed |
| 183653 | +** as the second argument before returning. |
| 183654 | +*/ |
| 183655 | +static Fts5Colset *sqlite3Fts5ParseColsetInvert(Fts5Parse *pParse, Fts5Colset *p){ |
| 183656 | + Fts5Colset *pRet; |
| 183657 | + int nCol = pParse->pConfig->nCol; |
| 183658 | + |
| 183659 | + pRet = (Fts5Colset*)sqlite3Fts5MallocZero(&pParse->rc, |
| 183660 | + sizeof(Fts5Colset) + sizeof(int)*nCol |
| 183661 | + ); |
| 183662 | + if( pRet ){ |
| 183663 | + int i; |
| 183664 | + int iOld = 0; |
| 183665 | + for(i=0; i<nCol; i++){ |
| 183666 | + if( iOld>=p->nCol || p->aiCol[iOld]!=i ){ |
| 183667 | + pRet->aiCol[pRet->nCol++] = i; |
| 183668 | + }else{ |
| 183669 | + iOld++; |
| 183670 | + } |
| 183671 | + } |
| 183672 | + } |
| 183673 | + |
| 183674 | + sqlite3_free(p); |
| 183675 | + return pRet; |
| 183676 | +} |
| 183553 | 183677 | |
| 183554 | 183678 | static Fts5Colset *sqlite3Fts5ParseColset( |
| 183555 | 183679 | Fts5Parse *pParse, /* Store SQLITE_NOMEM here if required */ |
| 183556 | 183680 | Fts5Colset *pColset, /* Existing colset object */ |
| 183557 | 183681 | Fts5Token *p |
| | @@ -185644,18 +185768,29 @@ |
| 185644 | 185768 | |
| 185645 | 185769 | assert( (pRet==0)==(p->rc!=SQLITE_OK) ); |
| 185646 | 185770 | return pRet; |
| 185647 | 185771 | } |
| 185648 | 185772 | |
| 185649 | | - |
| 185650 | 185773 | /* |
| 185651 | 185774 | ** Release a reference to data record returned by an earlier call to |
| 185652 | 185775 | ** fts5DataRead(). |
| 185653 | 185776 | */ |
| 185654 | 185777 | static void fts5DataRelease(Fts5Data *pData){ |
| 185655 | 185778 | sqlite3_free(pData); |
| 185656 | 185779 | } |
| 185780 | + |
| 185781 | +static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){ |
| 185782 | + Fts5Data *pRet = fts5DataRead(p, iRowid); |
| 185783 | + if( pRet ){ |
| 185784 | + if( pRet->szLeaf>pRet->nn ){ |
| 185785 | + p->rc = FTS5_CORRUPT; |
| 185786 | + fts5DataRelease(pRet); |
| 185787 | + pRet = 0; |
| 185788 | + } |
| 185789 | + } |
| 185790 | + return pRet; |
| 185791 | +} |
| 185657 | 185792 | |
| 185658 | 185793 | static int fts5IndexPrepareStmt( |
| 185659 | 185794 | Fts5Index *p, |
| 185660 | 185795 | sqlite3_stmt **ppStmt, |
| 185661 | 185796 | char *zSql |
| | @@ -186461,11 +186596,11 @@ |
| 186461 | 186596 | pIter->iLeafPgno++; |
| 186462 | 186597 | if( pIter->pNextLeaf ){ |
| 186463 | 186598 | pIter->pLeaf = pIter->pNextLeaf; |
| 186464 | 186599 | pIter->pNextLeaf = 0; |
| 186465 | 186600 | }else if( pIter->iLeafPgno<=pSeg->pgnoLast ){ |
| 186466 | | - pIter->pLeaf = fts5DataRead(p, |
| 186601 | + pIter->pLeaf = fts5LeafRead(p, |
| 186467 | 186602 | FTS5_SEGMENT_ROWID(pSeg->iSegid, pIter->iLeafPgno) |
| 186468 | 186603 | ); |
| 186469 | 186604 | }else{ |
| 186470 | 186605 | pIter->pLeaf = 0; |
| 186471 | 186606 | } |
| | @@ -186964,13 +187099,12 @@ |
| 186964 | 187099 | pIter->iLeafOffset = iOff; |
| 186965 | 187100 | |
| 186966 | 187101 | if( pLeaf->nn>pLeaf->szLeaf ){ |
| 186967 | 187102 | pIter->iPgidxOff = pLeaf->szLeaf + fts5GetVarint32( |
| 186968 | 187103 | &pLeaf->p[pLeaf->szLeaf], pIter->iEndofDoclist |
| 186969 | | - ); |
| 187104 | + ); |
| 186970 | 187105 | } |
| 186971 | | - |
| 186972 | 187106 | } |
| 186973 | 187107 | else if( pLeaf->nn>pLeaf->szLeaf ){ |
| 186974 | 187108 | pIter->iPgidxOff = pLeaf->szLeaf + fts5GetVarint32( |
| 186975 | 187109 | &pLeaf->p[pLeaf->szLeaf], iOff |
| 186976 | 187110 | ); |
| | @@ -187210,10 +187344,15 @@ |
| 187210 | 187344 | } |
| 187211 | 187345 | |
| 187212 | 187346 | iPgidx += fts5GetVarint32(&a[iPgidx], nKeep); |
| 187213 | 187347 | iTermOff += nKeep; |
| 187214 | 187348 | iOff = iTermOff; |
| 187349 | + |
| 187350 | + if( iOff>=n ){ |
| 187351 | + p->rc = FTS5_CORRUPT; |
| 187352 | + return; |
| 187353 | + } |
| 187215 | 187354 | |
| 187216 | 187355 | /* Read the nKeep field of the next term. */ |
| 187217 | 187356 | fts5FastGetVarint32(a, iOff, nKeep); |
| 187218 | 187357 | } |
| 187219 | 187358 | |
| | @@ -188136,10 +188275,19 @@ |
| 188136 | 188275 | fts5BufferZero(&pIter->poslist); |
| 188137 | 188276 | fts5SegiterPoslist(pIter->pIndex, pSeg, 0, &pIter->poslist); |
| 188138 | 188277 | pIter->base.pData = pIter->poslist.p; |
| 188139 | 188278 | } |
| 188140 | 188279 | } |
| 188280 | + |
| 188281 | +/* |
| 188282 | +** xSetOutputs callback used when the Fts5Colset object has nCol==0 (match |
| 188283 | +** against no columns at all). |
| 188284 | +*/ |
| 188285 | +static void fts5IterSetOutputs_ZeroColset(Fts5Iter *pIter, Fts5SegIter *pSeg){ |
| 188286 | + UNUSED_PARAM(pSeg); |
| 188287 | + pIter->base.nData = 0; |
| 188288 | +} |
| 188141 | 188289 | |
| 188142 | 188290 | /* |
| 188143 | 188291 | ** xSetOutputs callback used by detail=col when there is a column filter |
| 188144 | 188292 | ** and there are 100 or more columns. Also called as a fallback from |
| 188145 | 188293 | ** fts5IterSetOutputs_Col100 if the column-list spans more than one page. |
| | @@ -188241,10 +188389,14 @@ |
| 188241 | 188389 | } |
| 188242 | 188390 | |
| 188243 | 188391 | else if( pIter->pColset==0 ){ |
| 188244 | 188392 | pIter->xSetOutputs = fts5IterSetOutputs_Nocolset; |
| 188245 | 188393 | } |
| 188394 | + |
| 188395 | + else if( pIter->pColset->nCol==0 ){ |
| 188396 | + pIter->xSetOutputs = fts5IterSetOutputs_ZeroColset; |
| 188397 | + } |
| 188246 | 188398 | |
| 188247 | 188399 | else if( pConfig->eDetail==FTS5_DETAIL_FULL ){ |
| 188248 | 188400 | pIter->xSetOutputs = fts5IterSetOutputs_Full; |
| 188249 | 188401 | } |
| 188250 | 188402 | |
| | @@ -194018,11 +194170,11 @@ |
| 194018 | 194170 | int nArg, /* Number of args */ |
| 194019 | 194171 | sqlite3_value **apUnused /* Function arguments */ |
| 194020 | 194172 | ){ |
| 194021 | 194173 | assert( nArg==0 ); |
| 194022 | 194174 | UNUSED_PARAM2(nArg, apUnused); |
| 194023 | | - sqlite3_result_text(pCtx, "fts5: 2016-08-11 18:53:32 a12d8059770df4bca59e321c266410344242bf7b", -1, SQLITE_TRANSIENT); |
| 194175 | + sqlite3_result_text(pCtx, "fts5: 2016-08-18 15:21:16 4768a1066cb9c7627064d7efec44188d6755cb03", -1, SQLITE_TRANSIENT); |
| 194024 | 194176 | } |
| 194025 | 194177 | |
| 194026 | 194178 | static int fts5Init(sqlite3 *db){ |
| 194027 | 194179 | static const sqlite3_module fts5Mod = { |
| 194028 | 194180 | /* iVersion */ 2, |
| 194029 | 194181 | |