xref: /sqlite-3.40.0/test/permutations.test (revision c8e9f681)
1# 2008 June 21
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
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.
9#
10#***********************************************************************
11#
12
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15db close
16
17#-------------------------------------------------------------------------
18# test_suite NAME OPTIONS
19#
20# where available options are:
21#
22#       -description TITLE                  (default "")
23#       -initialize  SCRIPT                 (default "")
24#       -shutdown    SCRIPT                 (default "")
25#       -presql      SQL                    (default "")
26#       -files       LIST-OF-FILES          (default $::ALLTESTS)
27#       -prefix      NAME                   (default "$::NAME.")
28#       -dbconfig    SCRIPT                 (default "")
29#
30proc test_suite {name args} {
31
32  set default(-shutdown)    ""
33  set default(-initialize)  ""
34  set default(-presql)      ""
35  set default(-description) "no description supplied (fixme)"
36  set default(-files)       ""
37  set default(-prefix)      "${name}."
38  set default(-dbconfig)    ""
39
40  array set options [array get default]
41  if {[llength $args]%2} {
42    error "uneven number of options/switches passed to test_suite"
43  }
44  foreach {k v} $args {
45    set o [array names options ${k}*]
46    if {[llength $o]>1}  { error "ambiguous option: $k" }
47    if {[llength $o]==0} { error "unknown option: $k" }
48    set options([lindex $o 0]) $v
49  }
50
51  set     ::testspec($name) [array get options]
52  lappend ::testsuitelist $name
53}
54
55#-------------------------------------------------------------------------
56# test_set ARGS...
57#
58proc test_set {args} {
59  set isExclude 0
60  foreach a $args {
61    if {[string match -* $a]} {
62      switch -- $a {
63        -include { set isExclude 0 }
64        -exclude { set isExclude 1 }
65        default {
66          error "Unknown switch: $a"
67        }
68      }
69    } elseif {$isExclude == 0} {
70      foreach f $a { set t($f) 1 }
71    } else {
72      foreach f $a { array unset t $f }
73      foreach f $a { array unset t */$f }
74    }
75  }
76
77  return [array names t]
78}
79
80#-------------------------------------------------------------------------
81# Set up the following global list variables containing the names of
82# various test scripts:
83#
84#   $alltests
85#   $allquicktests
86#
87set alltests [list]
88foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] }
89foreach f [glob -nocomplain            \
90    $testdir/../ext/rtree/*.test       \
91    $testdir/../ext/fts5/test/*.test   \
92    $testdir/../ext/expert/*.test      \
93    $testdir/../ext/lsm1/test/*.test   \
94] {
95  lappend alltests $f
96}
97foreach f [glob -nocomplain $testdir/../ext/session/*.test] {
98  lappend alltests $f
99}
100
101if {$::tcl_platform(platform)!="unix"} {
102  set alltests [test_set $alltests -exclude crash.test crash2.test]
103}
104set alltests [test_set $alltests -exclude {
105  all.test        async.test         quick.test  veryquick.test
106  memleak.test    permutations.test  soak.test   fts3.test
107  mallocAll.test  rtree.test         full.test   extraquick.test
108  session.test    rbu.test
109}]
110
111set allquicktests [test_set $alltests -exclude {
112  async2.test async3.test backup_ioerr.test corrupt.test
113  corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test
114  crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test
115  fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test
116  misc7.test mutex2.test notify2.test onefile.test pagerfault2.test
117  savepoint4.test savepoint6.test select9.test
118  speed1.test speed1p.test speed2.test speed3.test speed4.test
119  speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test
120  thread003.test thread004.test thread005.test trans2.test vacuum3.test
121  incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test
122  vtab_err.test walslow.test walcrash.test walcrash3.test
123  walthread.test rtree3.test indexfault.test securedel2.test
124  sort3.test sort4.test fts4growth.test fts4growth2.test
125  bigsort.test walprotocol.test mmap4.test fuzzer2.test
126  walcrash2.test e_fkey.test backup.test
127
128  fts4merge.test fts4merge2.test fts4merge4.test fts4check.test
129  fts4merge5.test
130  fts3cov.test fts3snippet.test fts3corrupt2.test fts3an.test
131  fts3defer.test fts4langid.test fts3sort.test fts5unicode.test
132
133  rtree4.test
134  sessionbig.test
135
136  writecrash.test view3.test
137  fts5dlidx.test fts5ac.test fts4merge3.test fts5prefix.test
138  sessionB.test
139}]
140if {[info exists ::env(QUICKTEST_INCLUDE)]} {
141  set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]
142}
143if {[info exists ::env(QUICKTEST_OMIT)]} {
144  # If environment variable QUICKTEST_OMIT is set, it is a comma-separated
145  # list of regular expressions to match against test file names in
146  # the "allquicktests" set. Any matches are excluded. Only the filename
147  # is matched, not any directory component of the path.
148  set all [list]
149  foreach a $allquicktests {
150    set bIn 1
151    foreach x [split $::env(QUICKTEST_OMIT) ,] {
152      if {[regexp $x [file tail $a]]} {
153        set bIn 0
154        break
155      }
156    }
157    if {$bIn} {
158      lappend all $a
159    }
160  }
161  set allquicktests $all
162}
163
164# If the TEST_FAILURE environment variable is set, it means that we what to
165# deliberately provoke test failures in order to test the test infrastructure.
166# Only the main.test module is needed for this.
167#
168if {[info exists ::env(TEST_FAILURE)]} {
169  set allquicktests main.test
170}
171
172#############################################################################
173# Start of tests
174#
175
176#-------------------------------------------------------------------------
177# Define the generic test suites:
178#
179#   veryquick
180#   quick
181#   full
182#
183lappend ::testsuitelist xxx
184
185test_suite "veryquick" -prefix "" -description {
186  "Very" quick test suite. Runs in minutes on a workstation.
187  This test suite is the same as the "quick" tests, except that some files
188  that test malloc and IO errors are omitted.
189} -files [
190  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
191      *fts5corrupt* *fts5big* *fts5aj*
192]
193
194test_suite "shell" -prefix "" -description {
195  Run tests of the command-line shell
196} -files [
197  test_set [glob $testdir/shell*.test]
198]
199
200test_suite "extraquick" -prefix "" -description {
201  "Extra" quick test suite. Runs in a few minutes on a workstation.
202  This test suite is the same as the "veryquick" tests, except that
203  slower tests are omitted.
204} -files [
205  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
206     wal3.test fts4merge* sort2.test mmap1.test walcrash* \
207     percentile.test where8m.test walcksum.test savepoint3.test \
208     fuzzer1.test fuzzer3.test fts3expr3.test
209]
210
211test_suite "mmap" -prefix "mm-" -description {
212  Similar to veryquick. Except with memory mapping enabled.
213} -presql {
214  pragma mmap_size = 268435456;
215} -files [
216  test_set $allquicktests -exclude *malloc* *ioerr* *fault* -include malloc.test
217]
218
219test_suite "valgrind" -prefix "" -description {
220  Run the "veryquick" test suite with a couple of multi-process tests (that
221  fail under valgrind) omitted.
222} -files [
223  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err* wal.test \
224              shell2.test shell6.test shell7.test \
225              crash8.test atof1.test selectG.test \
226              tkt-fc62af4523.test numindex1.test corruptK.test
227] -initialize {
228  set ::G(valgrind) 1
229} -shutdown {
230  unset -nocomplain ::G(valgrind)
231}
232
233test_suite "valgrind-nolookaside" -prefix "" -description {
234  Run the "veryquick" test suite with a couple of multi-process tests (that
235  fail under valgrind) omitted.
236} -files [
237  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err* \
238      wal.test atof1.test
239] -initialize {
240  set ::G(valgrind) 1
241  catch {db close}
242  sqlite3_shutdown
243  sqlite3_config_lookaside 0 0
244  sqlite3_initialize
245  autoinstall_test_functions
246} -shutdown {
247  catch {db close}
248  sqlite3_shutdown
249  sqlite3_config_lookaside 100 500
250  sqlite3_initialize
251  autoinstall_test_functions
252  unset -nocomplain ::G(valgrind)
253}
254
255
256test_suite "quick" -prefix "" -description {
257  Quick test suite. Runs in around 10 minutes on a workstation.
258} -files [
259  test_set $allquicktests
260]
261
262test_suite "full" -prefix "" -description {
263  Full test suite. Takes a long time.
264} -files [
265  test_set $alltests
266] -initialize {
267  unset -nocomplain ::G(isquick)
268}
269
270test_suite "threads" -prefix "" -description {
271  All multi-threaded tests.
272} -files {
273  notify2.test   thread001.test thread002.test thread003.test
274  thread004.test thread005.test walthread.test
275}
276
277test_suite "fts3" -prefix "" -description {
278  All FTS3 tests except fts3rnd.test.
279} -files {
280  fts3aa.test fts3ab.test fts3ac.test fts3ad.test
281  fts3ae.test fts3af.test fts3ag.test fts3ah.test
282  fts3ai.test fts3aj.test fts3ak.test fts3al.test
283  fts3am.test fts3an.test fts3ao.test fts3atoken.test
284  fts3auto.test fts3aux1.test fts3aux2.test fts3b.test
285  fts3comp1.test fts3conf.test fts3corrupt2.test fts3corrupt.test
286  fts3corrupt4.test
287  fts3cov.test fts3c.test fts3defer2.test fts3defer3.test
288  fts3defer.test fts3drop.test fts3d.test fts3e.test
289  fts3expr2.test fts3expr3.test fts3expr4.test fts3expr5.test
290  fts3expr.test fts3fault2.test fts3fault.test fts3first.test
291  fts3join.test fts3malloc.test fts3matchinfo.test fts3near.test
292  fts3offsets.test fts3prefix2.test fts3prefix.test fts3query.test
293  fts3shared.test fts3snippet.test fts3sort.test fts3tok1.test
294  fts3tok_err.test fts3varint.test fts4aa.test fts4check.test
295  fts4content.test fts4docid.test fts4growth2.test fts4growth.test
296  fts4incr.test fts4langid.test fts4lastrowid.test fts4merge2.test
297  fts4merge4.test fts4merge.test fts4noti.test fts4onepass.test
298  fts4opt.test fts4unicode.test
299  fts3corrupt3.test
300  fts3misc.test
301}
302
303test_suite "fts5" -prefix "" -description {
304  All FTS5 tests.
305} -files [glob -nocomplain $::testdir/../ext/fts5/test/*.test]
306
307test_suite "fts5-light" -prefix "" -description {
308  All FTS5 tests.
309} -files [
310  test_set \
311      [glob -nocomplain $::testdir/../ext/fts5/test/*.test] \
312      -exclude *corrupt* *fault* *big* *fts5aj*
313]
314
315test_suite "window" -prefix "" -description {
316  All window function related tests .
317} -files [
318  test_set [glob -nocomplain $::testdir/window*.test]
319]
320
321test_suite "lsm1" -prefix "" -description {
322  All LSM1 tests.
323} -files [glob -nocomplain $::testdir/../ext/lsm1/test/*.test]
324
325test_suite "nofaultsim" -prefix "" -description {
326  "Very" quick test suite. Runs in less than 5 minutes on a workstation.
327  This test suite is the same as the "quick" tests, except that some files
328  that test malloc and IO errors are omitted.
329} -files [
330  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err*
331] -initialize {
332  catch {db close}
333  sqlite3_shutdown
334  install_malloc_faultsim 0
335  sqlite3_initialize
336  autoinstall_test_functions
337} -shutdown {
338  unset -nocomplain ::G(valgrind)
339}
340
341test_suite "queryplanner" -prefix "" -description {
342  Tests of the query planner and query optimizer
343} -files {
344  alter2.test alter3.test alter4.test alter.test analyze3.test
345  analyze4.test analyze5.test analyze6.test analyze7.test analyze8.test
346  analyze.test attach2.test attach3.test attach4.test
347  attach.test autoinc.test autoindex1.test between.test cast.test
348  check.test closure01.test coalesce.test collate1.test collate2.test
349  collate3.test collate4.test collate5.test collate6.test collate7.test
350  collate8.test collate9.test collateA.test colmeta.test colname.test
351  conflict.test count.test coveridxscan.test createtab.test cse.test
352  date.test dbstatus2.test dbstatus.test default.test delete2.test
353  delete3.test delete.test descidx1.test descidx2.test descidx3.test
354  distinctagg.test distinct.test e_createtable.test e_delete.test
355  e_droptrigger.test e_dropview.test e_expr.test e_insert.test
356  eqp.test e_reindex.test e_resolve.test e_select2.test e_select.test
357  e_update.test exists.test expr.test fkey1.test fkey2.test fkey3.test
358  fkey4.test fkey5.test func2.test func3.test func.test
359  in3.test in4.test in5.test index2.test index3.test
360  index4.test index5.test indexedby.test index.test
361  insert2.test insert3.test insert4.test insert5.test insert.test
362  instr.test in.test intpkey.test join2.test join3.test join4.test
363  join5.test join6.test join.test like2.test like.test limit.test
364  minmax2.test minmax3.test minmax4.test minmax.test misc1.test misc2.test
365  misc3.test misc4.test misc5.test misc6.test misc7.test orderby1.test
366  orderby2.test orderby3.test orderby4.test randexpr1.test regexp1.test
367  reindex.test rowhash.test rowid.test schema2.test schema3.test
368  schema4.test schema5.test schema.test
369  select1.test select2.test select3.test select4.test select5.test
370  select6.test select7.test select8.test select9.test selectA.test
371  selectB.test selectC.test selectD.test selectE.test sidedelete.test
372  sort.test spellfix.test subquery2.test subquery.test subselect.test
373  substr.test tkt-02a8e81d44.test tkt1435.test tkt1443.test tkt1444.test
374  tkt1449.test tkt1473.test tkt1501.test tkt1512.test tkt1514.test
375  tkt1536.test tkt1537.test tkt1567.test tkt1644.test tkt1667.test
376  tkt1873.test tkt2141.test tkt2192.test tkt2213.test tkt2251.test
377  tkt2285.test tkt2332.test tkt2339.test tkt2391.test tkt2409.test
378  tkt2450.test tkt2565.test tkt2640.test tkt2643.test tkt2686.test
379  tkt-26ff0c2d1e.test tkt2767.test tkt2817.test tkt2820.test tkt2822.test
380  tkt2832.test tkt2854.test tkt2920.test tkt2927.test tkt2942.test
381  tkt-2a5629202f.test tkt-2d1a5c67d.test tkt-2ea2425d34.test tkt3080.test
382  tkt3093.test tkt3121.test tkt-31338dca7e.test tkt-313723c356.test
383  tkt3201.test tkt3292.test tkt3298.test tkt3334.test tkt3346.test
384  tkt3357.test tkt3419.test tkt3424.test tkt3442.test tkt3457.test
385  tkt3461.test tkt3493.test tkt3508.test tkt3522.test tkt3527.test
386  tkt3541.test tkt3554.test tkt3581.test tkt35xx.test tkt3630.test
387  tkt3718.test tkt3731.test tkt3757.test tkt3761.test tkt3762.test
388  tkt3773.test tkt3791.test tkt3793.test tkt3810.test tkt3824.test
389  tkt3832.test tkt3838.test tkt3841.test tkt-385a5b56b9.test tkt3871.test
390  tkt3879.test tkt-38cb5df375.test tkt3911.test tkt3918.test tkt3922.test
391  tkt3929.test tkt3935.test tkt3992.test tkt3997.test tkt-3998683a16.test
392  tkt-3a77c9714e.test tkt-3fe897352e.test tkt4018.test tkt-4a03edc4c8.test
393  tkt-4dd95f6943.test tkt-54844eea3f.test tkt-5d863f876e.test
394  tkt-5e10420e8d.test tkt-5ee23731f.test tkt-6bfb98dfc0.test
395  tkt-752e1646fc.test tkt-78e04e52ea.test tkt-7a31705a7e6.test
396  tkt-7bbfb7d442.test tkt-80ba201079.test tkt-80e031a00f.test
397  tkt-8454a207b9.test tkt-91e2e8ba6f.test tkt-94c04eaadb.test
398  tkt-9d68c883.test tkt-a7b7803e.test tkt-b1d3a2e531.test
399  tkt-b351d95f9.test tkt-b72787b1.test tkt-bd484a090c.test
400  tkt-bdc6bbbb38.test tkt-c48d99d690.test tkt-cbd054fa6b.test
401  tkt-d11f09d36e.test tkt-d635236375.test tkt-d82e3f3721.test
402  tkt-f3e5abed55.test tkt-f777251dc7a.test tkt-f7b4edec.test
403  tkt-f973c7ac31.test tkt-fa7bf5ec.test tkt-fc62af4523.test
404  tkt-fc7bd6358f.test trigger1.test trigger2.test trigger3.test
405  trigger4.test trigger5.test trigger6.test trigger7.test trigger8.test
406  trigger9.test triggerA.test triggerB.test triggerC.test triggerD.test
407  types2.test types3.test types.test unique.test unordered.test
408  update.test view.test vtab1.test vtab2.test vtab3.test vtab4.test
409  vtab5.test vtab6.test vtab7.test vtab8.test vtab9.test vtab_alter.test
410  vtabA.test vtabB.test vtabC.test vtabD.test vtabE.test
411  vtabF.test where2.test where3.test where4.test where5.test where6.test
412  where7.test where8m.test where8.test where9.test whereA.test whereB.test
413  whereC.test whereD.test whereE.test whereF.test wherelimit.test
414  where.test
415}
416
417test_suite "vfslog" -prefix "" -description {
418  "Vfslog" quick test suite. Like "veryquick" except does not omits
419  a few tests that do not work with a version 1 VFS. And the quota* tests,
420  which do not work with a VFS that uses the pVfs argument passed to
421  sqlite3_vfs methods.
422} -files [
423  test_set $allquicktests -exclude *malloc* *ioerr* *fault* oserror.test \
424  pager1.test syscall.test sysfault.test tkt3457.test quota* superlock* \
425  wal* mmap*
426]
427
428test_suite "atomic-batch-write" -prefix "" -description {
429  Like veryquick.test, but must be run on a file-system that supports
430  atomic-batch-writes. Tests that depend on the journal file being present
431  are omitted.
432} -files [
433  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
434      *fts5corrupt* *fts5big* *fts5aj*  \
435      crash8.test delete_db.test        \
436      exclusive.test journal3.test      \
437      journal1.test                     \
438      jrnlmode.test jrnlmode2.test      \
439      lock4.test pager1.test            \
440      pager3.test sharedA.test          \
441      symlink.test stmt.test            \
442      sync.test sync2.test              \
443      tempdb.test tkt3457.test          \
444      vacuum5.test wal2.test            \
445      walmode.test zerodamage.test
446] -initialize {
447  if {[atomic_batch_write test.db]==0} {
448    error "File system does NOT support atomic-batch-write"
449  }
450}
451
452lappend ::testsuitelist xxx
453#-------------------------------------------------------------------------
454# Define the coverage related test suites:
455#
456#   coverage-wal
457#
458test_suite "coverage-wal" -description {
459  Coverage tests for file wal.c.
460} -files {
461  wal.test wal2.test wal3.test wal4.test wal5.test
462  wal64k.test wal6.test wal7.test wal8.test wal9.test
463  walbak.test walbig.test walblock.test walcksum.test walcrash2.test
464  walcrash3.test walcrash4.test walcrash.test walfault.test walhook.test
465  walmode.test walnoshm.test waloverwrite.test walpersist.test
466  walprotocol2.test walprotocol.test walro2.test walrofault.test
467  walro.test walshared.test walslow.test walvfs.test
468  walfault2.test
469  nockpt.test
470
471  snapshot2.test snapshot3.test snapshot4.test
472  snapshot_fault.test snapshot.test snapshot_up.test
473}
474
475test_suite "coverage-pager" -description {
476  Coverage tests for file pager.c.
477} -files {
478  pager1.test    pager2.test  pagerfault.test  pagerfault2.test
479  walfault.test  walbak.test  journal2.test    tkt-9d68c883.test
480}
481
482test_suite "coverage-analyze" -description {
483  Coverage tests for file analyze.c.
484} -files {
485  analyze3.test analyze4.test analyze5.test analyze6.test
486  analyze7.test analyze8.test analyze9.test
487  analyze.test mallocA.test
488}
489
490test_suite "coverage-sorter" -description {
491  Coverage tests for file vdbesort.c.
492} -files {
493  sort.test sortfault.test
494}
495
496
497lappend ::testsuitelist xxx
498#-------------------------------------------------------------------------
499# Define the permutation test suites:
500#
501
502# Run some tests using pre-allocated page blocks.
503#
504# mmap1.test is excluded because a good number of its tests depend on
505# the page-cache being larger than the database. But this permutation
506# causes the effective limit on the page-cache to be just 24 pages.
507#
508test_suite "memsubsys1" -description {
509  Tests using pre-allocated page blocks
510} -files [
511  test_set $::allquicktests -exclude ioerr5.test malloc5.test mmap1.test
512] -initialize {
513  test_set_config_pagecache 4096 24
514  catch {db close}
515  sqlite3_shutdown
516  sqlite3_initialize
517  autoinstall_test_functions
518} -shutdown {
519  test_restore_config_pagecache
520  catch {db close}
521  sqlite3_shutdown
522  sqlite3_initialize
523  autoinstall_test_functions
524}
525
526# Run some tests using pre-allocated page blocks. This time
527# the allocations are too small to use in most cases.
528#
529# Both ioerr5.test and malloc5.test are excluded because they test the
530# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
531# This functionality is disabled if a pre-allocated page block is provided.
532#
533test_suite "memsubsys2" -description {
534  Tests using small pre-allocated page blocks
535} -files [
536  test_set $::allquicktests -exclude ioerr5.test malloc5.test
537] -initialize {
538  test_set_config_pagecache 512 5
539  catch {db close}
540  sqlite3_shutdown
541  sqlite3_initialize
542  autoinstall_test_functions
543} -shutdown {
544  test_restore_config_pagecache
545  catch {db close}
546  sqlite3_shutdown
547  sqlite3_initialize
548  autoinstall_test_functions
549}
550
551# Run all tests with the lookaside allocator disabled.
552#
553test_suite "nolookaside" -description {
554  OOM tests with lookaside disabled
555} -initialize {
556  catch {db close}
557  sqlite3_shutdown
558  sqlite3_config_lookaside 0 0
559  sqlite3_initialize
560  autoinstall_test_functions
561} -shutdown {
562  catch {db close}
563  sqlite3_shutdown
564  sqlite3_config_lookaside 100 500
565  sqlite3_initialize
566  autoinstall_test_functions
567} -files $::allquicktests
568
569# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
570#
571test_suite "singlethread" -description {
572  Tests run in SQLITE_CONFIG_SINGLETHREAD mode
573} -initialize {
574  catch {db close}
575  sqlite3_shutdown
576  catch {sqlite3_config singlethread}
577  sqlite3_initialize
578  autoinstall_test_functions
579} -files {
580  delete.test   delete2.test  insert.test  rollback.test  select1.test
581  select2.test  trans.test    update.test  vacuum.test    types.test
582  types2.test   types3.test
583} -shutdown {
584  catch {db close}
585  sqlite3_shutdown
586  catch {sqlite3_config serialized}
587  sqlite3_initialize
588  autoinstall_test_functions
589}
590
591test_suite "nomutex" -description {
592  Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
593} -initialize {
594  set ::G(perm:sqlite3_args) [list -fullmutex 0 -nomutex 1]
595} -files {
596  delete.test   delete2.test  insert.test  rollback.test  select1.test
597  select2.test  trans.test    update.test  vacuum.test    types.test
598  types2.test   types3.test
599}
600
601# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
602#
603test_suite "multithread" -description {
604  Tests run in SQLITE_CONFIG_MULTITHREAD mode
605} -initialize {
606  catch {db close}
607  sqlite3_shutdown
608  catch {sqlite3_config multithread}
609  sqlite3_initialize
610  autoinstall_test_functions
611} -files {
612  delete.test   delete2.test  insert.test  rollback.test  select1.test
613  select2.test  trans.test    update.test  vacuum.test    types.test
614  types2.test   types3.test   sort4.test
615} -shutdown {
616  catch {db close}
617  sqlite3_shutdown
618  catch {sqlite3_config serialized}
619  sqlite3_initialize
620  autoinstall_test_functions
621}
622
623# Run some tests in SQLITE_OPEN_FULLMUTEX mode.
624#
625test_suite "fullmutex" -description {
626  Tests run in SQLITE_OPEN_FULLMUTEX mode
627} -initialize {
628  set ::G(perm:sqlite3_args) [list -nomutex 0 -fullmutex 1]
629} -files {
630  delete.test   delete2.test  insert.test  rollback.test  select1.test
631  select2.test  trans.test    update.test  vacuum.test    types.test
632  types2.test   types3.test
633}
634
635# Run some tests using the "onefile" demo.
636#
637test_suite "onefile" -description {
638  Run some tests using the "test_onefile.c" demo
639} -initialize {
640  set ::G(perm:sqlite3_args) [list -vfs fs]
641} -files {
642  conflict.test  insert.test   insert2.test  insert3.test
643  rollback.test  select1.test  select2.test  select3.test
644}
645
646# Run some tests using UTF-16 databases.
647#
648test_suite "utf16" -description {
649  Run tests using UTF-16 databases
650} -presql {
651  pragma encoding = 'UTF-16'
652} -files {
653    alter.test alter3.test
654    analyze.test analyze3.test analyze4.test analyze5.test analyze6.test
655    analyze7.test analyze8.test analyze9.test
656    auth.test bind.test blob.test capi2.test capi3.test collate1.test
657    collate2.test collate3.test collate4.test collate5.test collate6.test
658    conflict.test date.test delete.test expr.test fkey1.test func.test
659    hook.test index.test insert2.test insert.test interrupt.test in.test
660    intpkey.test ioerr.test join2.test join.test lastinsert.test
661    laststmtchanges.test limit.test lock2.test lock.test main.test
662    memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
663    null.test progress.test quote.test rowid.test select1.test select2.test
664    select3.test select4.test select5.test select6.test sort.test
665    subselect.test tableapi.test table.test temptable.test
666    trace.test trigger1.test trigger2.test trigger3.test
667    trigger4.test types2.test types.test unique.test update.test
668    vacuum.test view.test where.test
669    bestindex1.test
670}
671
672# Run some tests in exclusive locking mode.
673#
674test_suite "exclusive" -description {
675  Run tests in exclusive locking mode.
676} -presql {
677  pragma locking_mode = 'exclusive'
678} -files {
679  rollback.test select1.test select2.test
680  malloc.test ioerr.test
681}
682
683# Run some tests in exclusive locking mode with truncated journals.
684#
685test_suite "exclusive-truncate" -description {
686  Run tests in exclusive locking mode and truncate journal mode.
687} -presql {
688  pragma locking_mode = 'exclusive';
689  pragma journal_mode = TRUNCATE;
690} -files {
691  delete.test delete2.test insert.test rollback.test select1.test
692  select2.test update.test malloc.test ioerr.test
693}
694
695# Run some tests in persistent journal mode.
696#
697test_suite "persistent_journal" -description {
698  Run tests in persistent-journal mode.
699} -presql {
700  pragma journal_mode = persist
701} -files {
702  delete.test delete2.test insert.test rollback.test select1.test
703  select2.test trans.test update.test vacuum.test
704}
705
706# Run some tests in truncating journal mode.
707#
708test_suite "truncate_journal" -description {
709  Run tests in persistent-journal mode.
710} -presql {
711  pragma journal_mode = truncate
712} -files {
713  delete.test delete2.test insert.test rollback.test select1.test
714  select2.test trans.test update.test vacuum.test
715  malloc.test ioerr.test
716}
717
718# Run some error tests in persistent journal mode.
719#
720test_suite "persistent_journal_error" -description {
721  Run malloc.test and ioerr.test in persistent-journal mode.
722} -presql {
723  pragma journal_mode = persist
724} -files {
725  malloc.test ioerr.test
726}
727
728# Run some tests in no journal mode.
729#
730test_suite "no_journal" -description {
731  Run tests in no-journal mode.
732} -presql {
733  pragma journal_mode = persist
734} -files {
735  delete.test delete2.test insert.test rollback.test select1.test
736  select2.test trans.test update.test vacuum.test
737}
738
739# Run some error tests in no journal mode.
740#
741test_suite "no_journal_error" -description {
742  Run malloc.test and ioerr.test in no-journal mode.
743} -presql {
744  pragma journal_mode = persist
745} -files {
746  malloc.test ioerr.test
747}
748
749# Run some crash-tests in autovacuum mode.
750#
751test_suite "autovacuum_crash" -description {
752  Run crash.test in autovacuum mode.
753} -presql {
754  pragma auto_vacuum = 1
755} -files crash.test
756
757# Run some ioerr-tests in autovacuum mode.
758#
759test_suite "autovacuum_ioerr" -description {
760  Run ioerr.test in autovacuum mode.
761} -presql {
762  pragma auto_vacuum = 1
763} -files ioerr.test
764
765# Run tests with an in-memory journal.
766#
767test_suite "inmemory_journal" -description {
768  Run tests with an in-memory journal file.
769} -presql {
770  pragma journal_mode = 'memory'
771} -files [test_set $::allquicktests -exclude {
772  # Exclude all tests that simulate IO errors.
773  autovacuum_ioerr2.test cffault.test incrvacuum_ioerr.test ioerr.test
774  ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
775  vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
776  e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test
777  fts3snippet.test mmapfault.test sessionfault.test sessionfault2.test
778
779  # Exclude test scripts that use tcl IO to access journal files or count
780  # the number of fsync() calls.
781  pager.test exclusive.test jrnlmode.test sync.test misc1.test
782  journal1.test conflict.test crash8.test tkt3457.test io.test
783  journal3.test 8_3_names.test shmlock.test
784
785  pager1.test async4.test corrupt.test filefmt.test pager2.test
786  corrupt5.test corruptA.test pageropt.test
787
788  # Exclude stmt.test, which expects sub-journals to use temporary files.
789  stmt.test symlink.test
790
791  zerodamage.test
792
793  # WAL mode is different.
794  wal* tkt-2d1a5c67d.test backcompat.test e_wal* rowallock.test
795
796  # This test does not work as the "PRAGMA journal_mode = memory"
797  # statement switches the database out of wal mode at inopportune
798  # times.
799  snapshot_fault.test
800
801  # This test assumes a journal file is created on disk.
802  delete_db.test
803
804  # This test depends on a successful recovery from the pager error
805  # state. Which is not possible with an in-memory journal
806  fts5fault1.test
807}]
808
809ifcapable mem3 {
810  test_suite "memsys3" -description {
811    Run tests using the allocator in mem3.c.
812  } -files [test_set $::allquicktests -exclude {
813    autovacuum.test           delete3.test              manydb.test
814    bigrow.test               incrblob2.test            memdb.test
815    bitvec.test               index2.test               memsubsys1.test
816    capi3c.test               ioerr.test                memsubsys2.test
817    capi3.test                join3.test                pagesize.test
818    collate5.test             limit.test                backup_ioerr.test
819    backup_malloc.test
820  }] -initialize {
821    catch {db close}
822    sqlite3_reset_auto_extension
823    sqlite3_shutdown
824    sqlite3_config_heap 25000000 0
825    sqlite3_config_lookaside 0 0
826    ifcapable mem5 {
827      # If both memsys3 and memsys5 are enabled in the build, the call to
828      # [sqlite3_config_heap] will initialize the system to use memsys5.
829      # The following overrides this preference and installs the memsys3
830      # allocator.
831      sqlite3_install_memsys3
832    }
833    install_malloc_faultsim 1
834    sqlite3_initialize
835    autoinstall_test_functions
836  } -shutdown {
837    catch {db close}
838    sqlite3_shutdown
839    sqlite3_config_heap 0 0
840    sqlite3_config_lookaside 100 500
841    install_malloc_faultsim 1
842    sqlite3_initialize
843    autoinstall_test_functions
844  }
845}
846
847ifcapable mem5 {
848  test_suite "memsys5" -description {
849    Run tests using the allocator in mem5.c.
850  } -files [test_set $::allquicktests -exclude {
851    autovacuum.test           delete3.test              manydb.test
852    bigrow.test               incrblob2.test            memdb.test
853    bitvec.test               index2.test               memsubsys1.test
854    capi3c.test               ioerr.test                memsubsys2.test
855    capi3.test                join3.test                pagesize.test
856    collate5.test             limit.test                zeroblob.test
857  }] -initialize {
858    catch {db close}
859    sqlite3_shutdown
860    sqlite3_config_heap 25000000 64
861    sqlite3_config_lookaside 0 0
862    install_malloc_faultsim 1
863    sqlite3_initialize
864    autoinstall_test_functions
865  } -shutdown {
866    catch {db close}
867    sqlite3_shutdown
868    sqlite3_config_heap 0 0
869    sqlite3_config_lookaside 100 500
870    install_malloc_faultsim 1
871    sqlite3_initialize
872    autoinstall_test_functions
873  }
874
875  test_suite "memsys5-2" -description {
876    Run tests using the allocator in mem5.c in a different configuration.
877  } -files {
878    select1.test
879  } -initialize {
880    catch {db close}
881    sqlite3_shutdown
882    sqlite3_config_memstatus 0
883    sqlite3_config_heap 40000000 16
884    sqlite3_config_lookaside 0 0
885    install_malloc_faultsim 1
886    sqlite3_initialize
887    autoinstall_test_functions
888  } -shutdown {
889    catch {db close}
890    sqlite3_shutdown
891    sqlite3_config_heap 0 0
892    sqlite3_config_lookaside 100 500
893    install_malloc_faultsim 1
894    sqlite3_initialize
895    autoinstall_test_functions
896  }
897}
898
899ifcapable threadsafe {
900  test_suite "no_mutex_try" -description {
901     The sqlite3_mutex_try() interface always fails
902  } -files [
903    test_set $::allquicktests -exclude mutex1.test mutex2.test
904  ] -initialize {
905    catch {db close}
906    sqlite3_shutdown
907    install_mutex_counters 1
908    set ::disable_mutex_try 1
909    sqlite3_initialize
910    autoinstall_test_functions
911  } -shutdown {
912    catch {db close}
913    sqlite3_shutdown
914    install_mutex_counters 0
915    sqlite3_initialize
916    autoinstall_test_functions
917  }
918}
919
920# run_tests "crash_safe_append" -description {
921#   Run crash.test with persistent journals on a SAFE_APPEND file-system.
922# } -initialize {
923#   rename crashsql sa_crashsql
924#   proc crashsql {args} {
925#     set options [lrange $args 0 [expr {[llength $args]-2}]]
926#     lappend options -char safe_append
927#     set sql [lindex $args end]
928#     lappend options "
929#       PRAGMA journal_mode=persistent;
930#       $sql
931#     "
932#     set fd [open test.db-journal w]
933#     puts $fd [string repeat 1234567890 100000]
934#     close $fd
935#     eval sa_crashsql $options
936#   }
937# } -shutdown {
938#   rename crashsql {}
939#   rename sa_crashsql crashsql
940# } -files crash.test
941
942test_suite "safe_append" -description {
943  Run some tests on a SAFE_APPEND file-system.
944} -initialize {
945  set ::G(perm:sqlite3_args) [list -vfs devsym]
946  sqlite3_simulate_device -char safe_append
947} -files [
948  test_set $::allquicktests shared_err.test -exclude async3.test
949]
950
951# The set of tests to run on the alternative-pcache
952set perm-alt-pcache-testset {
953  async.test
954  attach.test
955  delete.test delete2.test
956  index.test
957  insert.test insert2.test
958  join.test join2.test
959  rollback.test
960  select1.test select2.test
961  trans.test
962  update.test
963}
964
965foreach discard_rate {0 10 50 90 100} {
966  test_suite "pcache${discard_rate}" -description "
967    Alternative pcache implementation with ${discard_rate}% random discard
968  " -initialize "
969    catch {db close}
970    sqlite3_shutdown
971    sqlite3_config_alt_pcache 1 $discard_rate 1
972    sqlite3_initialize
973    autoinstall_test_functions
974  " -shutdown {
975    catch {db close}
976    sqlite3_shutdown
977    sqlite3_config_alt_pcache 0 0 0
978    sqlite3_config_lookaside 100 500
979    install_malloc_faultsim 1
980    sqlite3_initialize
981    autoinstall_test_functions
982  } -files ${perm-alt-pcache-testset}
983}
984
985test_suite "journaltest" -description {
986  Check that pages are synced before being written (test_journal.c).
987} -initialize {
988  catch {db close}
989  register_jt_vfs -default ""
990} -shutdown {
991  unregister_jt_vfs
992} -files [test_set $::allquicktests -exclude {
993  wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test
994  async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test
995  pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock*
996  pager2.test *fault* rowal* snapshot* superlock* symlink.test
997  delete_db.test shmlock.test chunksize.test
998  busy2.test avfs.test external_reader.test
999}]
1000
1001if {[info commands register_demovfs] != ""} {
1002  test_suite "demovfs" -description {
1003    Check that the demovfs (code in test_demovfs.c) more or less works.
1004  } -initialize {
1005    register_demovfs
1006  } -shutdown {
1007    unregister_demovfs
1008  } -files {
1009    insert.test   insert2.test  insert3.test rollback.test
1010    select1.test  select2.test  select3.test
1011  }
1012}
1013
1014test_suite "wal" -description {
1015  Run tests with journal_mode=WAL
1016} -initialize {
1017  set ::G(savepoint6_iterations) 100
1018} -shutdown {
1019  unset -nocomplain ::G(savepoint6_iterations)
1020} -files {
1021  savepoint.test     savepoint2.test     savepoint6.test
1022  trans.test         avtrans.test
1023
1024  fts3aa.test  fts3ab.test  fts3ac.test  fts3ad.test
1025  fts3ae.test  fts3af.test  fts3ag.test  fts3ah.test
1026  fts3ai.test  fts3aj.test  fts3ak.test  fts3al.test
1027  fts3am.test  fts3an.test  fts3ao.test  fts3b.test
1028  fts3c.test   fts3d.test   fts3e.test   fts3query.test
1029}
1030
1031test_suite "rtree" -description {
1032  All R-tree related tests. Provides coverage of source file rtree.c.
1033} -files [glob -nocomplain $::testdir/../ext/rtree/*.test]
1034
1035test_suite "session" -description {
1036  All session module related tests.
1037} -files [glob -nocomplain $::testdir/../ext/session/*.test]
1038
1039test_suite "session_eec" -description {
1040  All session module related tests with sqlite3_extended_result_codes() set.
1041} -files [
1042  glob -nocomplain $::testdir/../ext/session/*.test
1043] -dbconfig {
1044  sqlite3_extended_result_codes $::dbhandle 1
1045}
1046
1047test_suite "session_strm" -description {
1048  All session module related tests using the streaming APIs.
1049} -files [
1050  glob -nocomplain $::testdir/../ext/session/*.test
1051] -dbconfig {
1052  set ::sqlite3session_streams 1
1053}
1054
1055test_suite "rbu" -description {
1056  RBU tests.
1057} -files [
1058  test_set [glob -nocomplain $::testdir/../ext/rbu/*.test] -exclude rbu.test
1059]
1060
1061test_suite "no_optimization" -description {
1062  Run test scripts with optimizations disabled using the
1063  sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface.
1064} -files [
1065  test_set \
1066    [glob -nocomplain $::testdir/window*.test]                       \
1067    where.test where2.test where3.test where4.test where5.test       \
1068    where6.test where7.test where8.test where9.test                  \
1069    whereA.test whereB.test wherelimit.test                          \
1070    select1.test select2.test select3.test select4.test select5.test \
1071    select7.test select8.test selectA.test selectC.test              \
1072    -exclude windowpushd.test
1073] -dbconfig {
1074  optimization_control $::dbhandle all 0
1075}
1076
1077test_suite "prepare" -description {
1078  Run tests with the db connection using sqlite3_prepare() instead of _v2().
1079} -dbconfig {
1080  $::dbhandle version -use-legacy-prepare 1
1081  #$::dbhandle cache size 0
1082} -files [
1083  test_set $allquicktests -exclude *malloc* *ioerr* *fault* \
1084      stmtvtab1.test index9.test
1085]
1086
1087test_suite "sorterref" -prefix "" -description {
1088  Run the "veryquick" test suite with SQLITE_CONFIG_SORTERREF_SIZE set
1089  to 0 so that sorter-references are used whenever possible.
1090} -files [
1091  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
1092      *fts5corrupt* *fts5big* *fts5aj*
1093] -initialize {
1094  catch {db close}
1095  sqlite3_shutdown
1096  sqlite3_config_sorterref 0
1097  sqlite3_initialize
1098  autoinstall_test_functions
1099} -shutdown {
1100  catch {db close}
1101  sqlite3_shutdown
1102  sqlite3_config_sorterref -1
1103  sqlite3_initialize
1104  autoinstall_test_functions
1105}
1106
1107test_suite "maindbname" -prefix "" -description {
1108  Run the "veryquick" test suite with SQLITE_DBCONFIG_MAINDBNAME used to
1109  set the name of database 0 to "icecube".
1110} -files [
1111  test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
1112      *fts5corrupt* *fts5big* *fts5aj*
1113] -dbconfig {
1114  dbconfig_maindbname_icecube $::dbhandle
1115}
1116
1117# End of tests
1118#############################################################################
1119
1120# run_tests NAME OPTIONS
1121#
1122# where available options are:
1123#
1124#       -description TITLE
1125#       -initialize  SCRIPT
1126#       -shutdown    SCRIPT
1127#       -files       LIST-OF-FILES
1128#       -prefix      NAME
1129#       -dbconfig    SCRIPT
1130#
1131proc run_tests {name args} {
1132  set options(-initialize) ""
1133  set options(-shutdown) ""
1134  set options(-prefix) ""
1135  set options(-dbconfig) ""
1136  set options(-presql) ""
1137
1138  array set options $args
1139
1140  set ::G(perm:name)         $name
1141  set ::G(perm:prefix)       $options(-prefix)
1142  set ::G(isquick)           1
1143  set ::G(perm:dbconfig)     $options(-dbconfig)
1144  set ::G(perm:presql)       $options(-presql)
1145
1146  set filelist [lsort $options(-files)]
1147  if {[info exists ::env(TCLTEST_PART)]} {
1148    regexp {^([0-9]*)/([0-9]*)$} $::env(TCLTEST_PART) -> A B
1149    set nFile [expr {([llength $filelist]+$B-1)/$B}]
1150    set filelist [lrange $filelist [expr ($A-1)*$nFile] [expr $A*$nFile-1]]
1151  }
1152
1153  foreach file $filelist {
1154    if {[file tail $file] == $file} { set file [file join $::testdir $file] }
1155
1156    if {[info exists ::env(SQLITE_TEST_PATTERN_LIST)]} {
1157      set ok 0
1158      foreach p $::env(SQLITE_TEST_PATTERN_LIST) {
1159        set p [string map {% *} $p]
1160        if {[string match $p [file tail $file]]} {set ok 1 ; break}
1161      }
1162      if {!$ok} continue
1163    }
1164
1165    uplevel $options(-initialize)
1166    slave_test_file $file
1167    uplevel $options(-shutdown)
1168    unset -nocomplain ::G(perm:sqlite3_args)
1169  }
1170
1171  unset ::G(perm:name)
1172  unset ::G(perm:prefix)
1173  unset ::G(perm:dbconfig)
1174  unset ::G(perm:presql)
1175}
1176
1177proc run_test_suite {name} {
1178  if {[info exists ::testspec($name)]==0} {
1179    error "No such test suite: $name"
1180  }
1181  uplevel run_tests $name $::testspec($name)
1182}
1183
1184proc help {} {
1185  puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
1186  puts ""
1187  puts "Available test-suites are:"
1188
1189  set iPos 0
1190  foreach k $::testsuitelist {
1191    if {[info exists ::testspec($k)]} {
1192      switch $iPos {
1193        0 {
1194          puts ""
1195          puts -nonewline "  [format %-30s $k]"
1196        }
1197
1198        1 {
1199          puts -nonewline [format %-30s $k]
1200        }
1201
1202        2 {
1203          puts -nonewline $k
1204        }
1205      }
1206
1207      set iPos [expr (($iPos+1) % 3)]
1208    }
1209  }
1210  puts ""
1211  exit -1
1212}
1213
1214if {[file tail $argv0] == "permutations.test"} {
1215  proc main {argv} {
1216    if {[llength $argv]==0} {
1217      help
1218    } else {
1219
1220      # See if the first argument is a named test-suite.
1221      #
1222      set suite [file tail [lindex $argv 0]]
1223      if {[info exists ::testspec($suite)]} {
1224        set S $::testspec($suite)
1225        set i 1
1226      } else {
1227        set suite default
1228        set S [list]
1229        set i 0
1230      }
1231
1232      set extra ""
1233      if {$i < [llength $argv] && [string range [lindex $argv $i] 0 0]!="-" } {
1234        set files [list]
1235        for {} {$i < [llength $argv]} {incr i} {
1236          set pattern [string map {% *} [lindex $argv $i]]
1237          if {[string range $pattern 0 0]=="-"} break
1238          foreach f $::alltests {
1239            set tail [file tail $f]
1240            if {[lsearch $files $f]<0 && [string match $pattern $tail]} {
1241              lappend files $f
1242            }
1243          }
1244        }
1245        set extra [list -files $files]
1246      }
1247
1248      eval [list run_tests $suite] $S $extra
1249    }
1250  }
1251  main $argv
1252  set argv {}
1253  finish_test
1254}
1255