3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #***********************************************************************
12 # This file implements a program that produces scripts (either shell scripts
13 # or batch files) to implement a particular test that is part of the SQLite
14 # release testing procedure. For example, to run veryquick.test with a
15 # specified set of -D compiler switches.
17 # A "configuration" is a set of options passed to [./configure] and [make]
18 # to build the SQLite library in a particular fashion. A "platform" is a
19 # list of tests; most platforms are named after the hardware/OS platform
20 # that the tests will be run on as part of the release procedure. Each
21 # "test" is a combination of a configuration and a makefile target (e.g.
22 # "fulltest"). The program may be invoked as follows:
25 $argv0 script ?
-msvc? CONFIGURATION TARGET
26 Given a configuration and make target
, return a bash
(or
, if -msvc
27 is specified
, batch
) script to execute the test. The first argument
28 passed to the script must be a directory containing SQLite
source code.
31 List available configurations.
34 List available platforms.
36 $argv0 tests ?
-nodebug? PLATFORM
37 List tests in a specified platform. If the
-nodebug switch is
38 specified
, synthetic debug
/ndebug configurations are omitted. Each
39 test is a combination of a configuration and a makefile target.
42 # Omit comments (text between # and \n) in a long multi-line string.
44 proc strip_comments
{in
} {
45 regsub -all {#[^\n]*\n} $in {} out
49 array set ::Configs [strip_comments
{
52 --disable-amalgamation
--disable-shared
56 CC
=clang
-fsanitize=address
,undefined
58 -DCONFIG_SLOWDOWN_FACTOR=5.0
67 # The "Have-Not" configuration sets all possible -UHAVE_feature options
68 # in order to verify that the code works even on platforms that lack
69 # these support services.
75 -DHAVE_MALLOC_USABLE_SIZE=0
82 -DSQLITE_ENABLE_UNLOCK_NOTIFY
84 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
88 -DSQLITE_USER_AUTHENTICATION=1
92 -DSQLITE_SECURE_DELETE=1
95 "Update-Delete-Limit" {
97 -DSQLITE_DEFAULT_FILE_FORMAT=4
98 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
99 -DSQLITE_ENABLE_STMT_SCANSTATUS
100 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS
101 -DSQLITE_ENABLE_CURSOR_HINTS
106 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
107 -DSQLITE_ENABLE_FTS3=1
108 -DSQLITE_ENABLE_RTREE=1
109 -DSQLITE_ENABLE_MEMSYS5=1
110 -DSQLITE_ENABLE_MEMSYS3=1
111 -DSQLITE_ENABLE_COLUMN_METADATA=1
112 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
113 -DSQLITE_SECURE_DELETE=1
115 -DSQLITE_ENABLE_ATOMIC_WRITE=1
116 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
117 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
118 -DSQLITE_ENABLE_STAT4
119 -DSQLITE_ENABLE_STMT_SCANSTATUS
120 --enable-json
1 --enable-fts
5 --enable-session
127 -DSQLITE_MUTEX_NOOP=1
128 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
129 -DSQLITE_ENABLE_FTS3=1
130 -DSQLITE_ENABLE_RTREE=1
131 -DSQLITE_ENABLE_MEMSYS5=1
132 -DSQLITE_ENABLE_COLUMN_METADATA=1
133 -DSQLITE_ENABLE_STAT4
134 -DSQLITE_ENABLE_HIDDEN_COLUMNS
135 -DSQLITE_MAX_ATTACHED=125
136 -DSQLITE_MUTATION_TEST
137 --enable-fts
5 --enable-json
1
140 -DSQLITE_DEFAULT_MEMSTATUS=0
141 -DSQLITE_MAX_EXPR_DEPTH=0
146 -DSQLITE_ENABLE_FTS4=1
147 -DSQLITE_ENABLE_RTREE=1
148 -DSQLITE_ENABLE_STAT4
150 -DSQLITE_MAX_ATTACHED=125
151 -DSQLITE_MAX_MMAP_SIZE=12884901888
152 -DSQLITE_ENABLE_SORTER_MMAP=1
153 -DLONGDOUBLE_TYPE=double
159 -DSQLITE_DEFAULT_AUTOVACUUM=1
160 -DSQLITE_DEFAULT_CACHE_SIZE=64
161 -DSQLITE_DEFAULT_PAGE_SIZE=1024
162 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
163 -DSQLITE_DISABLE_LFS=1
164 -DSQLITE_ENABLE_ATOMIC_WRITE=1
165 -DSQLITE_ENABLE_IOTRACE=1
166 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
167 -DSQLITE_MAX_PAGE_SIZE=4096
168 -DSQLITE_OMIT_LOAD_EXTENSION=1
169 -DSQLITE_OMIT_PROGRESS_CALLBACK=1
170 -DSQLITE_OMIT_VIRTUALTABLE=1
171 -DSQLITE_ENABLE_HIDDEN_COLUMNS
172 -DSQLITE_TEMP_STORE=3
176 -DSQLITE_4_BYTE_ALIGNED_MALLOC=1
177 -DSQLITE_DEFAULT_AUTOVACUUM=1
178 -DSQLITE_DEFAULT_CACHE_SIZE=1000
179 -DSQLITE_DEFAULT_LOCKING_MODE=0
180 -DSQLITE_DEFAULT_PAGE_SIZE=1024
181 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
182 -DSQLITE_DISABLE_LFS=1
183 -DSQLITE_ENABLE_FTS3=1
184 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
185 -DSQLITE_ENABLE_RTREE=1
186 -DSQLITE_MAX_COMPOUND_SELECT=50
187 -DSQLITE_MAX_PAGE_SIZE=32768
188 -DSQLITE_OMIT_TRACE=1
189 -DSQLITE_TEMP_STORE=3
190 -DSQLITE_THREADSAFE=2
191 --enable-json
1 --enable-fts
5 --enable-session
195 -DSQLITE_ENABLE_LOCKING_STYLE=1
205 -DSQLITE_DEFAULT_CACHE_SIZE=1000
206 -DSQLITE_DEFAULT_CKPTFULLFSYNC=1
207 -DSQLITE_DEFAULT_MEMSTATUS=1
208 -DSQLITE_DEFAULT_PAGE_SIZE=1024
209 -DSQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS=1
210 -DSQLITE_ENABLE_API_ARMOR=1
211 -DSQLITE_ENABLE_AUTO_PROFILE=1
212 -DSQLITE_ENABLE_FLOCKTIMEOUT=1
213 -DSQLITE_ENABLE_FTS3=1
214 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
215 -DSQLITE_ENABLE_FTS3_TOKENIZER=1
216 -DSQLITE_ENABLE_PERSIST_WAL=1
217 -DSQLITE_ENABLE_PURGEABLE_PCACHE=1
218 -DSQLITE_ENABLE_RTREE=1
219 -DSQLITE_ENABLE_SNAPSHOT=1
220 # -DSQLITE_ENABLE_SQLLOG=1
221 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
222 -DSQLITE_MAX_LENGTH=2147483645
223 -DSQLITE_MAX_VARIABLE_NUMBER=500000
224 # -DSQLITE_MEMDEBUG=1
226 -DSQLITE_OMIT_AUTORESET=1
227 -DSQLITE_OMIT_LOAD_EXTENSION=1
228 -DSQLITE_PREFER_PROXY_LOCKING=1
229 -DSQLITE_SERIES_CONSTRAINT_VERIFY=1
230 -DSQLITE_THREADSAFE=2
232 -DSQLITE_WRITE_WALFRAME_PREBUFFERED=1
235 --enable-json
1 --enable-fts
5
238 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
239 -DSQLITE_MAX_ATTACHED=62
242 -DSQLITE_DEFAULT_FILE_FORMAT=4
243 -DSQLITE_MAX_ATTACHED=30
244 -DSQLITE_ENABLE_COLUMN_METADATA
247 -DSQLITE_ENABLE_FTS4_PARENTHESIS
248 -DSQLITE_DISABLE_FTS4_DEFERRED
249 -DSQLITE_ENABLE_RTREE
250 --enable-json
1 --enable-fts
5
253 -DSQLITE_TEST_REALLOC_STRESS=1
254 -DSQLITE_OMIT_LOOKASIDE=1
257 -DSQLITE_ENABLE_STAT4
259 -DSQLITE_ENABLE_RTREE
260 -DSQLITE_ENABLE_HIDDEN_COLUMNS
261 -DCONFIG_SLOWDOWN_FACTOR=8.0
269 "Windows-Win32Heap" {
274 # The next group of configurations are used only by the
275 # Failure-Detection platform. They are all the same, but we need
276 # different names for them all so that they results appear in separate
286 if {$tcl_platform(os
)=="Darwin"} {
287 lappend Configs
(Apple
) -DSQLITE_ENABLE_LOCKING_STYLE=1
290 array set ::Platforms [strip_comments
{
292 "Check-Symbols*" "" checksymbols
293 "Fast-One" QUICKTEST_INCLUDE
=rbu.test
"fuzztest test"
294 "Debug-One" "" "mptest test"
297 "Secure-Delete" "" test
298 "Unlock-Notify" QUICKTEST_INCLUDE
=notify2.test test
299 "User-Auth" "" tcltest
300 "Update-Delete-Limit" "" test
301 "Extra-Robustness" "" test
302 "Device-Two" "" "threadtest test"
303 "No-lookaside" "" test
307 "Device-One" "" alltest
308 "Default" "" "threadtest fuzztest alltest"
309 "Valgrind*" "" valgrindtest
314 "Unlock-Notify" QUICKTEST_INCLUDE
=notify2.test test
317 "Default" "" "threadtest fuzztest alltest"
320 "Locking-Style" "" "mptest test"
322 "Apple" "" "threadtest fuzztest alltest"
325 "Locking-Style" "" "mptest test"
327 "Apple" "" "threadtest fuzztest alltest"
330 "Locking-Style" "" "mptest test"
332 "Apple" "" "threadtest fuzztest alltest"
337 "Windows-Memdebug*" "" test
338 "Windows-Win32Heap*" "" test
339 "Default" "" "mptest fulltestonly"
344 "Windows-Memdebug*" "" test
345 "Windows-Win32Heap*" "" test
346 "Default" "" "mptest fulltestonly"
349 # The Failure-Detection platform runs various tests that deliberately
350 # fail. This is used as a test of this script to verify that this script
351 # correctly identifies failures.
354 Fail0
* "TEST_FAILURE=0" test
355 Sanitize
* "TEST_FAILURE=1" test
356 Fail2
* "TEST_FAILURE=2" valgrindtest
357 Fail3
* "TEST_FAILURE=3" valgrindtest
358 Fail4
* "TEST_FAILURE=4" test
359 FuzzFail1
* "TEST_FAILURE=5" test
360 FuzzFail2
* "TEST_FAILURE=5" valgrindtest
364 #--------------------------------------------------------------------------
365 #--------------------------------------------------------------------------
366 #--------------------------------------------------------------------------
367 # End of configuration section.
368 #--------------------------------------------------------------------------
369 #--------------------------------------------------------------------------
370 #--------------------------------------------------------------------------
372 # Configuration verification: Check that each entry in the list of configs
373 # specified for each platforms exists.
375 foreach {key value
} [array get
::Platforms] {
376 foreach {v vars t
} $value {
377 if {[string range
$v end end
]=="*"} {
378 set v
[string range
$v 0 end-1
]
380 if {0==[info exists
::Configs($v)]} {
381 puts stderr
"No such configuration: \"$v\""
389 puts stderr
[subst $::USAGE]
393 proc is_prefix
{p str min
} {
394 set n
[string length
$p]
395 if {$n<$min} { return 0 }
396 if {[string range
$str 0 [expr $n-1]]!=$p} { return 0 }
400 proc main_configurations
{} {
401 foreach k
[lsort [array names
::Configs]] {
406 proc main_platforms
{} {
407 foreach k
[lsort [array names
::Platforms]] {
412 proc main_script
{args
} {
414 set nArg
[llength $args]
416 if {![is_prefix
[lindex $args 0] -msvc 2]} usage
418 } elseif
{$nArg<2 ||
$nArg>3} {
421 set config
[lindex $args end-1
]
422 set target
[lindex $args end
]
424 set opts
[list] ;# OPTS value
425 set cflags
[expr {$bMsvc ?
"-Zi" : "-g"}] ;# CFLAGS value
426 set makeOpts
[list] ;# Extra args for [make]
427 set configOpts
[list] ;# Extra args for [configure]
429 if {$::tcl_platform(platform
)=="windows" ||
$bMsvc} {
430 lappend opts
-DSQLITE_OS_WIN=1
432 lappend opts
-DSQLITE_OS_UNIX=1
435 # Figure out if this is a synthetic ndebug or debug configuration.
438 if {[string match
*-ndebug $config]} {
440 set config
[string range
$config 0 end-7
]
442 if {[string match
*-debug $config]} {
443 lappend opts
-DSQLITE_DEBUG
444 lappend opts
-DSQLITE_EXTRA_IFNULLROW
445 set config
[string range
$config 0 end-6
]
447 regexp {^
(.
*)-[0-9]+} $config -> config
449 # Ensure that the named configuration exists.
451 if {![info exists
::Configs($config)]} {
452 puts stderr
"No such config: $config"
456 # Loop through the parameters of the nominated configuration, updating
457 # $opts, $cflags, $makeOpts and $configOpts along the way. Rules are as
460 # 1. If the parameter begins with a "*", discard it.
462 # 2. If $bRemoveDebug is set and the parameter is -DSQLITE_DEBUG or
463 # -DSQLITE_DEBUG=1, discard it
465 # 3. If the parameter begins with "-D", add it to $opts.
467 # 4. If the parameter begins with "--" add it to $configOpts. Unless
468 # this command is preparing a script for MSVC - then add an
469 # equivalent to $makeOpts or $opts.
471 # 5. If the parameter begins with "-" add it to $cflags. If in MSVC
472 # mode and the parameter is an -O<integer> option, instead add
473 # an OPTIMIZATIONS=<integer> switch to $makeOpts.
475 # 6. If none of the above apply, add the parameter to $makeOpts
477 foreach param
$::Configs($config) {
478 if {[string range
$param 0 0]=="*"} continue
481 if {$param=="-DSQLITE_DEBUG" ||
$param=="-DSQLITE_DEBUG=1"
482 ||
$param=="-DSQLITE_MEMDEBUG" ||
$param=="-DSQLITE_MEMDEBUG=1"
483 ||
$param=="--enable-debug"
489 if {[string range
$param 0 1]=="-D"} {
494 if {[string range
$param 0 1]=="--"} {
497 --disable-amalgamation
{
498 lappend makeOpts USE_AMALGAMATION
=0
501 lappend makeOpts USE_CRT_DLL
=0 DYNAMIC_SHELL
=0
504 lappend opts
-DSQLITE_ENABLE_FTS5
507 lappend opts
-DSQLITE_ENABLE_JSON1
510 lappend makeOpts USE_CRT_DLL
=1 DYNAMIC_SHELL
=1
513 lappend opts
-DSQLITE_ENABLE_PREUPDATE_HOOK
514 lappend opts
-DSQLITE_ENABLE_SESSION
517 error "Cannot translate $param for MSVC"
521 lappend configOpts
$param
527 if {[string range
$param 0 0]=="-"} {
528 if {$bMsvc && [regexp -- {^
-O(\d
+)$} $param -> level
]} {
529 lappend makeOpts OPTIMIZATIONS
=$level
531 lappend cflags
$param
536 lappend makeOpts
$param
539 # Some configurations specify -DHAVE_USLEEP=0. For all others, add
542 if {[lsearch $opts "-DHAVE_USLEEP=0"]<0} {
543 lappend opts
-DHAVE_USLEEP=1
549 puts {if [ "$#" -ne 1 ] ; then
}
550 puts { echo
"Usage: $0 <sqlite-src-dir>" }
555 puts "TCL=\"[::tcl::pkgconfig get libdir,install]\""
557 puts "\$SRCDIR/configure --with-tcl=\$TCL $configOpts"
559 puts {OPTS
=" -DSQLITE_NO_SYNC=1"}
561 puts "OPTS=\"\$OPTS $o\""
564 puts "CFLAGS=\"$cflags\""
566 puts "make $target \"CFLAGS=\$CFLAGS\" \"OPTS=\$OPTS\" $makeOpts"
570 set makecmd
"nmake /f %SRCDIR%\\Makefile.msc TOP=%SRCDIR% $target "
571 append makecmd
"\"CFLAGS=$cflags\" \"OPTS=$opts\" $makeOpts"
578 proc main_tests
{args
} {
580 set nArg
[llength $args]
582 if {[is_prefix
[lindex $args 0] -nodebug 2]} {
584 } elseif
{[is_prefix
[lindex $args 0] -debug 2]} {
587 } elseif
{$nArg==0 ||
$nArg>2} {
590 set p
[lindex $args end
]
591 if {![info exists
::Platforms($p)]} {
592 puts stderr
"No such platform: $p"
598 foreach {config vars target
} $::Platforms($p) {
599 if {[string range
$config end end
]=="*"} {
600 set config
[string range
$config 0 end-1
]
601 } elseif
{$bNodebug==0} {
603 if {[lsearch $target fuzztest
]<0 && [lsearch $target test
]<0} {
606 if {$vars!=""} { set dtarget
"$vars $dtarget" }
608 if {[string first SQLITE_DEBUG
$::Configs($config)]>=0
609 ||
[string first
--enable-debug
$::Configs($config)]>=0
611 lappend lTest
"$config-ndebug \"$dtarget\""
613 lappend lTest
"$config-debug \"$dtarget\""
617 if {[llength $target]==1 && ([string match
"*TEST_FAILURE*" $vars] ||
(
618 [lsearch $target "valgrindtest"]<0
619 && [lsearch $target "alltest"]<0
620 && [lsearch $target "fulltestonly"]<0
621 && ![string match Sanitize
* $config]
623 if {$vars!=""} { set target
"$vars $target" }
624 lappend lTest
"$config \"$target\""
628 if {$t=="valgrindtest" ||
$t=="alltest" ||
$t=="fulltestonly"
629 ||
[string match Sanitize
* $config]
631 if {$vars!=""} { set t
"$vars $t" }
632 for {set ii
1} {$ii<=4} {incr ii
} {
633 lappend lTest
"$config-[incr idir] \"TCLTEST_PART=$ii/4 $t\""
636 if {$vars!=""} { set t
"$vars $t" }
637 lappend lTest
"$config-[incr idir] \"$t\""
649 if {[llength $argv]==0} { usage
}
650 set cmd
[lindex $argv 0]
651 set n
[expr [llength $argv]-1]
652 if {[string match
${cmd
}* configurations
] && $n==0} {
654 } elseif
{[string match
${cmd
}* script
]} {
655 main_script
{*}[lrange $argv 1 end
]
656 } elseif
{[string match
${cmd
}* platforms
] && $n==0} {
658 } elseif
{[string match
${cmd
}* tests
]} {
659 main_tests
{*}[lrange $argv 1 end
]