Fossil SCM

Merge updates from trunk.

mistachkin 2015-04-09 02:19 UTC mvAndRmFiles merge
Commit 0060d07ddf593655aea0e933f96808981f8c5f52
3 files changed +9 -2 +99 -20 +1 -1
+9 -2
--- src/checkin.c
+++ src/checkin.c
@@ -1840,11 +1840,10 @@
18401840
" AND value=%Q", TAG_BRANCH, vid, sCiInfo.zBranch))
18411841
){
18421842
fossil_fatal("cannot commit against a closed leaf");
18431843
}
18441844
1845
- if( useCksum ) vfile_aggregate_checksum_disk(vid, &cksum1);
18461845
if( zComment ){
18471846
blob_zero(&comment);
18481847
blob_append(&comment, zComment, -1);
18491848
}else if( zComFile ){
18501849
blob_zero(&comment);
@@ -1874,11 +1873,19 @@
18741873
db_multi_exec("REPLACE INTO vvar VALUES('ci-comment',%B)", &comment);
18751874
db_end_transaction(0);
18761875
db_begin_transaction();
18771876
}
18781877
1879
- /* Step 1: Insert records for all modified files into the blob
1878
+ /*
1879
+ ** Step 1: Compute an aggregate MD5 checksum over the disk image
1880
+ ** of every file in vid. The file names are part of the checksum.
1881
+ ** The resulting checksum is the same as is expected on the R-card
1882
+ ** of a manifest.
1883
+ */
1884
+ if( useCksum ) vfile_aggregate_checksum_disk(vid, &cksum1);
1885
+
1886
+ /* Step 2: Insert records for all modified files into the blob
18801887
** table. If there were arguments passed to this command, only
18811888
** the identified files are inserted (if they have been modified).
18821889
*/
18831890
db_prepare(&q,
18841891
"SELECT id, %Q || pathname, mrid, %s, chnged, %s, %s FROM vfile "
18851892
--- src/checkin.c
+++ src/checkin.c
@@ -1840,11 +1840,10 @@
1840 " AND value=%Q", TAG_BRANCH, vid, sCiInfo.zBranch))
1841 ){
1842 fossil_fatal("cannot commit against a closed leaf");
1843 }
1844
1845 if( useCksum ) vfile_aggregate_checksum_disk(vid, &cksum1);
1846 if( zComment ){
1847 blob_zero(&comment);
1848 blob_append(&comment, zComment, -1);
1849 }else if( zComFile ){
1850 blob_zero(&comment);
@@ -1874,11 +1873,19 @@
1874 db_multi_exec("REPLACE INTO vvar VALUES('ci-comment',%B)", &comment);
1875 db_end_transaction(0);
1876 db_begin_transaction();
1877 }
1878
1879 /* Step 1: Insert records for all modified files into the blob
 
 
 
 
 
 
 
 
1880 ** table. If there were arguments passed to this command, only
1881 ** the identified files are inserted (if they have been modified).
1882 */
1883 db_prepare(&q,
1884 "SELECT id, %Q || pathname, mrid, %s, chnged, %s, %s FROM vfile "
1885
--- src/checkin.c
+++ src/checkin.c
@@ -1840,11 +1840,10 @@
1840 " AND value=%Q", TAG_BRANCH, vid, sCiInfo.zBranch))
1841 ){
1842 fossil_fatal("cannot commit against a closed leaf");
1843 }
1844
 
