Index: ext/fts3/fts3.c
==================================================================
--- ext/fts3/fts3.c
+++ ext/fts3/fts3.c
@@ -3525,10 +3525,12 @@
case 3: zEnd = (const char*)sqlite3_value_text(apVal[2]);
case 2: zStart = (const char*)sqlite3_value_text(apVal[1]);
}
if( !zEllipsis || !zEnd || !zStart ){
sqlite3_result_error_nomem(pContext);
+ }else if( nToken==0 ){
+ sqlite3_result_text(pContext, "", -1, SQLITE_STATIC);
}else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){
sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken);
}
}
Index: test/fts3snippet.test
==================================================================
--- test/fts3snippet.test
+++ test/fts3snippet.test
@@ -535,9 +535,28 @@
SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'three';
} {{[one two three]}}
do_execsql_test 3.4 {
SELECT snippet(t3) FROM t3 WHERE t3 MATCH 'one OR two OR three';
} {{[one two three]}}
+
+#-------------------------------------------------------------------------
+# Request a snippet 0 tokens in size. This is always an empty string.
+do_execsql_test 4.1 {
+ CREATE VIRTUAL TABLE t4 USING fts4;
+ INSERT INTO t4 VALUES('a b c d');
+ SELECT snippet(t4, '[', ']', '...', 0, 0) FROM t4 WHERE t4 MATCH 'b';
+} {{}}
+
+do_test 4.2 {
+ set x35 [string trim [string repeat "x " 35]]
+ execsql "INSERT INTO t4 VALUES('$x35 E $x35 F $x35 G $x35');"
+ llength [db one {
+ SELECT snippet(t4, '', '', '', 0, 64) FROM t4 WHERE t4 MATCH 'E'
+ }]
+} {64}
+
+
+
set sqlite_fts3_enable_parentheses 0
finish_test