SQLite

Check-in [d4928fb5cd]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Update the fts5vocab table to handle "ORDER BY term" efficiently.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: d4928fb5cd63a72808f01778fa5a11395385dedf
User & Date: dan 2016-09-21 14:41:09.595
Context
2016-09-21
17:47
Do not run test "delete_db.test" with either the journaltest or inmemoryjournal permutations. Ensure that the multiplexor tests in delete_db.test are performed in non-autovacuum mode. (check-in: 46b7d19e02 user: dan tags: trunk)
14:41
Update the fts5vocab table to handle "ORDER BY term" efficiently. (check-in: d4928fb5cd user: dan tags: trunk)
2016-09-20
22:04
Improved implementation of 64-bit signed integer multiply that correctly detects overflow (and promotes to floating-point) in some corner cases. Fix for ticket [1ec41379c9c1e400] (check-in: db3ebd7c52 user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to ext/fts5/fts5_vocab.c.
275
276
277
278
279
280
281





282




283


284
285
286
287
288
289
290
    if( iTermLe>=0 ){
      idxNum |= FTS5_VOCAB_TERM_LE;
      pInfo->aConstraintUsage[iTermLe].argvIndex = ++nArg;
      pInfo->estimatedCost = pInfo->estimatedCost / 2;
    }
  }






  pInfo->idxNum = idxNum;







  return SQLITE_OK;
}

/*
** Implementation of xOpen method.
*/
static int fts5VocabOpenMethod(







>
>
>
>
>
|
>
>
>
>
|
>
>







275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
    if( iTermLe>=0 ){
      idxNum |= FTS5_VOCAB_TERM_LE;
      pInfo->aConstraintUsage[iTermLe].argvIndex = ++nArg;
      pInfo->estimatedCost = pInfo->estimatedCost / 2;
    }
  }

  /* This virtual table always delivers results in ascending order of
  ** the "term" column (column 0). So if the user has requested this
  ** specifically - "ORDER BY term" or "ORDER BY term ASC" - set the
  ** sqlite3_index_info.orderByConsumed flag to tell the core the results
  ** are already in sorted order.  */
  if( pInfo->nOrderBy==1 
   && pInfo->aOrderBy[0].iColumn==0 
   && pInfo->aOrderBy[0].desc==0
  ){
    pInfo->orderByConsumed = 1;
  }

  pInfo->idxNum = idxNum;
  return SQLITE_OK;
}

/*
** Implementation of xOpen method.
*/
static int fts5VocabOpenMethod(
Changes to ext/fts5/test/fts5vocab.test.
438
439
440
441
442
443
444
445
446




































447
448
449
} else {
  do_catchsql_test 8.2.2 { 
    SELECT * FROM x1_c 
  } {1 {database disk image is malformed}}
}

sqlite3_fts5_may_be_corrupt 0

}





































finish_test








|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
} else {
  do_catchsql_test 8.2.2 { 
    SELECT * FROM x1_c 
  } {1 {database disk image is malformed}}
}

sqlite3_fts5_may_be_corrupt 0
}

#-------------------------------------------------------------------------
# Test that both "ORDER BY term" and "ORDER BY term DESC" work.
#
reset_db
do_execsql_test 9.1 {
  CREATE VIRTUAL TABLE x1 USING fts5(x);
  INSERT INTO x1 VALUES('def ABC ghi');
  INSERT INTO x1 VALUES('DEF abc GHI');
}

do_execsql_test 9.2 {
  CREATE VIRTUAL TABLE rrr USING fts5vocab(x1, row);
  SELECT * FROM rrr
} {
  abc 2 2 def 2 2 ghi 2 2
}
do_execsql_test 9.3 {
  SELECT * FROM rrr ORDER BY term ASC
} {
  abc 2 2 def 2 2 ghi 2 2
}
do_execsql_test 9.4 {
  SELECT * FROM rrr ORDER BY term DESC
} {
  ghi 2 2 def 2 2 abc 2 2 
}
do_test 9.5 {
  set e2 [db eval { EXPLAIN SELECT * FROM rrr ORDER BY term ASC }]
  expr [lsearch $e2 SorterSort]<0
} 1
do_test 9.6 {
  set e2 [db eval { EXPLAIN SELECT * FROM rrr ORDER BY term DESC }]
  expr [lsearch $e2 SorterSort]<0
} 0



finish_test