1845 if( zComment ){
1846 blob_zero(&comment);
1847 blob_append(&comment, zComment, -1);
1848 }else if( zComFile ){
1849 blob_zero(&comment);
@@ -1874,11 +1873,19 @@
1873 db_multi_exec("REPLACE INTO vvar VALUES('ci-comment',%B)", &comment);
1874 db_end_transaction(0);
1875 db_begin_transaction();
1876 }
1877
1878 /*
1879 ** Step 1: Compute an aggregate MD5 checksum over the disk image
1880 ** of every file in vid. The file names are part of the checksum.
1881 ** The resulting checksum is the same as is expected on the R-card
1882 ** of a manifest.
1883 */
1884 if( useCksum ) vfile_aggregate_checksum_disk(vid, &cksum1);
1885
1886 /* Step 2: Insert records for all modified files into the blob
1887 ** table. If there were arguments passed to this command, only
1888 ** the identified files are inserted (if they have been modified).
1889 */
1890 db_prepare(&q,
1891 "SELECT id, %Q || pathname, mrid, %s, chnged, %s, %s FROM vfile "
1892
+99 -20
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -317,11 +317,11 @@
317317
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
318318
** [sqlite_version()] and [sqlite_source_id()].
319319
*/
320320
#define SQLITE_VERSION "3.8.9"
321321
#define SQLITE_VERSION_NUMBER 3008009
322
-#define SQLITE_SOURCE_ID "2015-04-03 20:33:33 4ae9a3acc4eeeb7998769eb856c97c2233476f72"
322
+#define SQLITE_SOURCE_ID "2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09"
323323
324324
/*
325325
** CAPI3REF: Run-Time Library Version Numbers
326326
** KEYWORDS: sqlite3_version, sqlite3_sourceid
327327
**
@@ -12226,10 +12226,11 @@
1222612226
#define SF_AllValues 0x0100 /* All terms of compound are VALUES */
1222712227
#define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */
1222812228
#define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */
1222912229
#define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */
1223012230
#define SF_MinMaxAgg 0x1000 /* Aggregate containing min() or max() */
12231
+#define SF_Converted 0x2000 /* By convertCompoundSelectToSubquery() */
1223112232
1223212233
1223312234
/*
1223412235
** The results of a SELECT can be distributed in several ways, as defined
1223512236
** by one of the following macros. The "SRT" prefix means "SELECT Result
@@ -21523,19 +21524,23 @@
2152321524
}else{
2152421525
width = va_arg(ap,int);
2152521526
}
2152621527
if( width<0 ){
2152721528
flag_leftjustify = 1;
21528
- width = -width;
21529
+ width = width >= -2147483647 ? -width : 0;
2152921530
}
2153021531
c = *++fmt;
2153121532
}else{
21533
+ unsigned wx = 0;
2153221534
while( c>='0' && c<='9' ){
21533
- width = width*10 + c - '0';
21535
+ wx = wx*10 + c - '0';
2153421536
c = *++fmt;
2153521537
}
21538
+ testcase( wx>0x7fffffff );
21539
+ width = wx & 0x7fffffff;
2153621540
}
21541
+
2153721542
/* Get the precision */
2153821543
if( c=='.' ){
2153921544
precision = 0;
2154021545
c = *++fmt;
2154121546
if( c=='*' ){
@@ -21542,17 +21547,22 @@
2154221547
if( bArgList ){
2154321548
precision = (int)getIntArg(pArgList);
2154421549
}else{
2154521550
precision = va_arg(ap,int);
2154621551
}
21547
- if( precision<0 ) precision = -precision;
2154821552
c = *++fmt;
21553
+ if( precision<0 ){
21554
+ precision = precision >= -2147483647 ? -precision : -1;
21555
+ }
2154921556
}else{
21557
+ unsigned px = 0;
2155021558
while( c>='0' && c<='9' ){
21551
- precision = precision*10 + c - '0';
21559
+ px = px*10 + c - '0';
2155221560
c = *++fmt;
2155321561
}
21562
+ testcase( px>0x7fffffff );
21563
+ precision = px & 0x7fffffff;
2155421564
}
2155521565
}else{
2155621566
precision = -1;
2155721567
}
2155821568
/* Get the conversion type modifier */
@@ -21712,11 +21722,12 @@
2171221722
if( flag_plussign ) prefix = '+';
2171321723
else if( flag_blanksign ) prefix = ' ';
2171421724
else prefix = 0;
2171521725
}
2171621726
if( xtype==etGENERIC && precision>0 ) precision--;
21717
- for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){}
21727
+ testcase( precision>0xfff );
21728
+ for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){}
2171821729
if( xtype==etFLOAT ) realvalue += rounder;
2171921730
/* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
2172021731
exp = 0;
2172121732
if( sqlite3IsNaN((double)realvalue) ){
2172221733
bufpt = "NaN";
@@ -21767,12 +21778,13 @@
2176721778
if( xtype==etEXP ){
2176821779
e2 = 0;
2176921780
}else{
2177021781
e2 = exp;
2177121782
}
21772
- if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){
21773
- bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 );
21783
+ if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){
21784
+ bufpt = zExtra
21785
+ = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 );
2177421786
if( bufpt==0 ){
2177521787
setStrAccumError(pAccum, STRACCUM_NOMEM);
2177621788
return;
2177721789
}
2177821790
}
@@ -22000,11 +22012,11 @@
2200022012
** Return the number of bytes of text that StrAccum is able to accept
2200122013
** after the attempted enlargement. The value returned might be zero.
2200222014
*/
2200322015
static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
2200422016
char *zNew;
22005
- assert( p->nChar+N >= p->nAlloc ); /* Only called if really needed */
22017
+ assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */
2200622018
if( p->accError ){
2200722019
testcase(p->accError==STRACCUM_TOOBIG);
2200822020
testcase(p->accError==STRACCUM_NOMEM);
2200922021
return 0;
2201022022
}
@@ -22049,11 +22061,14 @@
2204922061
2205022062
/*
2205122063
** Append N copies of character c to the given string buffer.
2205222064
*/
2205322065
SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
22054
- if( p->nChar+N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ) return;
22066
+ testcase( p->nChar + (i64)N > 0x7fffffff );
22067
+ if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){
22068
+ return;
22069
+ }
2205522070
while( (N--)>0 ) p->zText[p->nChar++] = c;
2205622071
}
2205722072
2205822073
/*
2205922074
** The StrAccum "p" is not large enough to accept N new bytes of z[].
@@ -82115,10 +82130,24 @@
8211582130
sNC.pParse = pParse;
8211682131
if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
8211782132
sqlite3ResolveExprNames(&sNC, p->pOffset) ){
8211882133
return WRC_Abort;
8211982134
}
82135
+
82136
+ /* If the SF_Converted flags is set, then this Select object was
82137
+ ** was created by the convertCompoundSelectToSubquery() function.
82138
+ ** In this case the ORDER BY clause (p->pOrderBy) should be resolved
82139
+ ** as if it were part of the sub-query, not the parent. This block
82140
+ ** moves the pOrderBy down to the sub-query. It will be moved back
82141
+ ** after the names have been resolved. */
82142
+ if( p->selFlags & SF_Converted ){
82143
+ Select *pSub = p->pSrc->a[0].pSelect;
82144
+ assert( p->pSrc->nSrc==1 && isCompound==0 && p->pOrderBy );
82145
+ assert( pSub->pPrior && pSub->pOrderBy==0 );
82146
+ pSub->pOrderBy = p->pOrderBy;
82147
+ p->pOrderBy = 0;
82148
+ }
8212082149
8212182150
/* Recursively resolve names in all subqueries
8212282151
*/
8212382152
for(i=0; i<p->pSrc->nSrc; i++){
8212482153
struct SrcList_item *pItem = &p->pSrc->a[i];
@@ -82196,10 +82225,21 @@
8219682225
/* The ORDER BY and GROUP BY clauses may not refer to terms in
8219782226
** outer queries
8219882227
*/
8219982228
sNC.pNext = 0;
8220082229
sNC.ncFlags |= NC_AllowAgg;
82230
+
82231
+ /* If this is a converted compound query, move the ORDER BY clause from
82232
+ ** the sub-query back to the parent query. At this point each term
82233
+ ** within the ORDER BY clause has been transformed to an integer value.
82234
+ ** These integers will be replaced by copies of the corresponding result
82235
+ ** set expressions by the call to resolveOrderGroupBy() below. */
82236
+ if( p->selFlags & SF_Converted ){
82237
+ Select *pSub = p->pSrc->a[0].pSelect;
82238
+ p->pOrderBy = pSub->pOrderBy;
82239
+ pSub->pOrderBy = 0;
82240
+ }
8220182241
8220282242
/* Process the ORDER BY clause for singleton SELECT statements.
8220382243
** The ORDER BY clause for compounds SELECT statements is handled
8220482244
** below, after all of the result-sets for all of the elements of
8220582245
** the compound have been resolved.
@@ -109909,10 +109949,12 @@
109909109949
pNew->pHaving = 0;
109910109950
pNew->pOrderBy = 0;
109911109951
p->pPrior = 0;
109912109952
p->pNext = 0;
109913109953
p->selFlags &= ~SF_Compound;
109954
+ assert( (p->selFlags & SF_Converted)==0 );
109955
+ p->selFlags |= SF_Converted;
109914109956
assert( pNew->pPrior!=0 );
109915109957
pNew->pPrior->pNext = pNew;
109916109958
pNew->pLimit = 0;
109917109959
pNew->pOffset = 0;
109918109960
return WRC_Continue;
@@ -134980,30 +135022,37 @@
134980135022
** parameter bDescDoclist should be false. If they are sorted in ascending
134981135023
** order, it should be passed a non-zero value.
134982135024
**
134983135025
** The right-hand input doclist is overwritten by this function.
134984135026
*/
134985
-static void fts3DoclistPhraseMerge(
135027
+static int fts3DoclistPhraseMerge(
134986135028
int bDescDoclist, /* True if arguments are desc */
134987135029
int nDist, /* Distance from left to right (1=adjacent) */
134988135030
char *aLeft, int nLeft, /* Left doclist */
134989
- char *aRight, int *pnRight /* IN/OUT: Right/output doclist */
135031
+ char **paRight, int *pnRight /* IN/OUT: Right/output doclist */
134990135032
){
134991135033
sqlite3_int64 i1 = 0;
134992135034
sqlite3_int64 i2 = 0;
134993135035
sqlite3_int64 iPrev = 0;
135036
+ char *aRight = *paRight;
134994135037
char *pEnd1 = &aLeft[nLeft];
134995135038
char *pEnd2 = &aRight[*pnRight];
134996135039
char *p1 = aLeft;
134997135040
char *p2 = aRight;
134998135041
char *p;
134999135042
int bFirstOut = 0;
135000
- char *aOut = aRight;
135043
+ char *aOut;
135001135044
135002135045
assert( nDist>0 );
135003
-
135046
+ if( bDescDoclist ){
135047
+ aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX);
135048
+ if( aOut==0 ) return SQLITE_NOMEM;
135049
+ }else{
135050
+ aOut = aRight;
135051
+ }
135004135052
p = aOut;
135053
+
135005135054
fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
135006135055
fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
135007135056
135008135057
while( p1 && p2 ){
135009135058
sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
@@ -135028,10 +135077,16 @@
135028135077
fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
135029135078
}
135030135079
}
135031135080
135032135081
*pnRight = (int)(p - aOut);
135082
+ if( bDescDoclist ){
135083
+ sqlite3_free(aRight);
135084
+ *paRight = aOut;
135085
+ }
135086
+
135087
+ return SQLITE_OK;
135033135088
}
135034135089
135035135090
/*
135036135091
** Argument pList points to a position list nList bytes in size. This
135037135092
** function checks to see if the position list contains any entries for
@@ -135152,12 +135207,26 @@
135152135207
char *aDoclist, /* Pointer to doclist */
135153135208
int nDoclist /* Size of aDoclist in bytes */
135154135209
){
135155135210
if( pTS->aaOutput[0]==0 ){
135156135211
/* If this is the first term selected, copy the doclist to the output
135157
- ** buffer using memcpy(). */
135158
- pTS->aaOutput[0] = sqlite3_malloc(nDoclist);
135212
+ ** buffer using memcpy().
135213
+ **
135214
+ ** Add FTS3_VARINT_MAX bytes of unused space to the end of the
135215
+ ** allocation. This is so as to ensure that the buffer is big enough
135216
+ ** to hold the current doclist AND'd with any other doclist. If the
135217
+ ** doclists are stored in order=ASC order, this padding would not be
135218
+ ** required (since the size of [doclistA AND doclistB] is always less
135219
+ ** than or equal to the size of [doclistA] in that case). But this is
135220
+ ** not true for order=DESC. For example, a doclist containing (1, -1)
135221
+ ** may be smaller than (-1), as in the first example the -1 may be stored
135222
+ ** as a single-byte delta, whereas in the second it must be stored as a
135223
+ ** FTS3_VARINT_MAX byte varint.
135224
+ **
135225
+ ** Similar padding is added in the fts3DoclistOrMerge() function.
135226
+ */
135227
+ pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1);
135159135228
pTS->anOutput[0] = nDoclist;
135160135229
if( pTS->aaOutput[0] ){
135161135230
memcpy(pTS->aaOutput[0], aDoclist, nDoclist);
135162135231
}else{
135163135232
return SQLITE_NOMEM;
@@ -136409,18 +136478,21 @@
136409136478
** It is merged into the main doclist stored in p->doclist.aAll/nAll.
136410136479
**
136411136480
** This function assumes that pList points to a buffer allocated using
136412136481
** sqlite3_malloc(). This function takes responsibility for eventually
136413136482
** freeing the buffer.
136483
+**
136484
+** SQLITE_OK is returned if successful, or SQLITE_NOMEM if an error occurs.
136414136485
*/
136415
-static void fts3EvalPhraseMergeToken(
136486
+static int fts3EvalPhraseMergeToken(
136416136487
Fts3Table *pTab, /* FTS Table pointer */
136417136488
Fts3Phrase *p, /* Phrase to merge pList/nList into */
136418136489
int iToken, /* Token pList/nList corresponds to */
136419136490
char *pList, /* Pointer to doclist */
136420136491
int nList /* Number of bytes in pList */
136421136492
){
136493
+ int rc = SQLITE_OK;
136422136494
assert( iToken!=p->iDoclistToken );
136423136495
136424136496
if( pList==0 ){
136425136497
sqlite3_free(p->doclist.aAll);
136426136498
p->doclist.aAll = 0;
@@ -136455,17 +136527,20 @@
136455136527
pLeft = pList;
136456136528
nLeft = nList;
136457136529
nDiff = p->iDoclistToken - iToken;
136458136530
}
136459136531
136460
- fts3DoclistPhraseMerge(pTab->bDescIdx, nDiff, pLeft, nLeft, pRight,&nRight);
136532
+ rc = fts3DoclistPhraseMerge(
136533
+ pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight
136534
+ );
136461136535
sqlite3_free(pLeft);
136462136536
p->doclist.aAll = pRight;
136463136537
p->doclist.nAll = nRight;
136464136538
}
136465136539
136466136540
if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken;
136541
+ return rc;
136467136542
}
136468136543
136469136544
/*
136470136545
** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist
136471136546
** does not take deferred tokens into account.
@@ -136487,11 +136562,11 @@
136487136562
if( pToken->pSegcsr ){
136488136563
int nThis = 0;
136489136564
char *pThis = 0;
136490136565
rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis);
136491136566
if( rc==SQLITE_OK ){
136492
- fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis);
136567
+ rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis);
136493136568
}
136494136569
}
136495136570
assert( pToken->pSegcsr==0 );
136496136571
}
136497136572
@@ -137289,13 +137364,17 @@
137289137364
Fts3PhraseToken *pToken = pTC->pToken;
137290137365
int nList = 0;
137291137366
char *pList = 0;
137292137367
rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList);
137293137368
assert( rc==SQLITE_OK || pList==0 );
137369
+ if( rc==SQLITE_OK ){
137370
+ rc = fts3EvalPhraseMergeToken(
137371
+ pTab, pTC->pPhrase, pTC->iToken,pList,nList
137372
+ );
137373
+ }
137294137374
if( rc==SQLITE_OK ){
137295137375
int nCount;
137296
- fts3EvalPhraseMergeToken(pTab, pTC->pPhrase, pTC->iToken,pList,nList);
137297137376
nCount = fts3DoclistCountDocids(
137298137377
pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll
137299137378
);
137300137379
if( ii==0 || nCount<nMinEst ) nMinEst = nCount;
137301137380
}
137302137381
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -317,11 +317,11 @@
317 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
318 ** [sqlite_version()] and [sqlite_source_id()].
319 */
320 #define SQLITE_VERSION "3.8.9"
321 #define SQLITE_VERSION_NUMBER 3008009
322 #define SQLITE_SOURCE_ID "2015-04-03 20:33:33 4ae9a3acc4eeeb7998769eb856c97c2233476f72"
323
324 /*
325 ** CAPI3REF: Run-Time Library Version Numbers
326 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
327 **
@@ -12226,10 +12226,11 @@
12226 #define SF_AllValues 0x0100 /* All terms of compound are VALUES */
12227 #define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */
12228 #define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */
12229 #define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */
12230 #define SF_MinMaxAgg 0x1000 /* Aggregate containing min() or max() */
 
12231
12232
12233 /*
12234 ** The results of a SELECT can be distributed in several ways, as defined
12235 ** by one of the following macros. The "SRT" prefix means "SELECT Result
@@ -21523,19 +21524,23 @@
21523 }else{
21524 width = va_arg(ap,int);
21525 }
21526 if( width<0 ){
21527 flag_leftjustify = 1;
21528 width = -width;
21529 }
21530 c = *++fmt;
21531 }else{
 
21532 while( c>='0' && c<='9' ){
21533 width = width*10 + c - '0';
21534 c = *++fmt;
21535 }
 
 
21536 }
 
21537 /* Get the precision */
21538 if( c=='.' ){
21539 precision = 0;
21540 c = *++fmt;
21541 if( c=='*' ){
@@ -21542,17 +21547,22 @@
21542 if( bArgList ){
21543 precision = (int)getIntArg(pArgList);
21544 }else{
21545 precision = va_arg(ap,int);
21546 }
21547 if( precision<0 ) precision = -precision;
21548 c = *++fmt;
 
 
 
21549 }else{
 
21550 while( c>='0' && c<='9' ){
21551 precision = precision*10 + c - '0';
21552 c = *++fmt;
21553 }
 
 
21554 }
21555 }else{
21556 precision = -1;
21557 }
21558 /* Get the conversion type modifier */
@@ -21712,11 +21722,12 @@
21712 if( flag_plussign ) prefix = '+';
21713 else if( flag_blanksign ) prefix = ' ';
21714 else prefix = 0;
21715 }
21716 if( xtype==etGENERIC && precision>0 ) precision--;
21717 for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){}
 
