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