Skip to content

Commit 0d64cb2

Browse files
committed
Merge sqlite-release(3.53.3) into prerelease-integration
2 parents f22d55a + 712adba commit 0d64cb2

81 files changed

Lines changed: 1903 additions & 468 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.53.2
1+
3.53.3

ext/fts3/fts3.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2073,8 +2073,13 @@ static void fts3PutDeltaVarint(
20732073
sqlite3_int64 iVal /* Write this value to the list */
20742074
){
20752075
assert_fts3_nc( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) );
2076-
*pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev);
2077-
*piPrev = iVal;
2076+
if( iVal-(*piPrev)>=0 ){
2077+
/* Refuse to write a negative delta integer. This only happens with a
2078+
** corrupt db (see the assert above) and can cause buffer overwrites
2079+
** in some cases. */
2080+
*pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev);
2081+
*piPrev = iVal;
2082+
}
20782083
}
20792084

20802085
/*
@@ -4428,6 +4433,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
44284433
char *p1;
44294434
char *p2;
44304435
char *aOut;
4436+
i64 nAlloc = (i64)nPoslist*2 + FTS3_BUFFER_PADDING;
44314437

44324438
if( nMaxUndeferred>iPrev ){
44334439
p1 = aPoslist;
@@ -4439,7 +4445,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
44394445
nDistance = iPrev - nMaxUndeferred;
44404446
}
44414447

4442-
aOut = (char *)sqlite3Fts3MallocZero(((i64)nPoslist)+FTS3_BUFFER_PADDING);
4448+
aOut = (char *)sqlite3Fts3MallocZero(nAlloc);
44434449
if( !aOut ){
44444450
sqlite3_free(aPoslist);
44454451
return SQLITE_NOMEM;

ext/fts3/fts3_write.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3129,6 +3129,10 @@ static void fts3ReadEndBlockField(
31293129
for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){
31303130
iVal = iVal*10 + (zText[i] - '0');
31313131
}
3132+
3133+
/* This if() clause is just to avoid an integer overflow. The record is
3134+
** corrupt in this case. */
3135+
if( (i64)iVal==SMALLEST_INT64 ) iMul = 1;
31323136
*pnByte = ((i64)iVal * (i64)iMul);
31333137
}
31343138
}
@@ -4355,7 +4359,7 @@ static int fts3IncrmergeLoad(
43554359
return FTS_CORRUPT_VTAB;
43564360
}
43574361

4358-
pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT;
4362+
pWriter->nLeafEst = (int)(((iEnd - iStart)+1)/FTS_MAX_APPENDABLE_HEIGHT);
43594363
pWriter->iStart = iStart;
43604364
pWriter->iEnd = iEnd;
43614365
pWriter->iAbsLevel = iAbsLevel;

ext/fts5/fts5_aux.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ static void fts5SnippetFunction(
426426
int rc = SQLITE_OK; /* Return code */
427427
int iCol; /* 1st argument to snippet() */
428428
const char *zEllips; /* 4th argument to snippet() */
429-
int nToken; /* 5th argument to snippet() */
429+
i64 nToken; /* 5th argument to snippet() */
430430
int nInst = 0; /* Number of instance matches this row */
431431
int i; /* Used to iterate through instances */
432432
int nPhrase; /* Number of phrases in query */
@@ -451,7 +451,7 @@ static void fts5SnippetFunction(
451451
ctx.zClose = fts5ValueToText(apVal[2]);
452452
ctx.iRangeEnd = -1;
453453
zEllips = fts5ValueToText(apVal[3]);
454-
nToken = sqlite3_value_int(apVal[4]);
454+
nToken = (int)(MIN( MAX(sqlite3_value_int64(apVal[4]), 0), 64));
455455

456456
iBestCol = (iCol>=0 ? iCol : 0);
457457
nPhrase = pApi->xPhraseCount(pFts);

ext/fts5/fts5_expr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){
807807
i64 iPos = a[i].reader.iPos;
808808
Fts5PoslistWriter *pWriter = &a[i].writer;
809809
if( a[i].pOut->n==0 || iPos!=pWriter->iPrev ){
810-
sqlite3Fts5PoslistWriterAppend(a[i].pOut, pWriter, iPos);
810+
sqlite3Fts5PoslistSafeAppend(a[i].pOut, &pWriter->iPrev, iPos);
811811
}
812812
}
813813

@@ -1758,10 +1758,10 @@ static int fts5ParseTokenize(
17581758
memset(pSyn, 0, (size_t)nByte);
17591759
pSyn->pTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer);
17601760
pSyn->nFullTerm = pSyn->nQueryTerm = nToken;
1761+
memcpy(pSyn->pTerm, pToken, nToken);
17611762
if( pCtx->pConfig->bTokendata ){
17621763
pSyn->nQueryTerm = (int)strlen(pSyn->pTerm);
17631764
}
1764-
memcpy(pSyn->pTerm, pToken, nToken);
17651765
pSyn->pSynonym = pPhrase->aTerm[pPhrase->nTerm-1].pSynonym;
17661766
pPhrase->aTerm[pPhrase->nTerm-1].pSynonym = pSyn;
17671767
}

