|
@@ -365,7 +365,7 @@ extern "C" {
|
|
|
*/
|
|
*/
|
|
|
#define SQLITE_VERSION "3.13.0"
|
|
#define SQLITE_VERSION "3.13.0"
|
|
|
#define SQLITE_VERSION_NUMBER 3013000
|
|
#define SQLITE_VERSION_NUMBER 3013000
|
|
|
-#define SQLITE_SOURCE_ID "2016-05-04 21:06:21 71af9ac165ac02272f4886f69bd9ab4770fd7bb6"
|
|
|
|
|
|
|
+#define SQLITE_SOURCE_ID "2016-05-10 20:16:43 223640243efc52c14bb2bb540833a2a624eaa41a"
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
@@ -10038,11 +10038,13 @@ struct Fts5PhraseIter {
|
|
|
** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid
|
|
** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid
|
|
|
**
|
|
**
|
|
|
** with $p set to a phrase equivalent to the phrase iPhrase of the
|
|
** with $p set to a phrase equivalent to the phrase iPhrase of the
|
|
|
-** current query is executed. For each row visited, the callback function
|
|
|
|
|
-** passed as the fourth argument is invoked. The context and API objects
|
|
|
|
|
-** passed to the callback function may be used to access the properties of
|
|
|
|
|
-** each matched row. Invoking Api.xUserData() returns a copy of the pointer
|
|
|
|
|
-** passed as the third argument to pUserData.
|
|
|
|
|
|
|
+** current query is executed. Any column filter that applies to
|
|
|
|
|
+** phrase iPhrase of the current query is included in $p. For each
|
|
|
|
|
+** row visited, the callback function passed as the fourth argument
|
|
|
|
|
+** is invoked. The context and API objects passed to the callback
|
|
|
|
|
+** function may be used to access the properties of each matched row.
|
|
|
|
|
+** Invoking Api.xUserData() returns a copy of the pointer passed as
|
|
|
|
|
+** the third argument to pUserData.
|
|
|
**
|
|
**
|
|
|
** If the callback function returns any value other than SQLITE_OK, the
|
|
** If the callback function returns any value other than SQLITE_OK, the
|
|
|
** query is abandoned and the xQueryPhrase function returns immediately.
|
|
** query is abandoned and the xQueryPhrase function returns immediately.
|
|
@@ -15011,6 +15013,7 @@ struct SrcList {
|
|
|
#define WHERE_REOPEN_IDX 0x1000 /* Try to use OP_ReopenIdx */
|
|
#define WHERE_REOPEN_IDX 0x1000 /* Try to use OP_ReopenIdx */
|
|
|
#define WHERE_ONEPASS_MULTIROW 0x2000 /* ONEPASS is ok with multiple rows */
|
|
#define WHERE_ONEPASS_MULTIROW 0x2000 /* ONEPASS is ok with multiple rows */
|
|
|
#define WHERE_USE_LIMIT 0x4000 /* There is a constant LIMIT clause */
|
|
#define WHERE_USE_LIMIT 0x4000 /* There is a constant LIMIT clause */
|
|
|
|
|
+#define WHERE_SEEK_TABLE 0x8000 /* Do not defer seeks on main table */
|
|
|
|
|
|
|
|
/* Allowed return values from sqlite3WhereIsDistinct()
|
|
/* Allowed return values from sqlite3WhereIsDistinct()
|
|
|
*/
|
|
*/
|
|
@@ -24504,26 +24507,26 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){
|
|
|
** Conversion types fall into various categories as defined by the
|
|
** Conversion types fall into various categories as defined by the
|
|
|
** following enumeration.
|
|
** following enumeration.
|
|
|
*/
|
|
*/
|
|
|
-#define etRADIX 1 /* Integer types. %d, %x, %o, and so forth */
|
|
|
|
|
-#define etFLOAT 2 /* Floating point. %f */
|
|
|
|
|
-#define etEXP 3 /* Exponentional notation. %e and %E */
|
|
|
|
|
-#define etGENERIC 4 /* Floating or exponential, depending on exponent. %g */
|
|
|
|
|
-#define etSIZE 5 /* Return number of characters processed so far. %n */
|
|
|
|
|
-#define etSTRING 6 /* Strings. %s */
|
|
|
|
|
-#define etDYNSTRING 7 /* Dynamically allocated strings. %z */
|
|
|
|
|
-#define etPERCENT 8 /* Percent symbol. %% */
|
|
|
|
|
-#define etCHARX 9 /* Characters. %c */
|
|
|
|
|
|
|
+#define etRADIX 0 /* Integer types. %d, %x, %o, and so forth */
|
|
|
|
|
+#define etFLOAT 1 /* Floating point. %f */
|
|
|
|
|
+#define etEXP 2 /* Exponentional notation. %e and %E */
|
|
|
|
|
+#define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */
|
|
|
|
|
+#define etSIZE 4 /* Return number of characters processed so far. %n */
|
|
|
|
|
+#define etSTRING 5 /* Strings. %s */
|
|
|
|
|
+#define etDYNSTRING 6 /* Dynamically allocated strings. %z */
|
|
|
|
|
+#define etPERCENT 7 /* Percent symbol. %% */
|
|
|
|
|
+#define etCHARX 8 /* Characters. %c */
|
|
|
/* The rest are extensions, not normally found in printf() */
|
|
/* The rest are extensions, not normally found in printf() */
|
|
|
-#define etSQLESCAPE 10 /* Strings with '\'' doubled. %q */
|
|
|
|
|
-#define etSQLESCAPE2 11 /* Strings with '\'' doubled and enclosed in '',
|
|
|
|
|
|
|
+#define etSQLESCAPE 9 /* Strings with '\'' doubled. %q */
|
|
|
|
|
+#define etSQLESCAPE2 10 /* Strings with '\'' doubled and enclosed in '',
|
|
|
NULL pointers replaced by SQL NULL. %Q */
|
|
NULL pointers replaced by SQL NULL. %Q */
|
|
|
-#define etTOKEN 12 /* a pointer to a Token structure */
|
|
|
|
|
-#define etSRCLIST 13 /* a pointer to a SrcList */
|
|
|
|
|
-#define etPOINTER 14 /* The %p conversion */
|
|
|
|
|
-#define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */
|
|
|
|
|
-#define etORDINAL 16 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
|
|
|
|
|
|
|
+#define etTOKEN 11 /* a pointer to a Token structure */
|
|
|
|
|
+#define etSRCLIST 12 /* a pointer to a SrcList */
|
|
|
|
|
+#define etPOINTER 13 /* The %p conversion */
|
|
|
|
|
+#define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */
|
|
|
|
|
+#define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
|
|
|
|
|
|
|
|
-#define etINVALID 0 /* Any unrecognized conversion type */
|
|
|
|
|
|
|
+#define etINVALID 16 /* Any unrecognized conversion type */
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -24678,7 +24681,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf(
|
|
|
etByte flag_long; /* True if "l" flag is present */
|
|
etByte flag_long; /* True if "l" flag is present */
|
|
|
etByte flag_longlong; /* True if the "ll" flag is present */
|
|
etByte flag_longlong; /* True if the "ll" flag is present */
|
|
|
etByte done; /* Loop termination flag */
|
|
etByte done; /* Loop termination flag */
|
|
|
- etByte xtype = 0; /* Conversion paradigm */
|
|
|
|
|
|
|
+ etByte xtype = etINVALID; /* Conversion paradigm */
|
|
|
u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */
|
|
u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */
|
|
|
u8 useIntern; /* Ok to use internal conversions (ex: %T) */
|
|
u8 useIntern; /* Ok to use internal conversions (ex: %T) */
|
|
|
char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
|
|
char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
|
|
@@ -52838,8 +52841,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i
|
|
|
** to exist, in case the transaction needs to roll back. Use pPgOld
|
|
** to exist, in case the transaction needs to roll back. Use pPgOld
|
|
|
** as the original page since it has already been allocated.
|
|
** as the original page since it has already been allocated.
|
|
|
*/
|
|
*/
|
|
|
- if( pPager->tempFile ){
|
|
|
|
|
- assert( pPgOld );
|
|
|
|
|
|
|
+ if( pPager->tempFile && pPgOld ){
|
|
|
sqlite3PcacheMove(pPgOld, origPgno);
|
|
sqlite3PcacheMove(pPgOld, origPgno);
|
|
|
sqlite3PagerUnrefNotNull(pPgOld);
|
|
sqlite3PagerUnrefNotNull(pPgOld);
|
|
|
}
|
|
}
|
|
@@ -59459,11 +59461,11 @@ static int decodeFlags(MemPage *pPage, int flagByte){
|
|
|
pPage->xCellSize = cellSizePtr;
|
|
pPage->xCellSize = cellSizePtr;
|
|
|
pBt = pPage->pBt;
|
|
pBt = pPage->pBt;
|
|
|
if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
|
|
if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
|
|
|
- /* EVIDENCE-OF: R-03640-13415 A value of 5 means the page is an interior
|
|
|
|
|
- ** table b-tree page. */
|
|
|
|
|
|
|
+ /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an
|
|
|
|
|
+ ** interior table b-tree page. */
|
|
|
assert( (PTF_LEAFDATA|PTF_INTKEY)==5 );
|
|
assert( (PTF_LEAFDATA|PTF_INTKEY)==5 );
|
|
|
- /* EVIDENCE-OF: R-20501-61796 A value of 13 means the page is a leaf
|
|
|
|
|
- ** table b-tree page. */
|
|
|
|
|
|
|
+ /* EVIDENCE-OF: R-26900-09176 A value of 13 (0x0d) means the page is a
|
|
|
|
|
+ ** leaf table b-tree page. */
|
|
|
assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 );
|
|
assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 );
|
|
|
pPage->intKey = 1;
|
|
pPage->intKey = 1;
|
|
|
if( pPage->leaf ){
|
|
if( pPage->leaf ){
|
|
@@ -59477,11 +59479,11 @@ static int decodeFlags(MemPage *pPage, int flagByte){
|
|
|
pPage->maxLocal = pBt->maxLeaf;
|
|
pPage->maxLocal = pBt->maxLeaf;
|
|
|
pPage->minLocal = pBt->minLeaf;
|
|
pPage->minLocal = pBt->minLeaf;
|
|
|
}else if( flagByte==PTF_ZERODATA ){
|
|
}else if( flagByte==PTF_ZERODATA ){
|
|
|
- /* EVIDENCE-OF: R-27225-53936 A value of 2 means the page is an interior
|
|
|
|
|
- ** index b-tree page. */
|
|
|
|
|
|
|
+ /* EVIDENCE-OF: R-43316-37308 A value of 2 (0x02) means the page is an
|
|
|
|
|
+ ** interior index b-tree page. */
|
|
|
assert( (PTF_ZERODATA)==2 );
|
|
assert( (PTF_ZERODATA)==2 );
|
|
|
- /* EVIDENCE-OF: R-16571-11615 A value of 10 means the page is a leaf
|
|
|
|
|
- ** index b-tree page. */
|
|
|
|
|
|
|
+ /* EVIDENCE-OF: R-59615-42828 A value of 10 (0x0a) means the page is a
|
|
|
|
|
+ ** leaf index b-tree page. */
|
|
|
assert( (PTF_ZERODATA|PTF_LEAF)==10 );
|
|
assert( (PTF_ZERODATA|PTF_LEAF)==10 );
|
|
|
pPage->intKey = 0;
|
|
pPage->intKey = 0;
|
|
|
pPage->intKeyLeaf = 0;
|
|
pPage->intKeyLeaf = 0;
|
|
@@ -98050,16 +98052,10 @@ SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){
|
|
|
** db parameter can be used with db->pnBytesFreed to measure the memory
|
|
** db parameter can be used with db->pnBytesFreed to measure the memory
|
|
|
** used by the Table object.
|
|
** used by the Table object.
|
|
|
*/
|
|
*/
|
|
|
-SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
|
|
|
|
|
|
+static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){
|
|
|
Index *pIndex, *pNext;
|
|
Index *pIndex, *pNext;
|
|
|
TESTONLY( int nLookaside; ) /* Used to verify lookaside not used for schema */
|
|
TESTONLY( int nLookaside; ) /* Used to verify lookaside not used for schema */
|
|
|
|
|
|
|
|
- assert( !pTable || pTable->nRef>0 );
|
|
|
|
|
-
|
|
|
|
|
- /* Do not delete the table until the reference count reaches zero. */
|
|
|
|
|
- if( !pTable ) return;
|
|
|
|
|
- if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
|
|
|
|
|
-
|
|
|
|
|
/* Record the number of outstanding lookaside allocations in schema Tables
|
|
/* Record the number of outstanding lookaside allocations in schema Tables
|
|
|
** prior to doing any free() operations. Since schema Tables do not use
|
|
** prior to doing any free() operations. Since schema Tables do not use
|
|
|
** lookaside, this number should not change. */
|
|
** lookaside, this number should not change. */
|
|
@@ -98099,6 +98095,13 @@ SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
|
|
/* Verify that no lookaside memory was used by schema tables */
|
|
/* Verify that no lookaside memory was used by schema tables */
|
|
|
assert( nLookaside==0 || nLookaside==db->lookaside.nOut );
|
|
assert( nLookaside==0 || nLookaside==db->lookaside.nOut );
|
|
|
}
|
|
}
|
|
|
|
|
+SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
|
|
|
|
+ /* Do not delete the table until the reference count reaches zero. */
|
|
|
|
|
+ if( !pTable ) return;
|
|
|
|
|
+ if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
|
|
|
|
|
+ deleteTable(db, pTable);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
** Unlink the given table from the hash tables and the delete the
|
|
** Unlink the given table from the hash tables and the delete the
|
|
@@ -99703,7 +99706,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
|
|
|
pTable->nCol = 0;
|
|
pTable->nCol = 0;
|
|
|
nErr++;
|
|
nErr++;
|
|
|
}
|
|
}
|
|
|
- if( pSelTab ) sqlite3DeleteTable(db, pSelTab);
|
|
|
|
|
|
|
+ sqlite3DeleteTable(db, pSelTab);
|
|
|
sqlite3SelectDelete(db, pSel);
|
|
sqlite3SelectDelete(db, pSel);
|
|
|
db->lookaside.bDisable--;
|
|
db->lookaside.bDisable--;
|
|
|
} else {
|
|
} else {
|
|
@@ -102773,7 +102776,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom(
|
|
|
}else
|
|
}else
|
|
|
#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
|
|
#endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
|
|
|
{
|
|
{
|
|
|
- u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK;
|
|
|
|
|
|
|
+ u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK|WHERE_SEEK_TABLE;
|
|
|
if( sNC.ncFlags & NC_VarSelect ) bComplex = 1;
|
|
if( sNC.ncFlags & NC_VarSelect ) bComplex = 1;
|
|
|
wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW);
|
|
wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW);
|
|
|
if( HasRowid(pTab) ){
|
|
if( HasRowid(pTab) ){
|
|
@@ -120940,7 +120943,8 @@ SQLITE_PRIVATE void sqlite3Update(
|
|
|
if( HasRowid(pTab) ){
|
|
if( HasRowid(pTab) ){
|
|
|
sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid);
|
|
sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid);
|
|
|
pWInfo = sqlite3WhereBegin(
|
|
pWInfo = sqlite3WhereBegin(
|
|
|
- pParse, pTabList, pWhere, 0, 0, WHERE_ONEPASS_DESIRED, iIdxCur
|
|
|
|
|
|
|
+ pParse, pTabList, pWhere, 0, 0,
|
|
|
|
|
+ WHERE_ONEPASS_DESIRED | WHERE_SEEK_TABLE, iIdxCur
|
|
|
);
|
|
);
|
|
|
if( pWInfo==0 ) goto update_cleanup;
|
|
if( pWInfo==0 ) goto update_cleanup;
|
|
|
okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
|
|
okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
|
|
@@ -124877,7 +124881,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|
|
if( omitTable ){
|
|
if( omitTable ){
|
|
|
/* pIdx is a covering index. No need to access the main table. */
|
|
/* pIdx is a covering index. No need to access the main table. */
|
|
|
}else if( HasRowid(pIdx->pTable) ){
|
|
}else if( HasRowid(pIdx->pTable) ){
|
|
|
- if( pWInfo->eOnePass!=ONEPASS_OFF ){
|
|
|
|
|
|
|
+ if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE)!=0 ){
|
|
|
iRowidReg = ++pParse->nMem;
|
|
iRowidReg = ++pParse->nMem;
|
|
|
sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg);
|
|
sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg);
|
|
|
sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
|
|
sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
|
|
@@ -125073,7 +125077,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|
|
wctrlFlags = WHERE_OMIT_OPEN_CLOSE
|
|
wctrlFlags = WHERE_OMIT_OPEN_CLOSE
|
|
|
| WHERE_FORCE_TABLE
|
|
| WHERE_FORCE_TABLE
|
|
|
| WHERE_ONETABLE_ONLY
|
|
| WHERE_ONETABLE_ONLY
|
|
|
- | WHERE_NO_AUTOINDEX;
|
|
|
|
|
|
|
+ | WHERE_NO_AUTOINDEX
|
|
|
|
|
+ | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE);
|
|
|
for(ii=0; ii<pOrWc->nTerm; ii++){
|
|
for(ii=0; ii<pOrWc->nTerm; ii++){
|
|
|
WhereTerm *pOrTerm = &pOrWc->a[ii];
|
|
WhereTerm *pOrTerm = &pOrWc->a[ii];
|
|
|
if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){
|
|
if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){
|
|
@@ -126962,7 +126967,10 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
|
|
|
**
|
|
**
|
|
|
** The scanner will be searching the WHERE clause pWC. It will look
|
|
** The scanner will be searching the WHERE clause pWC. It will look
|
|
|
** for terms of the form "X <op> <expr>" where X is column iColumn of table
|
|
** for terms of the form "X <op> <expr>" where X is column iColumn of table
|
|
|
-** iCur. The <op> must be one of the operators described by opMask.
|
|
|
|
|
|
|
+** iCur. Or if pIdx!=0 then X is column iColumn of index pIdx. pIdx
|
|
|
|
|
+** must be one of the indexes of table iCur.
|
|
|
|
|
+**
|
|
|
|
|
+** The <op> must be one of the operators described by opMask.
|
|
|
**
|
|
**
|
|
|
** If the search is for X and the WHERE clause contains terms of the
|
|
** If the search is for X and the WHERE clause contains terms of the
|
|
|
** form X=Y then this routine might also return terms of the form
|
|
** form X=Y then this routine might also return terms of the form
|
|
@@ -127010,11 +127018,12 @@ static WhereTerm *whereScanInit(
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
** Search for a term in the WHERE clause that is of the form "X <op> <expr>"
|
|
** Search for a term in the WHERE clause that is of the form "X <op> <expr>"
|
|
|
-** where X is a reference to the iColumn of table iCur and <op> is one of
|
|
|
|
|
-** the WO_xx operator codes specified by the op parameter.
|
|
|
|
|
-** Return a pointer to the term. Return 0 if not found.
|
|
|
|
|
|
|
+** where X is a reference to the iColumn of table iCur or of index pIdx
|
|
|
|
|
+** if pIdx!=0 and <op> is one of the WO_xx operator codes specified by
|
|
|
|
|
+** the op parameter. Return a pointer to the term. Return 0 if not found.
|
|
|
**
|
|
**
|
|
|
-** If pIdx!=0 then search for terms matching the iColumn-th column of pIdx
|
|
|
|
|
|
|
+** If pIdx!=0 then it must be one of the indexes of table iCur.
|
|
|
|
|
+** Search for terms matching the iColumn-th column of pIdx
|
|
|
** rather than the iColumn-th column of table iCur.
|
|
** rather than the iColumn-th column of table iCur.
|
|
|
**
|
|
**
|
|
|
** The term returned might by Y=<expr> if there is another constraint in
|
|
** The term returned might by Y=<expr> if there is another constraint in
|
|
@@ -179051,11 +179060,13 @@ struct Fts5PhraseIter {
|
|
|
** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid
|
|
** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid
|
|
|
**
|
|
**
|
|
|
** with $p set to a phrase equivalent to the phrase iPhrase of the
|
|
** with $p set to a phrase equivalent to the phrase iPhrase of the
|
|
|
-** current query is executed. For each row visited, the callback function
|
|
|
|
|
-** passed as the fourth argument is invoked. The context and API objects
|
|
|
|
|
-** passed to the callback function may be used to access the properties of
|
|
|
|
|
-** each matched row. Invoking Api.xUserData() returns a copy of the pointer
|
|
|
|
|
-** passed as the third argument to pUserData.
|
|
|
|
|
|
|
+** current query is executed. Any column filter that applies to
|
|
|
|
|
+** phrase iPhrase of the current query is included in $p. For each
|
|
|
|
|
+** row visited, the callback function passed as the fourth argument
|
|
|
|
|
+** is invoked. The context and API objects passed to the callback
|
|
|
|
|
+** function may be used to access the properties of each matched row.
|
|
|
|
|
+** Invoking Api.xUserData() returns a copy of the pointer passed as
|
|
|
|
|
+** the third argument to pUserData.
|
|
|
**
|
|
**
|
|
|
** If the callback function returns any value other than SQLITE_OK, the
|
|
** If the callback function returns any value other than SQLITE_OK, the
|
|
|
** query is abandoned and the xQueryPhrase function returns immediately.
|
|
** query is abandoned and the xQueryPhrase function returns immediately.
|
|
@@ -185090,6 +185101,17 @@ static int sqlite3Fts5ExprClonePhrase(
|
|
|
pNew->pRoot->pNear = (Fts5ExprNearset*)sqlite3Fts5MallocZero(&rc,
|
|
pNew->pRoot->pNear = (Fts5ExprNearset*)sqlite3Fts5MallocZero(&rc,
|
|
|
sizeof(Fts5ExprNearset) + sizeof(Fts5ExprPhrase*));
|
|
sizeof(Fts5ExprNearset) + sizeof(Fts5ExprPhrase*));
|
|
|
}
|
|
}
|
|
|
|
|
+ if( rc==SQLITE_OK ){
|
|
|
|
|
+ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset;
|
|
|
|
|
+ if( pColsetOrig ){
|
|
|
|
|
+ int nByte = sizeof(Fts5Colset) + pColsetOrig->nCol * sizeof(int);
|
|
|
|
|
+ Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte);
|
|
|
|
|
+ if( pColset ){
|
|
|
|
|
+ memcpy(pColset, pColsetOrig, nByte);
|
|
|
|
|
+ }
|
|
|
|
|
+ pNew->pRoot->pNear->pColset = pColset;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
for(i=0; rc==SQLITE_OK && i<pOrig->nTerm; i++){
|
|
for(i=0; rc==SQLITE_OK && i<pOrig->nTerm; i++){
|
|
|
int tflags = 0;
|
|
int tflags = 0;
|
|
@@ -195698,7 +195720,7 @@ static void fts5SourceIdFunc(
|
|
|
){
|
|
){
|
|
|
assert( nArg==0 );
|
|
assert( nArg==0 );
|
|
|
UNUSED_PARAM2(nArg, apUnused);
|
|
UNUSED_PARAM2(nArg, apUnused);
|
|
|
- sqlite3_result_text(pCtx, "fts5: 2016-04-30 19:23:10 820c57bb24ad3d8663ca512e4022268b940bb2ee", -1, SQLITE_TRANSIENT);
|
|
|
|
|
|
|
+ sqlite3_result_text(pCtx, "fts5: 2016-05-10 20:16:43 223640243efc52c14bb2bb540833a2a624eaa41a", -1, SQLITE_TRANSIENT);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static int fts5Init(sqlite3 *db){
|
|
static int fts5Init(sqlite3 *db){
|