mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-01 06:27:03 +03:00
Improve test coverage of fts5.
FossilOrigin-Name: df5ccea80e8f0da83af5e595b539687006085120
This commit is contained in:
@ -827,15 +827,14 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){
|
||||
** table, saving it creates a circular reference.
|
||||
**
|
||||
** If SQLite a built-in statement cache, this wouldn't be a problem. */
|
||||
zSql = sqlite3_mprintf("SELECT rowid, rank FROM %Q.%Q ORDER BY %s(%s%s%s) %s",
|
||||
zSql = sqlite3Fts5Mprintf(&rc,
|
||||
"SELECT rowid, rank FROM %Q.%Q ORDER BY %s(%s%s%s) %s",
|
||||
pConfig->zDb, pConfig->zName, zRank, pConfig->zName,
|
||||
(zRankArgs ? ", " : ""),
|
||||
(zRankArgs ? zRankArgs : ""),
|
||||
bDesc ? "DESC" : "ASC"
|
||||
);
|
||||
if( zSql==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
if( zSql ){
|
||||
rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &pSorter->pStmt, 0);
|
||||
sqlite3_free(zSql);
|
||||
}
|
||||
@ -930,10 +929,8 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){
|
||||
const char *zRankArgs = pCsr->zRankArgs;
|
||||
|
||||
if( zRankArgs ){
|
||||
char *zSql = sqlite3_mprintf("SELECT %s", zRankArgs);
|
||||
if( zSql==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
char *zSql = sqlite3Fts5Mprintf(&rc, "SELECT %s", zRankArgs);
|
||||
if( zSql ){
|
||||
sqlite3_stmt *pStmt = 0;
|
||||
rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &pStmt, 0);
|
||||
sqlite3_free(zSql);
|
||||
@ -1213,8 +1210,11 @@ static int fts5RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
|
||||
/*
|
||||
** If the cursor requires seeking (bSeekRequired flag is set), seek it.
|
||||
** Return SQLITE_OK if no error occurs, or an SQLite error code otherwise.
|
||||
**
|
||||
** If argument bErrormsg is true and an error occurs, an error message may
|
||||
** be left in sqlite3_vtab.zErrMsg.
|
||||
*/
|
||||
static int fts5SeekCursor(Fts5Cursor *pCsr){
|
||||
static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){
|
||||
int rc = SQLITE_OK;
|
||||
|
||||
/* If the cursor does not yet have a statement handle, obtain one now. */
|
||||
@ -1222,8 +1222,9 @@ static int fts5SeekCursor(Fts5Cursor *pCsr){
|
||||
Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab);
|
||||
int eStmt = fts5StmtType(pCsr);
|
||||
rc = sqlite3Fts5StorageStmt(
|
||||
pTab->pStorage, eStmt, &pCsr->pStmt, &pTab->base.zErrMsg
|
||||
pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0)
|
||||
);
|
||||
assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 );
|
||||
assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) );
|
||||
}
|
||||
|
||||
@ -1618,7 +1619,7 @@ static int fts5ApiColumnText(
|
||||
*pz = 0;
|
||||
*pn = 0;
|
||||
}else{
|
||||
rc = fts5SeekCursor(pCsr);
|
||||
rc = fts5SeekCursor(pCsr, 0);
|
||||
if( rc==SQLITE_OK ){
|
||||
*pz = (const char*)sqlite3_column_text(pCsr->pStmt, iCol+1);
|
||||
*pn = sqlite3_column_bytes(pCsr->pStmt, iCol+1);
|
||||
@ -1962,7 +1963,7 @@ static int fts5ColumnMethod(
|
||||
}
|
||||
}
|
||||
}else if( !fts5IsContentless(pTab) ){
|
||||
rc = fts5SeekCursor(pCsr);
|
||||
rc = fts5SeekCursor(pCsr, 1);
|
||||
if( rc==SQLITE_OK ){
|
||||
sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1));
|
||||
}
|
||||
|
@ -298,8 +298,7 @@ static int fts5ConfigParseSpecial(
|
||||
}else{
|
||||
if( zArg[0] ){
|
||||
pConfig->eContent = FTS5_CONTENT_EXTERNAL;
|
||||
pConfig->zContent = sqlite3_mprintf("%Q.%Q", pConfig->zDb, zArg);
|
||||
if( pConfig->zContent==0 ) rc = SQLITE_NOMEM;
|
||||
pConfig->zContent = sqlite3Fts5Mprintf(&rc, "%Q.%Q", pConfig->zDb,zArg);
|
||||
}else{
|
||||
pConfig->eContent = FTS5_CONTENT_NONE;
|
||||
}
|
||||
@ -601,28 +600,21 @@ void sqlite3Fts5ConfigFree(Fts5Config *pConfig){
|
||||
*/
|
||||
int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){
|
||||
int i;
|
||||
int rc;
|
||||
int rc = SQLITE_OK;
|
||||
char *zSql;
|
||||
char *zOld;
|
||||
|
||||
zSql = (char*)sqlite3_mprintf("CREATE TABLE x(");
|
||||
zSql = sqlite3Fts5Mprintf(&rc, "CREATE TABLE x(");
|
||||
for(i=0; zSql && i<pConfig->nCol; i++){
|
||||
zOld = zSql;
|
||||
zSql = sqlite3_mprintf("%s%s%Q", zOld, (i==0?"":", "), pConfig->azCol[i]);
|
||||
sqlite3_free(zOld);
|
||||
const char *zSep = (i==0?"":", ");
|
||||
zSql = sqlite3Fts5Mprintf(&rc, "%z%s%Q", zSql, zSep, pConfig->azCol[i]);
|
||||
}
|
||||
zSql = sqlite3Fts5Mprintf(&rc, "%z, %Q HIDDEN, %s HIDDEN)",
|
||||
zSql, pConfig->zName, FTS5_RANK_NAME
|
||||
);
|
||||
|
||||
assert( zSql || rc==SQLITE_NOMEM );
|
||||
if( zSql ){
|
||||
zOld = zSql;
|
||||
zSql = sqlite3_mprintf("%s, %Q HIDDEN, %s HIDDEN)",
|
||||
zOld, pConfig->zName, FTS5_RANK_NAME
|
||||
);
|
||||
sqlite3_free(zOld);
|
||||
}
|
||||
|
||||
if( zSql==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
rc = sqlite3_declare_vtab(pConfig->db, zSql);
|
||||
sqlite3_free(zSql);
|
||||
}
|
||||
@ -823,7 +815,7 @@ int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){
|
||||
const char *zSelect = "SELECT k, v FROM %Q.'%q_config'";
|
||||
char *zSql;
|
||||
sqlite3_stmt *p = 0;
|
||||
int rc;
|
||||
int rc = SQLITE_OK;
|
||||
int iVersion = 0;
|
||||
|
||||
/* Set default values */
|
||||
@ -831,10 +823,8 @@ int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){
|
||||
pConfig->nAutomerge = FTS5_DEFAULT_AUTOMERGE;
|
||||
pConfig->nCrisisMerge = FTS5_DEFAULT_CRISISMERGE;
|
||||
|
||||
zSql = sqlite3_mprintf(zSelect, pConfig->zDb, pConfig->zName);
|
||||
if( zSql==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
zSql = sqlite3Fts5Mprintf(&rc, zSelect, pConfig->zDb, pConfig->zName);
|
||||
if( zSql ){
|
||||
rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &p, 0);
|
||||
sqlite3_free(zSql);
|
||||
}
|
||||
|
@ -791,14 +791,12 @@ static void fts5DataWrite(Fts5Index *p, i64 iRowid, const u8 *pData, int nData){
|
||||
if( p->rc!=SQLITE_OK ) return;
|
||||
|
||||
if( p->pWriter==0 ){
|
||||
int rc;
|
||||
int rc = SQLITE_OK;
|
||||
Fts5Config *pConfig = p->pConfig;
|
||||
char *zSql = sqlite3_mprintf(
|
||||
char *zSql = sqlite3Fts5Mprintf(&rc,
|
||||
"REPLACE INTO '%q'.%Q(id, block) VALUES(?,?)", pConfig->zDb, p->zDataTbl
|
||||
);
|
||||
if( zSql==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
if( zSql ){
|
||||
rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &p->pWriter, 0);
|
||||
sqlite3_free(zSql);
|
||||
}
|
||||
@ -4218,10 +4216,8 @@ int sqlite3Fts5IndexOpen(
|
||||
p->pConfig = pConfig;
|
||||
p->nWorkUnit = FTS5_WORK_UNIT;
|
||||
p->nMaxPendingData = 1024*1024;
|
||||
p->zDataTbl = sqlite3_mprintf("%s_data", pConfig->zName);
|
||||
if( p->zDataTbl==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else if( bCreate ){
|
||||
p->zDataTbl = sqlite3Fts5Mprintf(&rc, "%s_data", pConfig->zName);
|
||||
if( p->zDataTbl && bCreate ){
|
||||
rc = sqlite3Fts5CreateTable(
|
||||
pConfig, "data", "id INTEGER PRIMARY KEY, block BLOB", 0, pzErr
|
||||
);
|
||||
|
@ -250,13 +250,11 @@ static int fts5VocabOpenMethod(
|
||||
char *zSql = 0;
|
||||
int nByte;
|
||||
|
||||
zSql = sqlite3_mprintf(
|
||||
zSql = sqlite3Fts5Mprintf(&rc,
|
||||
"SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'",
|
||||
pTab->zFts5Tbl, pTab->zFts5Db, pTab->zFts5Tbl, pTab->zFts5Tbl
|
||||
);
|
||||
if( zSql==0 ){
|
||||
rc = SQLITE_NOMEM;
|
||||
}else{
|
||||
if( zSql ){
|
||||
rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
|
||||
}
|
||||
sqlite3_free(zSql);
|
||||
|
@ -28,6 +28,7 @@ foreach {tn outcome stmt} {
|
||||
6 2 { CREATE VIRTUAL TABLE t1 USING fts5(x, columnsize=2) }
|
||||
7 1 { CREATE VIRTUAL TABLE t1 USING fts5(x, columnsize=0, columnsize=1) }
|
||||
8 1 { CREATE VIRTUAL TABLE t1 USING fts5(x) }
|
||||
9 2 { CREATE VIRTUAL TABLE t1 USING fts5(x, columnsize=11) }
|
||||
} {
|
||||
execsql {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
@ -98,17 +99,17 @@ do_execsql_test 2.X {
|
||||
#
|
||||
fts5_aux_test_functions db
|
||||
|
||||
do_execsql_test 3.0 {
|
||||
do_execsql_test 3.1.0 {
|
||||
CREATE VIRTUAL TABLE t3 USING fts5(x, y UNINDEXED, z, columnsize=0);
|
||||
INSERT INTO t3 VALUES('a a', 'b b b', 'c');
|
||||
INSERT INTO t3 VALUES('x a x', 'b b b y', '');
|
||||
}
|
||||
do_execsql_test 3.1 {
|
||||
do_execsql_test 3.1.1 {
|
||||
SELECT rowid, fts5_test_columnsize(t3) FROM t3 WHERE t3 MATCH 'a'
|
||||
} {
|
||||
1 {2 0 1} 2 {3 0 0}
|
||||
}
|
||||
do_execsql_test 3.1 {
|
||||
do_execsql_test 3.1.2 {
|
||||
INSERT INTO t3 VALUES(NULL, NULL, 'a a a a');
|
||||
DELETE FROM t3 WHERE rowid = 1;
|
||||
SELECT rowid, fts5_test_columnsize(t3) FROM t3 WHERE t3 MATCH 'a'
|
||||
@ -116,4 +117,16 @@ do_execsql_test 3.1 {
|
||||
2 {3 0 0} 3 {0 0 4}
|
||||
}
|
||||
|
||||
do_execsql_test 3.2.0 {
|
||||
CREATE VIRTUAL TABLE t4 USING fts5(x, y UNINDEXED, z, columnsize=0, content='');
|
||||
INSERT INTO t4(rowid, x, y, z) VALUES(1, 'a a', 'b b b', 'c');
|
||||
INSERT INTO t4(rowid, x, y, z) VALUES(2, 'x a x', 'b b b y', '');
|
||||
}
|
||||
do_execsql_test 3.2.1 {
|
||||
SELECT rowid, fts5_test_columnsize(t4) FROM t4 WHERE t4 MATCH 'a'
|
||||
} {
|
||||
1 {-1 0 -1} 2 {-1 0 -1}
|
||||
}
|
||||
|
||||
|
||||
finish_test
|
||||
|
20
manifest
20
manifest
@ -1,5 +1,5 @@
|
||||
C Merge\slatest\strunk\schanges\swith\sthis\sbranch.\sAdd\stests\sfor\scolumnsize=0.
|
||||
D 2015-06-23T15:06:13.029
|
||||
C Improve\stest\scoverage\sof\sfts5.
|
||||
D 2015-06-23T18:47:55.733
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in 6fa5a3c6f1f558bb443429e33806e2e494823e44
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@ -105,21 +105,21 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
|
||||
F ext/fts3/unicode/mkunicode.tcl ed0534dd51efce39878bce33944c6073d37a1e20
|
||||
F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
|
||||
F ext/fts5/extract_api_docs.tcl 55a6d648d516f35d9a1e580ac00de27154e1904a
|
||||
F ext/fts5/fts5.c 4ce5d0990c61a41155fc014b0066ae6d25a388d3
|
||||
F ext/fts5/fts5.c d7c58bd8c025a2202365194f2340930533f6ac24
|
||||
F ext/fts5/fts5.h 81d1a92fc2b4bd477af7e4e0b38b456f3e199fba
|
||||
F ext/fts5/fts5Int.h 21eb91e02ad119e1d92ff100f366a976e12190de
|
||||
F ext/fts5/fts5_aux.c d53f00f31ad615ca4f139dd8751f9041afa00971
|
||||
F ext/fts5/fts5_buffer.c be0dc80a9406151b350be27c7ec2956722578771
|
||||
F ext/fts5/fts5_config.c 6ae691e36f90185896f4db0a819ae2394f880ca1
|
||||
F ext/fts5/fts5_config.c c232d181d6324f0ae3a2a31319924473999e5816
|
||||
F ext/fts5/fts5_expr.c 549bda1f7edcf10365fbfbc002bdea1be3c287bb
|
||||
F ext/fts5/fts5_hash.c c1cfdb2cae0fad00b06fae38a40eaf9261563ccc
|
||||
F ext/fts5/fts5_index.c 7cea402924cd3d8cd5943a7f9514c9153696571b
|
||||
F ext/fts5/fts5_index.c 707bbc0c30e37748af69a5d1871ad2f59e5c5179
|
||||
F ext/fts5/fts5_storage.c b2fa301fce865d582d367a5e1bb438fe60c03cb5
|
||||
F ext/fts5/fts5_tcl.c 7ea165878e4ae3598e89acd470a0ee1b5a00e33c
|
||||
F ext/fts5/fts5_tokenize.c 97251d68d7a6a9415bde1203f9382864dfc1f989
|
||||
F ext/fts5/fts5_unicode2.c da3cf712f05cd8347c8c5bc00964cc0361c88da9
|
||||
F ext/fts5/fts5_varint.c 366452037bf9a000c351374b489badc1b3541796
|
||||
F ext/fts5/fts5_vocab.c 1f8543b2c1ae4427f127a911bc8e60873fcd7bf9
|
||||
F ext/fts5/fts5_vocab.c e454fa58c6d591024659a9b61eece0d708e8b575
|
||||
F ext/fts5/fts5parse.y 833db1101b78c0c47686ab1b84918e38c36e9452
|
||||
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
|
||||
F ext/fts5/test/fts5_common.tcl 0b465b1127adcd1c8131f3454ab4264a6964674c
|
||||
@ -140,7 +140,7 @@ F ext/fts5/test/fts5auto.test caa5bcf917db11944655a2a9bd38c67c520376ca
|
||||
F ext/fts5/test/fts5aux.test e5631607bbc05ac1c38cf7d691000509aca71ef3
|
||||
F ext/fts5/test/fts5auxdata.test c69b86092bf1a157172de5f9169731af3403179b
|
||||
F ext/fts5/test/fts5bigpl.test b1cfd00561350ab04994ba7dd9d48468e5e0ec3b
|
||||
F ext/fts5/test/fts5columnsize.test bd07a42a80a6805e84afa7daf54ecd4563f752d0
|
||||
F ext/fts5/test/fts5columnsize.test 771401dd7fc628ecb38316613ed2f3cbe8f2b78a
|
||||
F ext/fts5/test/fts5config.test c9cc535f3b36cde1e5a32bf579f3f5962a9e82b2
|
||||
F ext/fts5/test/fts5content.test e46904decd896e38c848ad4f38fa4e80251a028b
|
||||
F ext/fts5/test/fts5corrupt.test 35bfdbbb3cdcea46ae7385f6432e9b5c574e70a1
|
||||
@ -1363,7 +1363,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P 0f7fd51325875fbf0f1eaca3bbbd170ef99c4208 4df852ce26c95d5d23c83dbe9c59d2c3435acddf
|
||||
R 3ac475f744e56c1ad80818d65ed40944
|
||||
P ef44c71a22518727030dd90c0139af8973b05841
|
||||
R 41ab20c81b8eca2b8b1f4493d7071c96
|
||||
U dan
|
||||
Z b74a37a10556c5365b257dc3f6c234f4
|
||||
Z 674a570e3df1810e4f64caae14985366
|
||||
|
@ -1 +1 @@
|
||||
ef44c71a22518727030dd90c0139af8973b05841
|
||||
df5ccea80e8f0da83af5e595b539687006085120
|
Reference in New Issue
Block a user