Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | If the library is built with SQLITE_VDBE_COVERAGE defined, have the Tcl tests generate a vdbe coverage report in file testdir/vdbe_coverage.txt. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
f0ed714637bf30443d0551d9b6fececa |
User & Date: | dan 2019-04-01 17:24:20.449 |
Context
2019-04-01
| ||
18:43 | Add a test case to cover a missed VDBE branch generated by window.c. (check-in: b36813d646 user: dan tags: trunk) | |
17:24 | If the library is built with SQLITE_VDBE_COVERAGE defined, have the Tcl tests generate a vdbe coverage report in file testdir/vdbe_coverage.txt. (check-in: f0ed714637 user: dan tags: trunk) | |
16:23 | Frame range comparisons can never be NULL because the values will have been checked for NULL prior to the test. (check-in: fa37cf9a6a user: drh tags: trunk) | |
Changes
Changes to Makefile.in.
︙ | ︙ | |||
418 419 420 421 422 423 424 425 426 427 428 429 430 431 | $(TOP)/src/test_schema.c \ $(TOP)/src/test_server.c \ $(TOP)/src/test_superlock.c \ $(TOP)/src/test_syscall.c \ $(TOP)/src/test_tclsh.c \ $(TOP)/src/test_tclvar.c \ $(TOP)/src/test_thread.c \ $(TOP)/src/test_vfs.c \ $(TOP)/src/test_windirent.c \ $(TOP)/src/test_window.c \ $(TOP)/src/test_wsd.c \ $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_test.c \ $(TOP)/ext/session/test_session.c \ | > | 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | $(TOP)/src/test_schema.c \ $(TOP)/src/test_server.c \ $(TOP)/src/test_superlock.c \ $(TOP)/src/test_syscall.c \ $(TOP)/src/test_tclsh.c \ $(TOP)/src/test_tclvar.c \ $(TOP)/src/test_thread.c \ $(TOP)/src/test_vdbecov.c \ $(TOP)/src/test_vfs.c \ $(TOP)/src/test_windirent.c \ $(TOP)/src/test_window.c \ $(TOP)/src/test_wsd.c \ $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_test.c \ $(TOP)/ext/session/test_session.c \ |
︙ | ︙ |
Changes to Makefile.msc.
︙ | ︙ | |||
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 | $(TOP)\src\test_schema.c \ $(TOP)\src\test_server.c \ $(TOP)\src\test_superlock.c \ $(TOP)\src\test_syscall.c \ $(TOP)\src\test_tclsh.c \ $(TOP)\src\test_tclvar.c \ $(TOP)\src\test_thread.c \ $(TOP)\src\test_vfs.c \ $(TOP)\src\test_windirent.c \ $(TOP)\src\test_window.c \ $(TOP)\src\test_wsd.c \ $(TOP)\ext\fts3\fts3_term.c \ $(TOP)\ext\fts3\fts3_test.c \ $(TOP)\ext\rbu\test_rbu.c \ | > | 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 | $(TOP)\src\test_schema.c \ $(TOP)\src\test_server.c \ $(TOP)\src\test_superlock.c \ $(TOP)\src\test_syscall.c \ $(TOP)\src\test_tclsh.c \ $(TOP)\src\test_tclvar.c \ $(TOP)\src\test_thread.c \ $(TOP)\src\test_vdbecov.c \ $(TOP)\src\test_vfs.c \ $(TOP)\src\test_windirent.c \ $(TOP)\src\test_window.c \ $(TOP)\src\test_wsd.c \ $(TOP)\ext\fts3\fts3_term.c \ $(TOP)\ext\fts3\fts3_test.c \ $(TOP)\ext\rbu\test_rbu.c \ |
︙ | ︙ |
Changes to main.mk.
︙ | ︙ | |||
344 345 346 347 348 349 350 351 352 353 354 355 356 357 | $(TOP)/src/test_server.c \ $(TOP)/src/test_sqllog.c \ $(TOP)/src/test_superlock.c \ $(TOP)/src/test_syscall.c \ $(TOP)/src/test_tclsh.c \ $(TOP)/src/test_tclvar.c \ $(TOP)/src/test_thread.c \ $(TOP)/src/test_vfs.c \ $(TOP)/src/test_windirent.c \ $(TOP)/src/test_window.c \ $(TOP)/src/test_wsd.c # Extensions to be statically loaded. # | > | 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 | $(TOP)/src/test_server.c \ $(TOP)/src/test_sqllog.c \ $(TOP)/src/test_superlock.c \ $(TOP)/src/test_syscall.c \ $(TOP)/src/test_tclsh.c \ $(TOP)/src/test_tclvar.c \ $(TOP)/src/test_thread.c \ $(TOP)/src/test_vdbecov.c \ $(TOP)/src/test_vfs.c \ $(TOP)/src/test_windirent.c \ $(TOP)/src/test_window.c \ $(TOP)/src/test_wsd.c # Extensions to be statically loaded. # |
︙ | ︙ |
Changes to src/test_tclsh.c.
︙ | ︙ | |||
102 103 104 105 106 107 108 109 110 111 112 113 114 115 | extern int Sqlitetestfts3_Init(Tcl_Interp *interp); #endif #ifdef SQLITE_ENABLE_ZIPVFS extern int Zipvfs_Init(Tcl_Interp*); #endif extern int TestExpert_Init(Tcl_Interp*); extern int Sqlitetest_window_Init(Tcl_Interp *); Tcl_CmdInfo cmdInfo; /* Since the primary use case for this binary is testing of SQLite, ** be sure to generate core files if we crash */ #if defined(unix) { struct rlimit x; | > | 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | extern int Sqlitetestfts3_Init(Tcl_Interp *interp); #endif #ifdef SQLITE_ENABLE_ZIPVFS extern int Zipvfs_Init(Tcl_Interp*); #endif extern int TestExpert_Init(Tcl_Interp*); extern int Sqlitetest_window_Init(Tcl_Interp *); extern int Sqlitetestvdbecov_Init(Tcl_Interp *); Tcl_CmdInfo cmdInfo; /* Since the primary use case for this binary is testing of SQLite, ** be sure to generate core files if we crash */ #if defined(unix) { struct rlimit x; |
︙ | ︙ | |||
167 168 169 170 171 172 173 174 175 176 177 178 179 180 | Sqlitetesttcl_Init(interp); #if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) Sqlitetestfts3_Init(interp); #endif TestExpert_Init(interp); Sqlitetest_window_Init(interp); Tcl_CreateObjCommand( interp, "load_testfixture_extensions", load_testfixture_extensions,0,0 ); return 0; } | > | 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | Sqlitetesttcl_Init(interp); #if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) Sqlitetestfts3_Init(interp); #endif TestExpert_Init(interp); Sqlitetest_window_Init(interp); Sqlitetestvdbecov_Init(interp); Tcl_CreateObjCommand( interp, "load_testfixture_extensions", load_testfixture_extensions,0,0 ); return 0; } |
︙ | ︙ |
Added src/test_vdbecov.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | /* ** 2019 April 02 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ****************************************************************************** ** */ #if SQLITE_TEST /* This file is used for testing only */ #include "sqlite3.h" #include "sqliteInt.h" #if defined(INCLUDE_SQLITE_TCL_H) # include "sqlite_tcl.h" #else # include "tcl.h" #endif #ifdef SQLITE_VDBE_COVERAGE static u8 aBranchArray[200000]; static void test_vdbe_branch( void *pCtx, unsigned int iSrc, unsigned char iBranch, unsigned char iType ){ if( iSrc<sizeof(aBranchArray) ){ aBranchArray[iSrc] |= iBranch; } } static void appendToList(Tcl_Obj *pList, int iLine, int iPath){ Tcl_Obj *pNew = Tcl_NewObj(); Tcl_IncrRefCount(pNew); Tcl_ListObjAppendElement(0, pNew, Tcl_NewIntObj(iLine)); Tcl_ListObjAppendElement(0, pNew, Tcl_NewIntObj(iPath)); Tcl_ListObjAppendElement(0, pList, pNew); Tcl_DecrRefCount(pNew); } static int SQLITE_TCLAPI test_vdbe_coverage( ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[] ){ const char *aSub[] = { "start", "report", "stop", 0 }; int iSub = -1; if( objc!=2 ){ Tcl_WrongNumArgs(interp, 1, objv, "sub-command"); return TCL_ERROR; } if( Tcl_GetIndexFromObj(interp, objv[1], aSub, "sub-command", 0, &iSub) ){ return TCL_ERROR; } Tcl_ResetResult(interp); assert( iSub==0 || iSub==1 || iSub==2 ); switch( iSub ){ case 0: /* start */ memset(aBranchArray, 0, sizeof(aBranchArray)); sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, test_vdbe_branch, 0); break; case 1: { /* report */ int i; Tcl_Obj *pRes = Tcl_NewObj(); Tcl_IncrRefCount(pRes); for(i=0; i<sizeof(aBranchArray); i++){ u8 b = aBranchArray[i]; if( b ){ if( (b & 0x01)==0 ) appendToList(pRes, i, 0); if( (b & 0x02)==0 ) appendToList(pRes, i, 1); if( (b & 0x04)==0 ) appendToList(pRes, i, 2); } } Tcl_SetObjResult(interp, pRes); Tcl_DecrRefCount(pRes); break; }; default: /* stop */ sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, 0, 0); break; } return TCL_OK; } #endif /* SQLITE_VDBE_COVERAGE */ int Sqlitetestvdbecov_Init(Tcl_Interp *interp){ #ifdef SQLITE_VDBE_COVERAGE Tcl_CreateObjCommand(interp, "vdbe_coverage", test_vdbe_coverage, 0, 0); #endif return TCL_OK; } #endif |
Changes to test/tester.tcl.
︙ | ︙ | |||
572 573 574 575 576 577 578 579 580 581 582 583 584 585 | set ::G(output_fd) [open $cmdlinearg(output) w] fconfigure $::G(output_fd) -buffering line } if {$cmdlinearg(verbose)==""} { set cmdlinearg(verbose) 1 } } # Update the soft-heap-limit each time this script is run. In that # way if an individual test file changes the soft-heap-limit, it # will be reset at the start of the next test file. # sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit) | > > > > | 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 | set ::G(output_fd) [open $cmdlinearg(output) w] fconfigure $::G(output_fd) -buffering line } if {$cmdlinearg(verbose)==""} { set cmdlinearg(verbose) 1 } if {[info commands vdbe_coverage]!=""} { vdbe_coverage start } } # Update the soft-heap-limit each time this script is run. In that # way if an individual test file changes the soft-heap-limit, it # will be reset at the start of the next test file. # sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit) |
︙ | ︙ | |||
1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 | sqlite3_memdebug_log stop sqlite3_memdebug_log clear if {[sqlite3_memory_used]>0} { output2 "Writing leaks.tcl..." sqlite3_memdebug_log sync memdebug_log_sql leaks.tcl } } foreach f [glob -nocomplain test.db-*-journal] { forcedelete $f } foreach f [glob -nocomplain test.db-mj*] { forcedelete $f } exit [expr {$nErr>0}] } # Display memory statistics for analysis and debugging purposes. # proc show_memstats {} { set x [sqlite3_status SQLITE_STATUS_MEMORY_USED 0] set y [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] set val [format {now %10d max %10d max-size %10d} \ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 | sqlite3_memdebug_log stop sqlite3_memdebug_log clear if {[sqlite3_memory_used]>0} { output2 "Writing leaks.tcl..." sqlite3_memdebug_log sync memdebug_log_sql leaks.tcl } } if {[info commands vdbe_coverage]!=""} { vdbe_coverage_report } foreach f [glob -nocomplain test.db-*-journal] { forcedelete $f } foreach f [glob -nocomplain test.db-mj*] { forcedelete $f } exit [expr {$nErr>0}] } proc vdbe_coverage_report {} { puts "Writing vdbe coverage report to vdbe_coverage.txt" set lSrc [list] set iLine 0 if {[file exists ../sqlite3.c]} { set fd [open ../sqlite3.c] set iLine while { ![eof $fd] } { set line [gets $fd] incr iLine if {[regexp {^/\** Begin file (.*\.c) \**/} $line -> file]} { lappend lSrc [list $iLine $file] } } close $fd } set fd [open vdbe_coverage.txt w] foreach miss [vdbe_coverage report] { foreach {line branch} $miss {} set nextfile "" while {[llength $lSrc]>0 && [lindex $lSrc 0 0] < $line} { set nextfile [lindex $lSrc 0 1] set lSrc [lrange $lSrc 1 end] } if {$nextfile != ""} { puts $fd "" puts $fd "### $nextfile ###" } puts $fd "Vdbe branch $line: path $branch never taken" } close $fd } # Display memory statistics for analysis and debugging purposes. # proc show_memstats {} { set x [sqlite3_status SQLITE_STATUS_MEMORY_USED 0] set y [sqlite3_status SQLITE_STATUS_MALLOC_SIZE 0] set val [format {now %10d max %10d max-size %10d} \ |
︙ | ︙ |
Changes to test/windowerr.tcl.
︙ | ︙ | |||
50 51 52 53 54 55 56 57 58 59 60 | errorsql_test 2.1 { SELECT sum( sum(a) OVER () ) FROM t1; } errorsql_test 2.2 { SELECT sum(a) OVER () AS xyz FROM t1 ORDER BY sum(xyz); } finish_test | > > > > > > > > > | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | errorsql_test 2.1 { SELECT sum( sum(a) OVER () ) FROM t1; } errorsql_test 2.2 { SELECT sum(a) OVER () AS xyz FROM t1 ORDER BY sum(xyz); } errorsql_test 3.0 { SELECT sum(a) OVER win FROM t1 WINDOW win AS (ROWS BETWEEN 'hello' PRECEDING AND 10 FOLLOWING) } errorsql_test 3.2 { SELECT sum(a) OVER win FROM t1 WINDOW win AS (ROWS BETWEEN 10 PRECEDING AND x'ABCD' FOLLOWING) } finish_test |
Changes to test/windowerr.test.
︙ | ︙ | |||
91 92 93 94 95 96 97 98 99 | SELECT sum( sum(a) OVER () ) FROM t1; } } } 1 # PG says ERROR: column "xyz" does not exist do_test 2.2 { catch { execsql { SELECT sum(a) OVER () AS xyz FROM t1 ORDER BY sum(xyz); } } } 1 finish_test | > > > > > > > > > > > > | 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | SELECT sum( sum(a) OVER () ) FROM t1; } } } 1 # PG says ERROR: column "xyz" does not exist do_test 2.2 { catch { execsql { SELECT sum(a) OVER () AS xyz FROM t1 ORDER BY sum(xyz); } } } 1 # PG says ERROR: invalid input syntax for integer: "hello" do_test 3.0 { catch { execsql { SELECT sum(a) OVER win FROM t1 WINDOW win AS (ROWS BETWEEN 'hello' PRECEDING AND 10 FOLLOWING) } } } 1 # PG says ERROR: argument of ROWS must be type bigint, not type bit do_test 3.2 { catch { execsql { SELECT sum(a) OVER win FROM t1 WINDOW win AS (ROWS BETWEEN 10 PRECEDING AND x'ABCD' FOLLOWING) } } } 1 finish_test |