21718 if( xtype==etFLOAT ) realvalue += rounder;
21719 /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
21720 exp = 0;
21721 if( sqlite3IsNaN((double)realvalue) ){
21722 bufpt = "NaN";
@@ -21767,12 +21778,13 @@
21767 if( xtype==etEXP ){
21768 e2 = 0;
21769 }else{
21770 e2 = exp;
21771 }
21772 if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){
21773 bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 );
 
21774 if( bufpt==0 ){
21775 setStrAccumError(pAccum, STRACCUM_NOMEM);
21776 return;
21777 }
21778 }
@@ -22000,11 +22012,11 @@
22000 ** Return the number of bytes of text that StrAccum is able to accept
22001 ** after the attempted enlargement. The value returned might be zero.
22002 */
22003 static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
22004 char *zNew;
22005 assert( p->nChar+N >= p->nAlloc ); /* Only called if really needed */
22006 if( p->accError ){
22007 testcase(p->accError==STRACCUM_TOOBIG);
22008 testcase(p->accError==STRACCUM_NOMEM);
22009 return 0;
22010 }
@@ -22049,11 +22061,14 @@
22049
22050 /*
22051 ** Append N copies of character c to the given string buffer.
22052 */
22053 SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
22054 if( p->nChar+N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ) return;
 
 
 