ext/fts5/fts5_index.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,7 +1166,7 @@ static int fts5StructureDecode(
11661166
i += fts5GetVarint32(&pData[i], nTotal);
11671167
if( nTotal<pLvl->nMerge ) rc = FTS5_CORRUPT;
11681168
pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc,
1169-
nTotal * sizeof(Fts5StructureSegment)
1169+
(i64)nTotal * sizeof(Fts5StructureSegment)
11701170
);
11711171
nSegment -= nTotal;
11721172
}
@@ -2122,7 +2122,7 @@ static void fts5SegIterReverseNewPage(Fts5Index *p, Fts5SegIter *pIter){
21222122
while( p->rc==SQLITE_OK && pIter->iLeafPgno>pIter->iTermLeafPgno ){
21232123
Fts5Data *pNew;
21242124
pIter->iLeafPgno--;
2125-
pNew = fts5DataRead(p, FTS5_SEGMENT_ROWID(
2125+
pNew = fts5LeafRead(p, FTS5_SEGMENT_ROWID(
21262126
pIter->pSeg->iSegid, pIter->iLeafPgno
21272127
));
21282128
if( pNew ){
@@ -7990,8 +7990,8 @@ static void fts5IndexTombstoneRebuild(
79907990
){
79917991
const int MINSLOT = 32;
79927992
int nSlotPerPage = MAX(MINSLOT, (p->pConfig->pgsz - 8) / szKey);
7993-
int nSlot = 0; /* Number of slots in each output page */
7994-
int nOut = 0;
7993+
i64 nSlot = 0; /* Number of slots in each output page */
7994+
i64 nOut = 0;
79957995

79967996
/* Figure out how many output pages (nOut) and how many slots per
79977997
** page (nSlot). There are three possibilities:
@@ -8016,23 +8016,26 @@ static void fts5IndexTombstoneRebuild(
80168016
nSlot = MINSLOT;
80178017
}else if( pSeg->nPgTombstone==1 ){
80188018
/* Case 2. */
8019-
int nElem = (int)fts5GetU32(&pData1->p[4]);
8019+
u32 nElem = fts5GetU32(&pData1->p[4]);
80208020
assert( pData1 && iPg1==0 );
8021-
nOut = 1;
8022-
nSlot = MAX(nElem*4, MINSLOT);
8023-
if( nSlot>nSlotPerPage ) nOut = 0;
8021+
if( nElem>((u32)nSlotPerPage/4) ){
8022+
nOut = 0;
8023+
}else{
8024+
nOut = 1;
8025+
nSlot = MAX((i64)nElem*4, MINSLOT);
8026+
}
80248027
}
80258028
if( nOut==0 ){
80268029
/* Case 3. */
8027-
nOut = (pSeg->nPgTombstone * 2 + 1);
8030+
nOut = ((i64)pSeg->nPgTombstone * 2 + 1);
80288031
nSlot = nSlotPerPage;
80298032
}
80308033

80318034
/* Allocate the required array and output pages */
80328035
while( 1 ){
80338036
int res = 0;
8034-
int ii = 0;
8035-
int szPage = 0;
8037+
i64 ii = 0;
8038+
i64 szPage = 0;
80368039
Fts5Data **apOut = 0;
80378040

80388041
/* Allocate space for the new hash table */
@@ -8537,9 +8540,13 @@ static void fts5IndexIntegrityCheckSegment(
85378540
FTS5_CORRUPT_ROWID(p, iRow);
85388541
}else{
85398542
iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm);
8540-
res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm));
8541-
if( res==0 ) res = nTerm - nIdxTerm;
8542-
if( res<0 ) FTS5_CORRUPT_ROWID(p, iRow);
8543+
if( iOff+nTerm>pLeaf->szLeaf ){
8544+
FTS5_CORRUPT_ROWID(p, iRow);
8545+
}else{
8546+
res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm));
8547+
if( res==0 ) res = nTerm - nIdxTerm;
8548+
if( res<0 ) FTS5_CORRUPT_ROWID(p, iRow);
8549+
}
85438550
}
85448551

85458552
fts5IntegrityCheckPgidx(p, iRow, pLeaf);
@@ -8570,7 +8577,7 @@ static void fts5IndexIntegrityCheckSegment(
85708577
/* Check any rowid-less pages that occur before the current leaf. */
85718578
for(iPg=iPrevLeaf+1; iPg<fts5DlidxIterPgno(pDlidx); iPg++){
85728579
iKey = FTS5_SEGMENT_ROWID(iSegid, iPg);
8573-
pLeaf = fts5DataRead(p, iKey);
8580+
pLeaf = fts5LeafRead(p, iKey);
85748581
if( pLeaf ){
85758582
if( fts5LeafFirstRowidOff(pLeaf)!=0 ) FTS5_CORRUPT_ROWID(p, iKey);
85768583
fts5DataRelease(pLeaf);
@@ -8581,7 +8588,7 @@ static void fts5IndexIntegrityCheckSegment(
85818588
/* Check that the leaf page indicated by the iterator really does
85828589
** contain the rowid suggested by the same. */
85838590
iKey = FTS5_SEGMENT_ROWID(iSegid, iPrevLeaf);
8584-
pLeaf = fts5DataRead(p, iKey);
8591+
pLeaf = fts5LeafRead(p, iKey);
85858592
if( pLeaf ){
85868593
i64 iRowid;
85878594
int iRowidOff = fts5LeafFirstRowidOff(pLeaf);

ext/fts5/fts5_storage.c

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -365,34 +365,31 @@ int sqlite3Fts5StorageOpen(
365365
if( pConfig->eContent==FTS5_CONTENT_NORMAL
366366
|| pConfig->eContent==FTS5_CONTENT_UNINDEXED
367367
){
368-
int nDefn = 32 + pConfig->nCol*10;
369-
char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 20);
370-
if( zDefn==0 ){
371-
rc = SQLITE_NOMEM;
372-
}else{
373-
int i;
374-
int iOff;
375-
sqlite3_snprintf(nDefn, zDefn, "id INTEGER PRIMARY KEY");
376-
iOff = (int)strlen(zDefn);
377-
for(i=0; i<pConfig->nCol; i++){
378-
if( pConfig->eContent==FTS5_CONTENT_NORMAL
379-
|| pConfig->abUnindexed[i]
380-
){
381-
sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", c%d", i);
382-
iOff += (int)strlen(&zDefn[iOff]);
383-
}
368+
int i = 0;
369+
char *zDefn = 0;
370+
sqlite3_str *pDefn = sqlite3_str_new(pConfig->db);
371+
372+
sqlite3_str_appendf(pDefn, "id INTEGER PRIMARY KEY");
373+
for(i=0; i<pConfig->nCol; i++){
374+
if( pConfig->eContent==FTS5_CONTENT_NORMAL || pConfig->abUnindexed[i] ){
375+
sqlite3_str_appendf(pDefn, ", c%d", i);
384376
}
385-
if( pConfig->bLocale ){
386-
for(i=0; i<pConfig->nCol; i++){
387-
if( pConfig->abUnindexed[i]==0 ){
388-
sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", l%d", i);
389-
iOff += (int)strlen(&zDefn[iOff]);
390-
}
377+
}
378+
if( pConfig->bLocale ){
379+
for(i=0; i<pConfig->nCol; i++){
380+
if( pConfig->abUnindexed[i]==0 ){
381+
sqlite3_str_appendf(pDefn, ", l%d", i);
391382
}
392383
}
384+
}
385+
zDefn = sqlite3_str_finish(pDefn);
386+
387+
if( zDefn ){
393388
rc = sqlite3Fts5CreateTable(pConfig, "content", zDefn, 0, pzErr);
389+
sqlite3_free(zDefn);
390+
}else{
391+
rc = SQLITE_NOMEM;
394392
}
395-
sqlite3_free(zDefn);
396393
}
397394

398395
if( rc==SQLITE_OK && pConfig->bColumnsize ){

ext/fts5/test/fts5af.test

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,29 @@ do_execsql_test 5.6 {
191191
SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ' || x'DB');
192192
} {{[x a a a a a...}}
193193

194+
do_execsql_test 5.7.1 {
195+
SELECT snippet(p1, 0, '[', NULL, '...', -2147483647) FROM p1('x OR ' || x'DB')
196+
} {{[x...}}
197+
do_execsql_test 5.7.2 {
198+
SELECT snippet(p1, 0, '[', NULL, '...', -2147483648) FROM p1('x OR ' || x'DB')
199+
} {{[x...}}
200+
do_execsql_test 5.7.3 {
201+
SELECT snippet(p1, 0, '[', NULL, '...', -2147483649) FROM p1('x OR ' || x'DB')
202+
} {{[x...}}
203+
do_execsql_test 5.7.4 {
204+
SELECT snippet(p1, 0, '[', NULL, '...', 0) FROM p1('x OR ' || x'DB')
205+
} {{[x...}}
206+
207+
do_execsql_test 5.8.1 {
208+
SELECT snippet(p1, 0, '[', NULL, '...', 2147483647) FROM p1('x OR ' || x'DB')
209+
} {{[x a a a a a a a a a a}}
210+
do_execsql_test 5.8.2 {
211+
SELECT snippet(p1, 0, '[', NULL, '...', 2147483648) FROM p1('x OR ' || x'DB')
212+
} {{[x a a a a a a a a a a}}
213+
do_execsql_test 5.8.3 {
214+
SELECT snippet(p1, 0, '[', NULL, '...', 2147483649) FROM p1('x OR ' || x'DB')
215+
} {{[x a a a a a a a a a a}}
216+
194217
} ;# foreach_detail_mode
195218

196219
reset_db

ext/fts5/test/fts5corrupt5.test

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,6 +2134,83 @@ do_catchsql_test 13.1 {
21342134
SELECT * FROM t('a:hello')
21352135
} {0 {{hello world} {foo bar}}}
21362136

2137+
#-------------------------------------------------------------------------
2138+
reset_db
2139+
2140+
#-------------------------------------------------------------------------
2141+
reset_db
2142+
do_test 14.0 {
2143+
sqlite3 db {}
2144+
db deserialize [decode_hexdb {
2145+
.open --hexdb
2146+
| size 24576 pagesize 4096 filename vuln_001.db
2147+
| page 1 offset 0
2148+
| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3.
2149+
| 16: 10 00 01 01 00 40 20 20 00 00 00 03 00 00 00 06 .....@ ........
2150+
| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................
2151+
| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................
2152+
| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................
2153+
| 96: 00 2e 76 89 0d 00 00 00 06 0e 0a 00 0f c7 0f 74 ..v............t
2154+
| 112: 0f 0c 0e b8 0e 5f 0e 0a 00 00 00 00 00 00 00 00 ....._..........
2155+
| 3584: 00 00 00 00 00 00 00 00 00 00 53 06 06 17 1d 1d ..........S.....
2156+
| 3600: 01 7b 74 61 62 6c 65 74 5f 63 6f 6e 66 69 67 74 ..tablet_configt
2157+
| 3616: 5f 63 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 _config.CREATE T
2158+
| 3632: 41 42 4c 45 20 27 74 5f 63 6f 6e 66 69 67 27 28 ABLE 't_config'(
2159+
| 3648: 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 k PRIMARY KEY, v
2160+
| 3664: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 57 ) WITHOUT ROWIDW
2161+
| 3680: 05 06 17 1f 1f 01 7f 74 61 62 6c 65 74 5f 64 6f .......tablet_do
2162+
| 3696: 63 73 69 7a 65 74 5f 64 6f 63 73 69 7a 65 05 43 csizet_docsize.C
2163+
| 3712: 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 5f 64 REATE TABLE 't_d
2164+
| 3728: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG
2165+
| 3744: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY,
2166+
| 3760: 73 7a 20 42 4c 4f 42 29 52 04 06 17 1f 1f 01 75 sz BLOB)R......u
2167+
| 3776: 74 61 62 6c 65 74 5f 63 6f 6e 74 65 6e 74 74 5f tablet_contentt_
2168+
| 3792: 63 6f 6e 74 65 6e 74 04 43 52 45 41 54 45 20 54 content.CREATE T
2169+
| 3808: 41 42 4c 45 20 27 74 5f 63 6f 6e 74 65 6e 74 27 ABLE 't_content'
2170+
| 3824: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
2171+
| 3840: 41 52 59 20 4b 45 59 2c 20 63 30 29 66 03 07 17 ARY KEY, c0)f...
2172+
| 3856: 17 17 01 81 2b 74 61 62 6c 65 74 5f 69 64 78 74 ....+tablet_idxt
2173+
| 3872: 5f 69 64 78 03 43 52 45 41 54 45 20 54 41 42 4c _idx.CREATE TABL
2174+
| 3888: 45 20 27 74 5f 69 64 78 27 28 73 65 67 69 64 2c E 't_idx'(segid,
2175+
| 3904: 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 term, pgno, PRI
2176+
| 3920: 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 MARY KEY(segid,
2177+
| 3936: 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 term)) WITHOUT R
2178+
| 3952: 4f 57 49 44 51 02 06 17 19 19 01 7f 74 61 62 6c OWIDQ.......tabl
2179+
| 3968: 65 74 5f 64 61 74 61 74 5f 64 61 74 61 02 43 52 et_datat_data.CR
2180+
| 3984: 45 41 54 45 20 54 41 42 4c 45 20 27 74 5f 64 61 EATE TABLE 't_da
2181+
| 4000: 74 61 27 28 69 64 20 49 4e 54 45 47 45 52 20 50 ta'(id INTEGER P
2182+
| 4016: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 RIMARY KEY, bloc
2183+
| 4032: 6b 20 42 4c 4f 42 29 37 01 06 17 0f 0f 08 61 74 k BLOB)7......at
2184+
| 4048: 61 62 6c 65 74 74 43 52 45 41 54 45 20 56 49 52 ablettCREATE VIR
2185+
| 4064: 54 55 41 4c 20 54 41 42 4c 45 20 74 20 55 53 49 TUAL TABLE t USI
2186+
| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content)
2187+
| page 2 offset 4096
2188+
| 0: 0d 0f ef 00 03 0f ac 00 0f e8 0f ac 0f c4 00 00 ................
2189+
| 4000: 00 00 00 00 00 00 00 00 00 00 00 00 16 0a 03 00 ................
2190+
| 4016: 32 01 00 00 00 01 01 01 00 d5 aa d5 2b 01 01 01 2...........+...
2191+
| 4032: 83 74 01 01 1d 84 80 80 80 80 01 03 00 40 00 00 .t...........@..
2192+
| 4048: 00 18 06 30 68 65 6c 6c 6f 01 02 02 01 05 77 6f ...0hello.....wo
2193+
| 4064: 72 6c 64 01 02 03 04 0a 05 01 03 00 10 01 02 00 rld.............
2194+
| 4080: 00 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2195+
| page 3 offset 8192
2196+
| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................
2197+
| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................
2198+
| page 4 offset 12288
2199+
| 0: 0d 00 00 00 01 0f f0 00 0f f0 00 00 00 00 00 00 ................
2200+
| 4080: 0e 01 03 00 23 68 65 6c 6c 6f 20 77 6f 72 6c 64 ....#hello world
2201+
| page 5 offset 16384
2202+
| 0: 0d 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................
2203+
| 4080: 00 00 00 00 00 00 00 00 00 00 04 01 03 00 0e 02 ................
2204+
| page 6 offset 20480
2205+
| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................
2206+
| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version.
2207+
| end vuln_001.db
2208+
}]} {}
2209+
2210+
do_catchsql_test 14.1 {
2211+
SELECT * FROM t('hello');
2212+
} {1 {out of memory}}
2213+
21372214
sqlite3_fts5_may_be_corrupt 0
21382215
finish_test
21392216

0 commit comments

Comments
 (0)