22055 while( (N--)>0 ) p->zText[p->nChar++] = c;
22056 }
22057
22058 /*
22059 ** The StrAccum "p" is not large enough to accept N new bytes of z[].
@@ -82115,10 +82130,24 @@
82115 sNC.pParse = pParse;
82116 if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
82117 sqlite3ResolveExprNames(&sNC, p->pOffset) ){
82118 return WRC_Abort;
82119 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82120
82121 /* Recursively resolve names in all subqueries
82122 */
82123 for(i=0; i<p->pSrc->nSrc; i++){
82124 struct SrcList_item *pItem = &p->pSrc->a[i];
@@ -82196,10 +82225,21 @@
82196 /* The ORDER BY and GROUP BY clauses may not refer to terms in
82197 ** outer queries
82198 */
82199 sNC.pNext = 0;
82200 sNC.ncFlags |= NC_AllowAgg;
 
 
 
 
 
 
 
 
 
 
 
82201
82202 /* Process the ORDER BY clause for singleton SELECT statements.
82203 ** The ORDER BY clause for compounds SELECT statements is handled
82204 ** below, after all of the result-sets for all of the elements of
82205 ** the compound have been resolved.
@@ -109909,10 +109949,12 @@
109909 pNew->pHaving = 0;
109910 pNew->pOrderBy = 0;
109911 p->pPrior = 0;
109912 p->pNext = 0;
109913 p->selFlags &= ~SF_Compound;
 
 
109914 assert( pNew->pPrior!=0 );
109915 pNew->pPrior->pNext = pNew;
109916 pNew->pLimit = 0;
109917 pNew->pOffset = 0;
109918 return WRC_Continue;
@@ -134980,30 +135022,37 @@
134980 ** parameter bDescDoclist should be false. If they are sorted in ascending
134981 ** order, it should be passed a non-zero value.
134982 **
134983 ** The right-hand input doclist is overwritten by this function.
134984 */
134985 static void fts3DoclistPhraseMerge(
134986 int bDescDoclist, /* True if arguments are desc */
134987 int nDist, /* Distance from left to right (1=adjacent) */
134988 char *aLeft, int nLeft, /* Left doclist */
134989 char *aRight, int *pnRight /* IN/OUT: Right/output doclist */
134990 ){
134991 sqlite3_int64 i1 = 0;
134992 sqlite3_int64 i2 = 0;
134993 sqlite3_int64 iPrev = 0;
 
134994 char *pEnd1 = &aLeft[nLeft];
134995 char *pEnd2 = &aRight[*pnRight];
134996 char *p1 = aLeft;
134997 char *p2 = aRight;
134998 char *p;
134999 int bFirstOut = 0;
135000 char *aOut = aRight;
135001
135002 assert( nDist>0 );
135003
 
 
 
 
 
135004 p = aOut;
 
135005 fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
135006 fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
135007
135008 while( p1 && p2 ){
135009 sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
@@ -135028,10 +135077,16 @@
135028 fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
135029 }
135030 }
135031
135032 *pnRight = (int)(p - aOut);
 
 
 
 
 
 
135033 }
135034
135035 /*
135036 ** Argument pList points to a position list nList bytes in size. This
135037 ** function checks to see if the position list contains any entries for
@@ -135152,12 +135207,26 @@
135152 char *aDoclist, /* Pointer to doclist */
135153 int nDoclist /* Size of aDoclist in bytes */
135154 ){
135155 if( pTS->aaOutput[0]==0 ){
135156 /* If this is the first term selected, copy the doclist to the output
135157 ** buffer using memcpy(). */
135158 pTS->aaOutput[0] = sqlite3_malloc(nDoclist);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135159 pTS->anOutput[0] = nDoclist;
135160 if( pTS->aaOutput[0] ){
135161 memcpy(pTS->aaOutput[0], aDoclist, nDoclist);
135162 }else{
135163 return SQLITE_NOMEM;
@@ -136409,18 +136478,21 @@
136409 ** It is merged into the main doclist stored in p->doclist.aAll/nAll.
136410 **
136411 ** This function assumes that pList points to a buffer allocated using
136412 ** sqlite3_malloc(). This function takes responsibility for eventually
136413 ** freeing the buffer.
 
 
136414 */
136415 static void fts3EvalPhraseMergeToken(
136416 Fts3Table *pTab, /* FTS Table pointer */
136417 Fts3Phrase *p, /* Phrase to merge pList/nList into */
136418 int iToken, /* Token pList/nList corresponds to */
136419 char *pList, /* Pointer to doclist */
136420 int nList /* Number of bytes in pList */
136421 ){
 
136422 assert( iToken!=p->iDoclistToken );
136423
136424 if( pList==0 ){
136425 sqlite3_free(p->doclist.aAll);
136426 p->doclist.aAll = 0;
@@ -136455,17 +136527,20 @@
136455 pLeft = pList;
136456 nLeft = nList;
136457 nDiff = p->iDoclistToken - iToken;
136458 }
136459
136460 fts3DoclistPhraseMerge(pTab->bDescIdx, nDiff, pLeft, nLeft, pRight,&nRight);
 
 
136461 sqlite3_free(pLeft);
136462 p->doclist.aAll = pRight;
136463 p->doclist.nAll = nRight;
136464 }
136465
136466 if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken;
 
136467 }
136468
136469 /*
136470 ** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist
136471 ** does not take deferred tokens into account.
@@ -136487,11 +136562,11 @@
136487 if( pToken->pSegcsr ){
136488 int nThis = 0;
136489 char *pThis = 0;
136490 rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis);
136491 if( rc==SQLITE_OK ){
136492 fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis);
136493 }
136494 }
136495 assert( pToken->pSegcsr==0 );
136496 }
136497
@@ -137289,13 +137364,17 @@
137289 Fts3PhraseToken *pToken = pTC->pToken;
137290 int nList = 0;
137291 char *pList = 0;
137292 rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList);
137293 assert( rc==SQLITE_OK || pList==0 );
 
 
 
 
 
137294 if( rc==SQLITE_OK ){
137295 int nCount;
137296 fts3EvalPhraseMergeToken(pTab, pTC->pPhrase, pTC->iToken,pList,nList);
137297 nCount = fts3DoclistCountDocids(
137298 pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll
137299 );
137300 if( ii==0 || nCount<nMinEst ) nMinEst = nCount;
137301 }
137302
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -317,11 +317,11 @@
317 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
318 ** [sqlite_version()] and [sqlite_source_id()].
319 */
320 #define SQLITE_VERSION "3.8.9"
321 #define SQLITE_VERSION_NUMBER 3008009
322 #define SQLITE_SOURCE_ID "2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09"
323
324 /*
325 ** CAPI3REF: Run-Time Library Version Numbers
326 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
327 **
@@ -12226,10 +12226,11 @@
12226 #define SF_AllValues 0x0100 /* All terms of compound are VALUES */
12227 #define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */
12228 #define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */
12229 #define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */
12230 #define SF_MinMaxAgg 0x1000 /* Aggregate containing min() or max() */
12231 #define SF_Converted 0x2000 /* By convertCompoundSelectToSubquery() */
12232
12233
12234 /*
12235 ** The results of a SELECT can be distributed in several ways, as defined
12236 ** by one of the following macros. The "SRT" prefix means "SELECT Result
@@ -21523,19 +21524,23 @@
21524 }else{
21525 width = va_arg(ap,int);
21526 }
21527 if( width<0 ){
21528 flag_leftjustify = 1;
21529 width = width >= -2147483647 ? -width : 0;
21530 }
21531 c = *++fmt;
21532 }else{
21533 unsigned wx = 0;
21534 while( c>='0' && c<='9' ){
21535 wx = wx*10 + c - '0';
21536 c = *++fmt;
21537 }
21538 testcase( wx>0x7fffffff );
21539 width = wx & 0x7fffffff;
21540 }
21541
21542 /* Get the precision */
21543 if( c=='.' ){
21544 precision = 0;
21545 c = *++fmt;
21546 if( c=='*' ){
@@ -21542,17 +21547,22 @@
21547 if( bArgList ){
21548 precision = (int)getIntArg(pArgList);
21549 }else{
21550 precision = va_arg(ap,int);
21551 }
 
21552 c = *++fmt;
21553 if( precision<0 ){
21554 precision = precision >= -2147483647 ? -precision : -1;
21555 }
21556 }else{
21557 unsigned px = 0;
21558 while( c>='0' && c<='9' ){
21559 px = px*10 + c - '0';
21560 c = *++fmt;
21561 }
21562 testcase( px>0x7fffffff );
21563 precision = px & 0x7fffffff;
21564 }
21565 }else{
21566 precision = -1;
21567 }
21568 /* Get the conversion type modifier */
@@ -21712,11 +21722,12 @@
21722 if( flag_plussign ) prefix = '+';
21723 else if( flag_blanksign ) prefix = ' ';
21724 else prefix = 0;
21725 }
21726 if( xtype==etGENERIC && precision>0 ) precision--;
21727 testcase( precision>0xfff );
21728 for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){}
21729 if( xtype==etFLOAT ) realvalue += rounder;
21730 /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
21731 exp = 0;
21732 if( sqlite3IsNaN((double)realvalue) ){
21733 bufpt = "NaN";
@@ -21767,12 +21778,13 @@
21778 if( xtype==etEXP ){
21779 e2 = 0;
21780 }else{
21781 e2 = exp;
21782 }
21783 if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){
21784 bufpt = zExtra
21785 = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 );
21786 if( bufpt==0 ){
21787 setStrAccumError(pAccum, STRACCUM_NOMEM);
21788 return;
21789 }
21790 }
@@ -22000,11 +22012,11 @@
22012 ** Return the number of bytes of text that StrAccum is able to accept
22013 ** after the attempted enlargement. The value returned might be zero.
22014 */
22015 static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
22016 char *zNew;
22017 assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */
22018 if( p->accError ){
22019 testcase(p->accError==STRACCUM_TOOBIG);
22020 testcase(p->accError==STRACCUM_NOMEM);
22021 return 0;
22022 }
@@ -22049,11 +22061,14 @@
22061
22062 /*
22063 ** Append N copies of character c to the given string buffer.
22064 */
22065 SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){
22066 testcase( p->nChar + (i64)N > 0x7fffffff );
22067 if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){
22068 return;
22069 }
22070 while( (N--)>0 ) p->zText[p->nChar++] = c;
22071 }
22072
22073 /*
22074 ** The StrAccum "p" is not large enough to accept N new bytes of z[].
@@ -82115,10 +82130,24 @@
82130 sNC.pParse = pParse;
82131 if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
82132 sqlite3ResolveExprNames(&sNC, p->pOffset) ){
82133 return WRC_Abort;
82134 }
82135
82136 /* If the SF_Converted flags is set, then this Select object was
82137 ** was created by the convertCompoundSelectToSubquery() function.
82138 ** In this case the ORDER BY clause (p->pOrderBy) should be resolved
82139 ** as if it were part of the sub-query, not the parent. This block
82140 ** moves the pOrderBy down to the sub-query. It will be moved back
82141 ** after the names have been resolved. */
82142 if( p->selFlags & SF_Converted ){
82143 Select *pSub = p->pSrc->a[0].pSelect;
82144 assert( p->pSrc->nSrc==1 && isCompound==0 && p->pOrderBy );
82145 assert( pSub->pPrior && pSub->pOrderBy==0 );
82146 pSub->pOrderBy = p->pOrderBy;
82147 p->pOrderBy = 0;
82148 }
82149
82150 /* Recursively resolve names in all subqueries
82151 */
82152 for(i=0; i<p->pSrc->nSrc; i++){
82153 struct SrcList_item *pItem = &p->pSrc->a[i];
@@ -82196,10 +82225,21 @@
82225 /* The ORDER BY and GROUP BY clauses may not refer to terms in
82226 ** outer queries
82227 */
82228 sNC.pNext = 0;
82229 sNC.ncFlags |= NC_AllowAgg;
82230
82231 /* If this is a converted compound query, move the ORDER BY clause from
82232 ** the sub-query back to the parent query. At this point each term
82233 ** within the ORDER BY clause has been transformed to an integer value.
82234 ** These integers will be replaced by copies of the corresponding result
82235 ** set expressions by the call to resolveOrderGroupBy() below. */
82236 if( p->selFlags & SF_Converted ){
82237 Select *pSub = p->pSrc->a[0].pSelect;
82238 p->pOrderBy = pSub->pOrderBy;
82239 pSub->pOrderBy = 0;
82240 }
82241
82242 /* Process the ORDER BY clause for singleton SELECT statements.
82243 ** The ORDER BY clause for compounds SELECT statements is handled
82244 ** below, after all of the result-sets for all of the elements of
82245 ** the compound have been resolved.
@@ -109909,10 +109949,12 @@
109949 pNew->pHaving = 0;
109950 pNew->pOrderBy = 0;
109951 p->pPrior = 0;
109952 p->pNext = 0;
109953 p->selFlags &= ~SF_Compound;
109954 assert( (p->selFlags & SF_Converted)==0 );
109955 p->selFlags |= SF_Converted;
109956 assert( pNew->pPrior!=0 );
109957 pNew->pPrior->pNext = pNew;
109958 pNew->pLimit = 0;
109959 pNew->pOffset = 0;
109960 return WRC_Continue;
@@ -134980,30 +135022,37 @@
135022 ** parameter bDescDoclist should be false. If they are sorted in ascending
135023 ** order, it should be passed a non-zero value.
135024 **
135025 ** The right-hand input doclist is overwritten by this function.
135026 */
135027 static int fts3DoclistPhraseMerge(
135028 int bDescDoclist, /* True if arguments are desc */
135029 int nDist, /* Distance from left to right (1=adjacent) */
135030 char *aLeft, int nLeft, /* Left doclist */
135031 char **paRight, int *pnRight /* IN/OUT: Right/output doclist */
135032 ){
135033 sqlite3_int64 i1 = 0;
135034 sqlite3_int64 i2 = 0;
135035 sqlite3_int64 iPrev = 0;
135036 char *aRight = *paRight;
135037 char *pEnd1 = &aLeft[nLeft];
135038 char *pEnd2 = &aRight[*pnRight];
135039 char *p1 = aLeft;
135040 char *p2 = aRight;
135041 char *p;
135042 int bFirstOut = 0;
135043 char *aOut;
135044
135045 assert( nDist>0 );
135046 if( bDescDoclist ){
135047 aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX);
135048 if( aOut==0 ) return SQLITE_NOMEM;
135049 }else{
135050 aOut = aRight;
135051 }
135052 p = aOut;
135053
135054 fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
135055 fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
135056
135057 while( p1 && p2 ){
135058 sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
@@ -135028,10 +135077,16 @@
135077 fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
135078 }
135079 }
135080
135081 *pnRight = (int)(p - aOut);
135082 if( bDescDoclist ){
135083 sqlite3_free(aRight);
135084 *paRight = aOut;
135085 }
135086
135087 return SQLITE_OK;
135088 }
135089
135090 /*
135091 ** Argument pList points to a position list nList bytes in size. This
135092 ** function checks to see if the position list contains any entries for
@@ -135152,12 +135207,26 @@
135207 char *aDoclist, /* Pointer to doclist */
135208 int nDoclist /* Size of aDoclist in bytes */
135209 ){
135210 if( pTS->aaOutput[0]==0 ){
135211 /* If this is the first term selected, copy the doclist to the output
135212 ** buffer using memcpy().
135213 **
135214 ** Add FTS3_VARINT_MAX bytes of unused space to the end of the
135215 ** allocation. This is so as to ensure that the buffer is big enough
135216 ** to hold the current doclist AND'd with any other doclist. If the
135217 ** doclists are stored in order=ASC order, this padding would not be
135218 ** required (since the size of [doclistA AND doclistB] is always less
135219 ** than or equal to the size of [doclistA] in that case). But this is
135220 ** not true for order=DESC. For example, a doclist containing (1, -1)
135221 ** may be smaller than (-1), as in the first example the -1 may be stored
135222 ** as a single-byte delta, whereas in the second it must be stored as a
135223 ** FTS3_VARINT_MAX byte varint.
135224 **
135225 ** Similar padding is added in the fts3DoclistOrMerge() function.
135226 */
135227 pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1);
135228 pTS->anOutput[0] = nDoclist;
135229 if( pTS->aaOutput[0] ){
135230 memcpy(pTS->aaOutput[0], aDoclist, nDoclist);
135231 }else{
135232 return SQLITE_NOMEM;
@@ -136409,18 +136478,21 @@
136478 ** It is merged into the main doclist stored in p->doclist.aAll/nAll.
136479 **
136480 ** This function assumes that pList points to a buffer allocated using
136481 ** sqlite3_malloc(). This function takes responsibility for eventually
136482 ** freeing the buffer.
136483 **
136484 ** SQLITE_OK is returned if successful, or SQLITE_NOMEM if an error occurs.
136485 */
136486 static int fts3EvalPhraseMergeToken(
136487 Fts3Table *pTab, /* FTS Table pointer */
136488 Fts3Phrase *p, /* Phrase to merge pList/nList into */
136489 int iToken, /* Token pList/nList corresponds to */
136490 char *pList, /* Pointer to doclist */
136491 int nList /* Number of bytes in pList */
136492 ){
136493 int rc = SQLITE_OK;
136494 assert( iToken!=p->iDoclistToken );
136495
136496 if( pList==0 ){
136497 sqlite3_free(p->doclist.aAll);
136498 p->doclist.aAll = 0;
@@ -136455,17 +136527,20 @@
136527 pLeft = pList;
136528 nLeft = nList;
136529 nDiff = p->iDoclistToken - iToken;
136530 }
136531
136532 rc = fts3DoclistPhraseMerge(
136533 pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight
136534 );
136535 sqlite3_free(pLeft);
136536 p->doclist.aAll = pRight;
136537 p->doclist.nAll = nRight;
136538 }
136539
136540 if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken;
136541 return rc;
136542 }
136543
136544 /*
136545 ** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist
136546 ** does not take deferred tokens into account.
@@ -136487,11 +136562,11 @@
136562 if( pToken->pSegcsr ){
136563 int nThis = 0;
136564 char *pThis = 0;
136565 rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis);
136566 if( rc==SQLITE_OK ){
136567 rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis);
136568 }
136569 }
136570 assert( pToken->pSegcsr==0 );
136571 }
136572
@@ -137289,13 +137364,17 @@
137364 Fts3PhraseToken *pToken = pTC->pToken;
137365 int nList = 0;
137366 char *pList = 0;
137367 rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList);
137368 assert( rc==SQLITE_OK || pList==0 );
137369 if( rc==SQLITE_OK ){
137370 rc = fts3EvalPhraseMergeToken(
137371 pTab, pTC->pPhrase, pTC->iToken,pList,nList
137372 );
137373 }
137374 if( rc==SQLITE_OK ){
137375 int nCount;
 
137376 nCount = fts3DoclistCountDocids(
137377 pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll
137378 );
137379 if( ii==0 || nCount<nMinEst ) nMinEst = nCount;
137380 }
137381
+1 -1
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -111,11 +111,11 @@
111111
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
112112
** [sqlite_version()] and [sqlite_source_id()].
113113
*/
114114
#define SQLITE_VERSION "3.8.9"
115115
#define SQLITE_VERSION_NUMBER 3008009
116
-#define SQLITE_SOURCE_ID "2015-04-03 20:33:33 4ae9a3acc4eeeb7998769eb856c97c2233476f72"
116
+#define SQLITE_SOURCE_ID "2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09"
117117
118118
/*
119119
** CAPI3REF: Run-Time Library Version Numbers
120120
** KEYWORDS: sqlite3_version, sqlite3_sourceid
121121
**
122122
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -111,11 +111,11 @@
111 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
112 ** [sqlite_version()] and [sqlite_source_id()].
113 */
114 #define SQLITE_VERSION "3.8.9"
115 #define SQLITE_VERSION_NUMBER 3008009
116 #define SQLITE_SOURCE_ID "2015-04-03 20:33:33 4ae9a3acc4eeeb7998769eb856c97c2233476f72"
117
118 /*
119 ** CAPI3REF: Run-Time Library Version Numbers
120 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
121 **
122
--- src/sqlite3.h
+++ src/sqlite3.h
@@ -111,11 +111,11 @@
111 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
112 ** [sqlite_version()] and [sqlite_source_id()].
113 */
114 #define SQLITE_VERSION "3.8.9"
115 #define SQLITE_VERSION_NUMBER 3008009
116 #define SQLITE_SOURCE_ID "2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09"
117
118 /*
119 ** CAPI3REF: Run-Time Library Version Numbers
120 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
121 **
122

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button