0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72 # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68 15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 ource code. In
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 al notice, here
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f .# May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 il..# May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 s..# May you
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 ver taking more
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 file implements
0180: 20 73 6f 6d 65 20 63 6f 6d 6d 6f 6e 20 54 43 4c some common TCL
0190: 20 72 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 routines used f
01a0: 6f 72 20 72 65 67 72 65 73 73 69 6f 6e 0a 23 20 or regression.#
01b0: 74 65 73 74 69 6e 67 20 74 68 65 20 53 51 4c 69 testing the SQLi
01c0: 74 65 20 6c 69 62 72 61 72 79 0a 23 0a 23 20 24 te library.#.# $
01d0: 49 64 3a 20 74 65 73 74 65 72 2e 74 63 6c 2c 76 Id: tester.tcl,v
01e0: 20 31 2e 31 34 33 20 32 30 30 39 2f 30 34 2f 30 1.143 2009/04/0
01f0: 39 20 30 31 3a 32 33 3a 34 39 20 64 72 68 20 45 9 01:23:49 drh E
0200: 78 70 20 24 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d xp $..#---------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0250: 0a 23 20 54 68 65 20 63 6f 6d 6d 61 6e 64 73 20 .# The commands
0260: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 provided by the
0270: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c code in this fil
0280: 65 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 63 e to help with c
0290: 72 65 61 74 69 6e 67 0a 23 20 74 65 73 74 20 63 reating.# test c
02a0: 61 73 65 73 20 61 72 65 20 61 73 20 66 6f 6c 6c ases are as foll
02b0: 6f 77 73 3a 0a 23 0a 23 20 43 6f 6d 6d 61 6e 64 ows:.#.# Command
02c0: 73 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65 20 s to manipulate
02d0: 74 68 65 20 64 62 20 61 6e 64 20 74 68 65 20 66 the db and the f
02e0: 69 6c 65 2d 73 79 73 74 65 6d 20 61 74 20 61 20 ile-system at a
02f0: 68 69 67 68 20 6c 65 76 65 6c 3a 0a 23 0a 23 20 high level:.#.#
0300: 20 20 20 20 20 69 73 5f 72 65 6c 61 74 69 76 65 is_relative
0310: 5f 66 69 6c 65 0a 23 20 20 20 20 20 20 74 65 73 _file.# tes
0320: 74 5f 70 77 64 0a 23 20 20 20 20 20 20 67 65 74 t_pwd.# get
0330: 5f 70 77 64 0a 23 20 20 20 20 20 20 63 6f 70 79 _pwd.# copy
0340: 5f 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 _file
0350: 20 20 20 46 52 4f 4d 20 54 4f 0a 23 20 20 20 20 FROM TO.#
0360: 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 20 20 delete_file
0370: 20 20 20 20 20 20 20 20 20 46 49 4c 45 4e 41 4d FILENAM
0380: 45 0a 23 20 20 20 20 20 20 64 72 6f 70 5f 61 6c E.# drop_al
0390: 6c 5f 74 61 62 6c 65 73 20 20 20 20 20 20 20 20 l_tables
03a0: 3f 44 42 3f 0a 23 20 20 20 20 20 20 66 6f 72 63 ?DB?.# forc
03b0: 65 63 6f 70 79 20 20 20 20 20 20 20 20 20 20 20 ecopy
03c0: 20 20 20 46 52 4f 4d 20 54 4f 0a 23 20 20 20 20 FROM TO.#
03d0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 20 20 forcedelete
03e0: 20 20 20 20 20 20 20 20 20 46 49 4c 45 4e 41 4d FILENAM
03f0: 45 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 63 E.#.# Test the c
0400: 61 70 61 62 69 6c 69 74 79 20 6f 66 20 74 68 65 apability of the
0410: 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 SQLite version
0420: 62 75 69 6c 74 20 69 6e 74 6f 20 74 68 65 20 69 built into the i
0430: 6e 74 65 72 70 72 65 74 65 72 20 74 6f 0a 23 20 nterpreter to.#
0440: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 73 determine if a s
0450: 70 65 63 69 66 69 63 20 74 65 73 74 20 63 61 6e pecific test can
0460: 20 62 65 20 72 75 6e 3a 0a 23 0a 23 20 20 20 20 be run:.#.#
0470: 20 20 63 61 70 61 62 6c 65 20 20 20 20 20 20 20 capable
0480: 20 20 20 20 20 20 20 20 20 45 58 50 52 0a 23 20 EXPR.#
0490: 20 20 20 20 20 69 66 63 61 70 61 62 6c 65 20 20 ifcapable
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 50 52 EXPR
04b0: 0a 23 0a 23 20 43 61 6c 75 6c 61 74 65 20 63 68 .#.# Calulate ch
04c0: 65 63 6b 73 75 6d 73 20 62 61 73 65 64 20 6f 6e ecksums based on
04d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e database conten
04e0: 74 73 3a 0a 23 0a 23 20 20 20 20 20 20 64 62 63 ts:.#.# dbc
04f0: 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 ksum
0500: 20 20 20 20 44 42 20 44 42 4e 41 4d 45 0a 23 20 DB DBNAME.#
0510: 20 20 20 20 20 61 6c 6c 63 6b 73 75 6d 20 20 20 allcksum
0520: 20 20 20 20 20 20 20 20 20 20 20 20 3f 44 42 3f ?DB?
0530: 0a 23 20 20 20 20 20 20 63 6b 73 75 6d 20 20 20 .# cksum
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f ?
0550: 44 42 3f 0a 23 0a 23 20 43 6f 6d 6d 61 6e 64 73 DB?.#.# Commands
0560: 20 74 6f 20 65 78 65 63 75 74 65 2f 65 78 70 6c to execute/expl
0570: 61 69 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e ain SQL statemen
0580: 74 73 3a 0a 23 0a 23 20 20 20 20 20 20 6d 65 6d ts:.#.# mem
0590: 64 62 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 dbsql
05a0: 20 20 20 20 53 51 4c 0a 23 20 20 20 20 20 20 73 SQL.# s
05b0: 74 65 70 73 71 6c 20 20 20 20 20 20 20 20 20 20 tepsql
05c0: 20 20 20 20 20 20 44 42 20 53 51 4c 0a 23 20 20 DB SQL.#
05d0: 20 20 20 20 65 78 65 63 73 71 6c 32 20 20 20 20 execsql2
05e0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 0a 23 SQL.#
05f0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 6e 6f explain_no
0600: 5f 74 72 61 63 65 20 20 20 20 20 20 20 53 51 4c _trace SQL
0610: 0a 23 20 20 20 20 20 20 65 78 70 6c 61 69 6e 20 .# explain
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 S
0630: 51 4c 20 3f 44 42 3f 0a 23 20 20 20 20 20 20 63 QL ?DB?.# c
0640: 61 74 63 68 73 71 6c 20 20 20 20 20 20 20 20 20 atchsql
0650: 20 20 20 20 20 20 53 51 4c 20 3f 44 42 3f 0a 23 SQL ?DB?.#
0660: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 20 20 execsql
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c SQL
0680: 20 3f 44 42 3f 0a 23 0a 23 20 43 6f 6d 6d 61 6e ?DB?.#.# Comman
0690: 64 73 20 74 6f 20 72 75 6e 20 74 65 73 74 20 63 ds to run test c
06a0: 61 73 65 73 3a 0a 23 0a 23 20 20 20 20 20 20 64 ases:.#.# d
06b0: 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 20 20 20 o_ioerr_test
06c0: 20 20 20 20 20 20 54 45 53 54 4e 41 4d 45 20 41 TESTNAME A
06d0: 52 47 53 2e 2e 2e 0a 23 20 20 20 20 20 20 63 72 RGS....# cr
06e0: 61 73 68 73 71 6c 20 20 20 20 20 20 20 20 20 20 ashsql
06f0: 20 20 20 20 20 41 52 47 53 2e 2e 2e 0a 23 20 20 ARGS....#
0700: 20 20 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 integrity_ch
0710: 65 63 6b 20 20 20 20 20 20 20 20 54 45 53 54 4e eck TESTN
0720: 41 4d 45 20 3f 44 42 3f 0a 23 20 20 20 20 20 20 AME ?DB?.#
0730: 76 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 verify_ex_errcod
0740: 65 20 20 20 20 20 20 54 45 53 54 4e 41 4d 45 20 e TESTNAME
0750: 45 58 50 45 43 54 45 44 20 3f 44 42 3f 0a 23 20 EXPECTED ?DB?.#
0760: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 20 20 20 do_test
0770: 20 20 20 20 20 20 20 20 20 20 20 20 54 45 53 54 TEST
0780: 4e 41 4d 45 20 53 43 52 49 50 54 20 45 58 50 45 NAME SCRIPT EXPE
0790: 43 54 45 44 0a 23 20 20 20 20 20 20 64 6f 5f 65 CTED.# do_e
07a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 20 20 20 20 xecsql_test
07b0: 20 20 20 54 45 53 54 4e 41 4d 45 20 53 51 4c 20 TESTNAME SQL
07c0: 45 58 50 45 43 54 45 44 0a 23 20 20 20 20 20 20 EXPECTED.#
07d0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 do_catchsql_test
07e0: 20 20 20 20 20 20 20 54 45 53 54 4e 41 4d 45 20 TESTNAME
07f0: 53 51 4c 20 45 58 50 45 43 54 45 44 0a 23 20 20 SQL EXPECTED.#
0800: 20 20 20 20 64 6f 5f 74 69 6d 65 64 5f 65 78 65 do_timed_exe
0810: 63 73 71 6c 5f 74 65 73 74 20 20 54 45 53 54 4e csql_test TESTN
0820: 41 4d 45 20 53 51 4c 20 45 58 50 45 43 54 45 44 AME SQL EXPECTED
0830: 0a 23 0a 23 20 43 6f 6d 6d 61 6e 64 73 20 70 72 .#.# Commands pr
0840: 6f 76 69 64 69 6e 67 20 61 20 6c 6f 77 65 72 20 oviding a lower
0850: 6c 65 76 65 6c 20 69 6e 74 65 72 66 61 63 65 20 level interface
0860: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 74 65 to the global te
0870: 73 74 20 63 6f 75 6e 74 65 72 73 3a 0a 23 0a 23 st counters:.#.#
0880: 20 20 20 20 20 20 73 65 74 5f 74 65 73 74 5f 63 set_test_c
0890: 6f 75 6e 74 65 72 20 20 20 20 20 20 20 43 4f 55 ounter COU
08a0: 4e 54 45 52 20 3f 56 41 4c 55 45 3f 0a 23 20 20 NTER ?VALUE?.#
08b0: 20 20 20 20 6f 6d 69 74 5f 74 65 73 74 20 20 20 omit_test
08c0: 20 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4e TESTN
08d0: 41 4d 45 20 52 45 41 53 4f 4e 20 3f 41 50 50 45 AME REASON ?APPE
08e0: 4e 44 3f 0a 23 20 20 20 20 20 20 66 61 69 6c 5f ND?.# fail_
08f0: 74 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 test
0900: 20 20 54 45 53 54 4e 41 4d 45 0a 23 20 20 20 20 TESTNAME.#
0910: 20 20 69 6e 63 72 5f 6e 74 65 73 74 0a 23 0a 23 incr_ntest.#.#
0920: 20 43 6f 6d 6d 61 6e 64 20 72 75 6e 20 61 74 20 Command run at
0930: 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 the end of each
0940: 74 65 73 74 20 66 69 6c 65 3a 0a 23 0a 23 20 20 test file:.#.#
0950: 20 20 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a finish_test.
0960: 23 0a 23 20 43 6f 6d 6d 61 6e 64 73 20 74 6f 20 #.# Commands to
0970: 68 65 6c 70 20 63 72 65 61 74 65 20 74 65 73 74 help create test
0980: 20 66 69 6c 65 73 20 74 68 61 74 20 72 75 6e 20 files that run
0990: 77 69 74 68 20 74 68 65 20 22 57 41 4c 22 20 61 with the "WAL" a
09a0: 6e 64 20 6f 74 68 65 72 0a 23 20 70 65 72 6d 75 nd other.# permu
09b0: 74 61 74 69 6f 6e 73 20 28 73 65 65 20 66 69 6c tations (see fil
09c0: 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 73 2e 74 e permutations.t
09d0: 65 73 74 29 3a 0a 23 0a 23 20 20 20 20 20 20 77 est):.#.# w
09e0: 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65 0a 23 al_is_wal_mode.#
09f0: 20 20 20 20 20 20 77 61 6c 5f 73 65 74 5f 6a 6f wal_set_jo
0a00: 75 72 6e 61 6c 5f 6d 6f 64 65 20 20 20 3f 44 42 urnal_mode ?DB
0a10: 3f 0a 23 20 20 20 20 20 20 77 61 6c 5f 63 68 65 ?.# wal_che
0a20: 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 ck_journal_mode
0a30: 54 45 53 54 4e 41 4d 45 3f 44 42 3f 0a 23 20 20 TESTNAME?DB?.#
0a40: 20 20 20 20 70 65 72 6d 75 74 61 74 69 6f 6e 0a permutation.
0a50: 23 20 20 20 20 20 20 70 72 65 73 71 6c 0a 23 0a # presql.#.
0a60: 23 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 74 65 73 # Command to tes
0a70: 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 t whether or not
0a80: 20 2d 2d 76 65 72 62 6f 73 65 3d 31 20 77 61 73 --verbose=1 was
0a90: 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 specified on th
0aa0: 65 20 63 6f 6d 6d 61 6e 64 0a 23 20 6c 69 6e 65 e command.# line
0ab0: 20 28 72 65 74 75 72 6e 73 20 30 20 66 6f 72 20 (returns 0 for
0ac0: 6e 6f 74 2d 76 65 72 62 6f 73 65 2c 20 31 20 66 not-verbose, 1 f
0ad0: 6f 72 20 76 65 72 62 6f 73 65 20 61 6e 64 20 32 or verbose and 2
0ae0: 20 66 6f 72 20 22 76 65 72 62 6f 73 65 20 69 6e for "verbose in
0af0: 20 74 68 65 0a 23 20 6f 75 74 70 75 74 20 66 69 the.# output fi
0b00: 6c 65 20 6f 6e 6c 79 22 29 2e 0a 23 0a 23 20 20 le only")..#.#
0b10: 20 20 20 20 76 65 72 62 6f 73 65 0a 23 0a 0a 23 verbose.#..#
0b20: 20 53 65 74 20 74 68 65 20 70 72 65 63 69 73 69 Set the precisi
0b30: 6f 6e 20 6f 66 20 46 50 20 61 72 69 74 68 6d 61 on of FP arithma
0b40: 74 69 63 20 75 73 65 64 20 62 79 20 74 68 65 20 tic used by the
0b50: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 41 6e 64 interpreter. And
0b60: 0a 23 20 63 6f 6e 66 69 67 75 72 65 20 53 51 4c .# configure SQL
0b70: 69 74 65 20 74 6f 20 74 61 6b 65 20 64 61 74 61 ite to take data
0b80: 62 61 73 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 base file locks
0b90: 6f 6e 20 74 68 65 20 70 61 67 65 20 74 68 61 74 on the page that
0ba0: 20 62 65 67 69 6e 73 0a 23 20 36 34 4b 42 20 69 begins.# 64KB i
0bb0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 nto the database
0bc0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 file instead of
0bd0: 20 74 68 65 20 6f 6e 65 20 31 47 42 20 69 6e 2e the one 1GB in.
0be0: 20 54 68 69 73 20 6d 65 61 6e 73 0a 23 20 74 68 This means.# th
0bf0: 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 e code that hand
0c00: 6c 65 73 20 74 68 61 74 20 73 70 65 63 69 61 6c les that special
0c10: 20 63 61 73 65 20 63 61 6e 20 62 65 20 74 65 73 case can be tes
0c20: 74 65 64 20 77 69 74 68 6f 75 74 20 63 72 65 61 ted without crea
0c30: 74 69 6e 67 0a 23 20 76 65 72 79 20 6c 61 72 67 ting.# very larg
0c40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 e database files
0c50: 2e 0a 23 0a 73 65 74 20 74 63 6c 5f 70 72 65 63 ..#.set tcl_prec
0c60: 69 73 69 6f 6e 20 31 35 0a 73 71 6c 69 74 65 33 ision 15.sqlite3
0c70: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 _test_control_pe
0c80: 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 30 30 31 nding_byte 0x001
0c90: 30 30 30 30 0a 0a 0a 23 20 49 66 20 74 68 65 20 0000...# If the
0ca0: 70 61 67 65 72 20 63 6f 64 65 63 20 69 73 20 61 pager codec is a
0cb0: 76 61 69 6c 61 62 6c 65 2c 20 63 72 65 61 74 65 vailable, create
0cc0: 20 61 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 a wrapper for t
0cd0: 68 65 20 5b 73 71 6c 69 74 65 33 5d 0a 23 20 63 he [sqlite3].# c
0ce0: 6f 6d 6d 61 6e 64 20 74 68 61 74 20 61 70 70 65 ommand that appe
0cf0: 6e 64 73 20 22 2d 6b 65 79 20 7b 78 79 7a 7a 79 nds "-key {xyzzy
0d00: 7d 22 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e }" to the comman
0d10: 64 20 6c 69 6e 65 2e 20 69 2e 65 2e 20 74 68 69 d line. i.e. thi
0d20: 73 3a 0a 23 0a 23 20 20 20 20 20 73 71 6c 69 74 s:.#.# sqlit
0d30: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 23 0a e3 db test.db.#.
0d40: 23 20 62 65 63 6f 6d 65 73 0a 23 0a 23 20 20 20 # becomes.#.#
0d50: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 sqlite3 db tes
0d60: 74 2e 64 62 20 2d 6b 65 79 20 7b 78 79 7a 7a 79 t.db -key {xyzzy
0d70: 7d 0a 23 0a 69 66 20 7b 5b 69 6e 66 6f 20 63 6f }.#.if {[info co
0d80: 6d 6d 61 6e 64 20 73 71 6c 69 74 65 5f 6f 72 69 mmand sqlite_ori
0d90: 67 5d 3d 3d 22 22 7d 20 7b 0a 20 20 72 65 6e 61 g]==""} {. rena
0da0: 6d 65 20 73 71 6c 69 74 65 33 20 73 71 6c 69 74 me sqlite3 sqlit
0db0: 65 5f 6f 72 69 67 0a 20 20 70 72 6f 63 20 73 71 e_orig. proc sq
0dc0: 6c 69 74 65 33 20 7b 61 72 67 73 7d 20 7b 0a 20 lite3 {args} {.
0dd0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 if {[llength
0de0: 24 61 72 67 73 5d 3e 3d 32 20 26 26 20 5b 73 74 $args]>=2 && [st
0df0: 72 69 6e 67 20 69 6e 64 65 78 20 5b 6c 69 6e 64 ring index [lind
0e00: 65 78 20 24 61 72 67 73 20 30 5d 20 30 5d 21 3d ex $args 0] 0]!=
0e10: 22 2d 22 7d 20 7b 0a 20 20 20 20 20 20 23 20 54 "-"} {. # T
0e20: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6f his command is o
0e30: 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 64 61 74 pening a new dat
0e40: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
0e50: 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 .. #.
0e60: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 if {[info exists
0e70: 20 3a 3a 47 28 70 65 72 6d 3a 73 71 6c 69 74 65 ::G(perm:sqlite
0e80: 33 5f 61 72 67 73 29 5d 7d 20 7b 0a 20 20 20 20 3_args)]} {.
0e90: 20 20 20 20 73 65 74 20 61 72 67 73 20 5b 63 6f set args [co
0ea0: 6e 63 61 74 20 24 61 72 67 73 20 24 3a 3a 47 28 ncat $args $::G(
0eb0: 70 65 72 6d 3a 73 71 6c 69 74 65 33 5f 61 72 67 perm:sqlite3_arg
0ec0: 73 29 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 s)]. }.
0ed0: 20 20 69 66 20 7b 5b 73 71 6c 69 74 65 5f 6f 72 if {[sqlite_or
0ee0: 69 67 20 2d 68 61 73 2d 63 6f 64 65 63 5d 20 26 ig -has-codec] &
0ef0: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 & ![info exists
0f00: 3a 3a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 ::do_not_use_cod
0f10: 65 63 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c ec]} {. l
0f20: 61 70 70 65 6e 64 20 61 72 67 73 20 2d 6b 65 79 append args -key
0f30: 20 7b 78 79 7a 7a 79 7d 0a 20 20 20 20 20 20 7d {xyzzy}. }
0f40: 0a 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20 .. set res
0f50: 5b 75 70 6c 65 76 65 6c 20 31 20 73 71 6c 69 74 [uplevel 1 sqlit
0f60: 65 5f 6f 72 69 67 20 24 61 72 67 73 5d 0a 20 20 e_orig $args].
0f70: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 if {[info ex
0f80: 69 73 74 73 20 3a 3a 47 28 70 65 72 6d 3a 70 72 ists ::G(perm:pr
0f90: 65 73 71 6c 29 5d 7d 20 7b 0a 20 20 20 20 20 20 esql)]} {.
0fa0: 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 [lindex $args
0fb0: 30 5d 20 65 76 61 6c 20 24 3a 3a 47 28 70 65 72 0] eval $::G(per
0fc0: 6d 3a 70 72 65 73 71 6c 29 0a 20 20 20 20 20 20 m:presql).
0fd0: 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 }. if {[inf
0fe0: 6f 20 65 78 69 73 74 73 20 3a 3a 47 28 70 65 72 o exists ::G(per
0ff0: 6d 3a 64 62 63 6f 6e 66 69 67 29 5d 7d 20 7b 0a m:dbconfig)]} {.
1000: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 64 62 set ::db
1010: 68 61 6e 64 6c 65 20 5b 6c 69 6e 64 65 78 20 24 handle [lindex $
1020: 61 72 67 73 20 30 5d 0a 20 20 20 20 20 20 20 20 args 0].
1030: 75 70 6c 65 76 65 6c 20 23 30 20 24 3a 3a 47 28 uplevel #0 $::G(
1040: 70 65 72 6d 3a 64 62 63 6f 6e 66 69 67 29 0a 20 perm:dbconfig).
1050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 }. set
1060: 20 72 65 73 0a 20 20 20 20 7d 20 65 6c 73 65 20 res. } else
1070: 7b 0a 20 20 20 20 20 20 23 20 54 68 69 73 20 63 {. # This c
1080: 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 6f 70 ommand is not op
1090: 65 6e 69 6e 67 20 61 20 6e 65 77 20 64 61 74 61 ening a new data
10a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e base connection.
10b0: 20 50 61 73 73 20 74 68 65 0a 20 20 20 20 20 20 Pass the.
10c0: 23 20 61 72 67 75 6d 65 6e 74 73 20 74 68 72 6f # arguments thro
10d0: 75 67 68 20 74 6f 20 74 68 65 20 43 20 69 6d 70 ugh to the C imp
10e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 20 74 lementation as t
10f0: 68 65 20 61 72 65 2e 0a 20 20 20 20 20 20 23 0a he are.. #.
1100: 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 uplevel 1
1110: 73 71 6c 69 74 65 5f 6f 72 69 67 20 24 61 72 67 sqlite_orig $arg
1120: 73 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 70 s. }. }.}..p
1130: 72 6f 63 20 67 65 74 46 69 6c 65 52 65 74 72 69 roc getFileRetri
1140: 65 73 20 7b 7d 20 7b 0a 20 20 69 66 20 7b 21 5b es {} {. if {![
1150: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 47 28 info exists ::G(
1160: 66 69 6c 65 2d 72 65 74 72 69 65 73 29 5d 7d 20 file-retries)]}
1170: 7b 0a 20 20 20 20 23 0a 20 20 20 20 23 20 4e 4f {. #. # NO
1180: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 64 TE: Return the d
1190: 65 66 61 75 6c 74 20 6e 75 6d 62 65 72 20 6f 66 efault number of
11a0: 20 72 65 74 72 69 65 73 20 66 6f 72 20 5b 66 69 retries for [fi
11b0: 6c 65 5d 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 le] operations.
11c0: 20 41 0a 20 20 20 20 23 20 20 20 20 20 20 20 76 A. # v
11d0: 61 6c 75 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 alue of zero or
11e0: 6c 65 73 73 20 68 65 72 65 20 6d 65 61 6e 73 20 less here means
11f0: 22 64 69 73 61 62 6c 65 64 22 2e 0a 20 20 20 20 "disabled"..
1200: 23 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 #. return [ex
1210: 70 72 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 pr {$::tcl_platf
1220: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 65 71 orm(platform) eq
1230: 20 22 77 69 6e 64 6f 77 73 22 20 3f 20 35 30 20 "windows" ? 50
1240: 3a 20 30 7d 5d 0a 20 20 7d 0a 20 20 72 65 74 75 : 0}]. }. retu
1250: 72 6e 20 24 3a 3a 47 28 66 69 6c 65 2d 72 65 74 rn $::G(file-ret
1260: 72 69 65 73 29 0a 7d 0a 0a 70 72 6f 63 20 67 65 ries).}..proc ge
1270: 74 46 69 6c 65 52 65 74 72 79 44 65 6c 61 79 20 tFileRetryDelay
1280: 7b 7d 20 7b 0a 20 20 69 66 20 7b 21 5b 69 6e 66 {} {. if {![inf
1290: 6f 20 65 78 69 73 74 73 20 3a 3a 47 28 66 69 6c o exists ::G(fil
12a0: 65 2d 72 65 74 72 79 2d 64 65 6c 61 79 29 5d 7d e-retry-delay)]}
12b0: 20 7b 0a 20 20 20 20 23 0a 20 20 20 20 23 20 4e {. #. # N
12c0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 OTE: Return the
12d0: 64 65 66 61 75 6c 74 20 6e 75 6d 62 65 72 20 6f default number o
12e0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 74 f milliseconds t
12f0: 6f 20 77 61 69 74 20 77 68 65 6e 20 72 65 74 72 o wait when retr
1300: 79 69 6e 67 0a 20 20 20 20 23 20 20 20 20 20 20 ying. #
1310: 20 66 61 69 6c 65 64 20 5b 66 69 6c 65 5d 20 6f failed [file] o
1320: 70 65 72 61 74 69 6f 6e 73 2e 20 20 41 20 76 61 perations. A va
1330: 6c 75 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6c lue of zero or l
1340: 65 73 73 20 6d 65 61 6e 73 20 22 64 6f 20 6e 6f ess means "do no
1350: 74 0a 20 20 20 20 23 20 20 20 20 20 20 20 77 61 t. # wa
1360: 69 74 22 2e 0a 20 20 20 20 23 0a 20 20 20 20 72 it".. #. r
1370: 65 74 75 72 6e 20 31 30 30 3b 20 23 20 54 4f 44 eturn 100; # TOD
1380: 4f 3a 20 47 6f 6f 64 20 64 65 66 61 75 6c 74 3f O: Good default?
1390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 24 3a . }. return $:
13a0: 3a 47 28 66 69 6c 65 2d 72 65 74 72 79 2d 64 65 :G(file-retry-de
13b0: 6c 61 79 29 0a 7d 0a 0a 23 20 52 65 74 75 72 6e lay).}..# Return
13c0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 the string repr
13d0: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 61 6d esenting the nam
13e0: 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 e of the current
13f0: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 4f 6e 0a directory. On.
1400: 23 20 57 69 6e 64 6f 77 73 2c 20 74 68 65 20 72 # Windows, the r
1410: 65 73 75 6c 74 20 69 73 20 22 6e 6f 72 6d 61 6c esult is "normal
1420: 69 7a 65 64 22 20 74 6f 20 77 68 61 74 65 76 65 ized" to whateve
1430: 72 20 6f 75 72 20 70 61 72 65 6e 74 20 63 6f 6d r our parent com
1440: 6d 61 6e 64 20 73 68 65 6c 6c 0a 23 20 69 73 20 mand shell.# is
1450: 75 73 69 6e 67 20 74 6f 20 70 72 65 76 65 6e 74 using to prevent
1460: 20 63 61 73 65 2d 6d 69 73 6d 61 74 63 68 20 69 case-mismatch i
1470: 73 73 75 65 73 2e 0a 23 0a 70 72 6f 63 20 67 65 ssues..#.proc ge
1480: 74 5f 70 77 64 20 7b 7d 20 7b 0a 20 20 69 66 20 t_pwd {} {. if
1490: 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d {$::tcl_platform
14a0: 28 70 6c 61 74 66 6f 72 6d 29 20 65 71 20 22 77 (platform) eq "w
14b0: 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 23 indows"} {. #
14c0: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6e . # NOTE: Can
14d0: 6e 6f 74 20 75 73 65 20 5b 66 69 6c 65 20 6e 6f not use [file no
14e0: 72 6d 61 6c 69 7a 65 5d 20 68 65 72 65 20 62 65 rmalize] here be
14f0: 63 61 75 73 65 20 69 74 20 77 6f 75 6c 64 20 61 cause it would a
1500: 6c 74 65 72 20 74 68 65 0a 20 20 20 20 23 20 20 lter the. #
1510: 20 20 20 20 20 63 61 73 65 20 6f 66 20 74 68 65 case of the
1520: 20 72 65 73 75 6c 74 20 74 6f 20 77 68 61 74 20 result to what
1530: 54 63 6c 20 63 6f 6e 73 69 64 65 72 73 20 63 61 Tcl considers ca
1540: 6e 6f 6e 69 63 61 6c 2c 20 77 68 69 63 68 20 77 nonical, which w
1550: 6f 75 6c 64 0a 20 20 20 20 23 20 20 20 20 20 20 ould. #
1560: 20 64 65 66 65 61 74 20 74 68 65 20 70 75 72 70 defeat the purp
1570: 6f 73 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 ose of this proc
1580: 65 64 75 72 65 2e 0a 20 20 20 20 23 0a 20 20 20 edure.. #.
1590: 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 return [string
15a0: 6d 61 70 20 5b 6c 69 73 74 20 5c 5c 20 2f 5d 20 map [list \\ /]
15b0: 5c 0a 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e \. [strin
15c0: 67 20 74 72 69 6d 20 5b 65 78 65 63 20 2d 2d 20 g trim [exec --
15d0: 24 3a 3a 65 6e 76 28 43 6f 6d 53 70 65 63 29 20 $::env(ComSpec)
15e0: 2f 63 20 65 63 68 6f 20 25 43 44 25 5d 5d 5d 0a /c echo %CD%]]].
15f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 } else {. r
1600: 65 74 75 72 6e 20 5b 70 77 64 5d 0a 20 20 7d 0a eturn [pwd]. }.
1610: 7d 0a 0a 23 20 43 6f 70 79 20 66 69 6c 65 20 24 }..# Copy file $
1620: 66 72 6f 6d 20 69 6e 74 6f 20 24 74 6f 2e 20 54 from into $to. T
1630: 68 69 73 20 69 73 20 75 73 65 64 20 62 65 63 61 his is used beca
1640: 75 73 65 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e use some version
1650: 73 20 6f 66 0a 23 20 54 43 4c 20 66 6f 72 20 77 s of.# TCL for w
1660: 69 6e 64 6f 77 73 20 28 6e 6f 74 61 62 6c 79 20 indows (notably
1670: 74 68 65 20 38 2e 34 2e 31 20 62 69 6e 61 72 79 the 8.4.1 binary
1680: 20 70 61 63 6b 61 67 65 20 73 68 69 70 70 65 64 package shipped
1690: 20 77 69 74 68 20 74 68 65 0a 23 20 63 75 72 72 with the.# curr
16a0: 65 6e 74 20 6d 69 6e 67 77 20 72 65 6c 65 61 73 ent mingw releas
16b0: 65 29 20 68 61 76 65 20 61 20 62 72 6f 6b 65 6e e) have a broken
16c0: 20 22 66 69 6c 65 20 63 6f 70 79 22 20 63 6f 6d "file copy" com
16d0: 6d 61 6e 64 2e 0a 23 0a 70 72 6f 63 20 63 6f 70 mand..#.proc cop
16e0: 79 5f 66 69 6c 65 20 7b 66 72 6f 6d 20 74 6f 7d y_file {from to}
16f0: 20 7b 0a 20 20 64 6f 5f 63 6f 70 79 5f 66 69 6c {. do_copy_fil
1700: 65 20 66 61 6c 73 65 20 24 66 72 6f 6d 20 24 74 e false $from $t
1710: 6f 0a 7d 0a 0a 70 72 6f 63 20 66 6f 72 63 65 63 o.}..proc forcec
1720: 6f 70 79 20 7b 66 72 6f 6d 20 74 6f 7d 20 7b 0a opy {from to} {.
1730: 20 20 64 6f 5f 63 6f 70 79 5f 66 69 6c 65 20 74 do_copy_file t
1740: 72 75 65 20 24 66 72 6f 6d 20 24 74 6f 0a 7d 0a rue $from $to.}.
1750: 0a 70 72 6f 63 20 64 6f 5f 63 6f 70 79 5f 66 69 .proc do_copy_fi
1760: 6c 65 20 7b 66 6f 72 63 65 20 66 72 6f 6d 20 74 le {force from t
1770: 6f 7d 20 7b 0a 20 20 73 65 74 20 6e 52 65 74 72 o} {. set nRetr
1780: 79 20 5b 67 65 74 46 69 6c 65 52 65 74 72 69 65 y [getFileRetrie
1790: 73 5d 20 20 20 20 20 3b 23 20 4d 61 78 69 6d 75 s] ;# Maximu
17a0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 m number of retr
17b0: 69 65 73 2e 0a 20 20 73 65 74 20 6e 44 65 6c 61 ies.. set nDela
17c0: 79 20 5b 67 65 74 46 69 6c 65 52 65 74 72 79 44 y [getFileRetryD
17d0: 65 6c 61 79 5d 20 20 3b 23 20 44 65 6c 61 79 20 elay] ;# Delay
17e0: 69 6e 20 6d 73 20 62 65 66 6f 72 65 20 72 65 74 in ms before ret
17f0: 72 79 69 6e 67 2e 0a 0a 20 20 23 20 4f 6e 20 77 rying... # On w
1800: 69 6e 64 6f 77 73 2c 20 73 6f 6d 65 74 69 6d 65 indows, sometime
1810: 73 20 65 76 65 6e 20 61 20 5b 66 69 6c 65 20 63 s even a [file c
1820: 6f 70 79 20 2d 66 6f 72 63 65 5d 20 63 61 6e 20 opy -force] can
1830: 66 61 69 6c 2e 20 54 68 65 20 63 61 75 73 65 20 fail. The cause
1840: 69 73 0a 20 20 23 20 75 73 75 61 6c 6c 79 20 22 is. # usually "
1850: 74 61 67 2d 61 6c 6f 6e 67 73 22 20 2d 20 70 72 tag-alongs" - pr
1860: 6f 67 72 61 6d 73 20 6c 69 6b 65 20 61 6e 74 69 ograms like anti
1870: 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2c -virus software,
1880: 20 61 75 74 6f 6d 61 74 69 63 20 62 61 63 6b 75 automatic backu
1890: 70 0a 20 20 23 20 74 6f 6f 6c 73 20 61 6e 64 20 p. # tools and
18a0: 76 61 72 69 6f 75 73 20 65 78 70 6c 6f 72 65 72 various explorer
18b0: 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 extensions that
18c0: 20 6b 65 65 70 20 61 20 66 69 6c 65 20 6f 70 65 keep a file ope
18d0: 6e 20 61 20 6c 69 74 74 6c 65 20 6c 6f 6e 67 65 n a little longe
18e0: 72 0a 20 20 23 20 74 68 61 6e 20 77 65 20 65 78 r. # than we ex
18f0: 70 65 63 74 2c 20 63 61 75 73 69 6e 67 20 74 68 pect, causing th
1900: 65 20 64 65 6c 65 74 65 20 74 6f 20 66 61 69 6c e delete to fail
1910: 2e 0a 20 20 23 0a 20 20 23 20 54 68 65 20 73 6f .. #. # The so
1920: 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 61 69 lution is to wai
1930: 74 20 61 20 73 68 6f 72 74 20 61 6d 6f 75 6e 74 t a short amount
1940: 20 6f 66 20 74 69 6d 65 20 62 65 66 6f 72 65 20 of time before
1950: 72 65 74 72 79 69 6e 67 20 74 68 65 20 63 6f 70 retrying the cop
1960: 79 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 6e 52 y.. #. if {$nR
1970: 65 74 72 79 20 3e 20 30 7d 20 7b 0a 20 20 20 20 etry > 0} {.
1980: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 for {set i 0} {$
1990: 69 3c 24 6e 52 65 74 72 79 7d 20 7b 69 6e 63 72 i<$nRetry} {incr
19a0: 20 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 i} {. set
19b0: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 rc [catch {.
19c0: 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 7d 20 if {$force}
19d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 {. file
19e0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 66 72 copy -force $fr
19f0: 6f 6d 20 24 74 6f 0a 20 20 20 20 20 20 20 20 7d om $to. }
1a00: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 else {.
1a10: 20 20 66 69 6c 65 20 63 6f 70 79 20 24 66 72 6f file copy $fro
1a20: 6d 20 24 74 6f 0a 20 20 20 20 20 20 20 20 7d 0a m $to. }.
1a30: 20 20 20 20 20 20 7d 20 6d 73 67 5d 0a 20 20 20 } msg].
1a40: 20 20 20 69 66 20 7b 24 72 63 3d 3d 30 7d 20 62 if {$rc==0} b
1a50: 72 65 61 6b 0a 20 20 20 20 20 20 69 66 20 7b 24 reak. if {$
1a60: 6e 44 65 6c 61 79 20 3e 20 30 7d 20 7b 20 61 66 nDelay > 0} { af
1a70: 74 65 72 20 24 6e 44 65 6c 61 79 20 7d 0a 20 20 ter $nDelay }.
1a80: 20 20 7d 0a 20 20 20 20 69 66 20 7b 24 72 63 7d }. if {$rc}
1a90: 20 7b 20 65 72 72 6f 72 20 24 6d 73 67 20 7d 0a { error $msg }.
1aa0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 } else {. i
1ab0: 66 20 7b 24 66 6f 72 63 65 7d 20 7b 0a 20 20 20 f {$force} {.
1ac0: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f file copy -fo
1ad0: 72 63 65 20 24 66 72 6f 6d 20 24 74 6f 0a 20 20 rce $from $to.
1ae0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 } else {.
1af0: 20 66 69 6c 65 20 63 6f 70 79 20 24 66 72 6f 6d file copy $from
1b00: 20 24 74 6f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d $to. }. }.}
1b10: 0a 0a 23 20 43 68 65 63 6b 20 69 66 20 61 20 66 ..# Check if a f
1b20: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 6c 61 ile name is rela
1b30: 74 69 76 65 0a 23 0a 70 72 6f 63 20 69 73 5f 72 tive.#.proc is_r
1b40: 65 6c 61 74 69 76 65 5f 66 69 6c 65 20 7b 20 66 elative_file { f
1b50: 69 6c 65 20 7d 20 7b 0a 20 20 72 65 74 75 72 6e ile } {. return
1b60: 20 5b 65 78 70 72 20 7b 5b 66 69 6c 65 20 70 61 [expr {[file pa
1b70: 74 68 74 79 70 65 20 24 66 69 6c 65 5d 20 21 3d thtype $file] !=
1b80: 20 22 61 62 73 6f 6c 75 74 65 22 7d 5d 0a 7d 0a "absolute"}].}.
1b90: 0a 23 20 49 66 20 74 68 65 20 56 46 53 20 73 75 .# If the VFS su
1ba0: 70 70 6f 72 74 73 20 75 73 69 6e 67 20 74 68 65 pports using the
1bb0: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f current directo
1bc0: 72 79 2c 20 72 65 74 75 72 6e 73 20 5b 70 77 64 ry, returns [pwd
1bd0: 5d 3b 0a 23 20 6f 74 68 65 72 77 69 73 65 2c 20 ];.# otherwise,
1be0: 69 74 20 72 65 74 75 72 6e 73 20 6f 6e 6c 79 20 it returns only
1bf0: 74 68 65 20 70 72 6f 76 69 64 65 64 20 73 75 66 the provided suf
1c00: 66 69 78 20 73 74 72 69 6e 67 20 28 77 68 69 63 fix string (whic
1c10: 68 20 69 73 0a 23 20 65 6d 70 74 79 20 62 79 20 h is.# empty by
1c20: 64 65 66 61 75 6c 74 29 2e 0a 23 0a 70 72 6f 63 default)..#.proc
1c30: 20 74 65 73 74 5f 70 77 64 20 7b 20 61 72 67 73 test_pwd { args
1c40: 20 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e } {. if {[llen
1c50: 67 74 68 20 24 61 72 67 73 5d 20 3e 20 30 7d 20 gth $args] > 0}
1c60: 7b 0a 20 20 20 20 73 65 74 20 73 75 66 66 69 78 {. set suffix
1c70: 31 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 1 [lindex $args
1c80: 30 5d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 0]. if {[llen
1c90: 67 74 68 20 24 61 72 67 73 5d 20 3e 20 31 7d 20 gth $args] > 1}
1ca0: 7b 0a 20 20 20 20 20 20 73 65 74 20 73 75 66 66 {. set suff
1cb0: 69 78 32 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 ix2 [lindex $arg
1cc0: 73 20 31 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 s 1]. } else
1cd0: 7b 0a 20 20 20 20 20 20 73 65 74 20 73 75 66 66 {. set suff
1ce0: 69 78 32 20 24 73 75 66 66 69 78 31 0a 20 20 20 ix2 $suffix1.
1cf0: 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 }. } else {.
1d00: 20 20 73 65 74 20 73 75 66 66 69 78 31 20 22 22 set suffix1 ""
1d10: 3b 20 73 65 74 20 73 75 66 66 69 78 32 20 22 22 ; set suffix2 ""
1d20: 0a 20 20 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 . }. ifcapable
1d30: 20 63 75 72 64 69 72 20 7b 0a 20 20 20 20 72 65 curdir {. re
1d40: 74 75 72 6e 20 22 5b 67 65 74 5f 70 77 64 5d 24 turn "[get_pwd]$
1d50: 73 75 66 66 69 78 31 22 0a 20 20 7d 20 65 6c 73 suffix1". } els
1d60: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 24 e {. return $
1d70: 73 75 66 66 69 78 32 0a 20 20 7d 0a 7d 0a 0a 23 suffix2. }.}..#
1d80: 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 20 6f Delete a file o
1d90: 72 20 64 69 72 65 63 74 6f 72 79 0a 23 0a 70 72 r directory.#.pr
1da0: 6f 63 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 7b oc delete_file {
1db0: 61 72 67 73 7d 20 7b 0a 20 20 64 6f 5f 64 65 6c args} {. do_del
1dc0: 65 74 65 5f 66 69 6c 65 20 66 61 6c 73 65 20 7b ete_file false {
1dd0: 2a 7d 24 61 72 67 73 0a 7d 0a 0a 70 72 6f 63 20 *}$args.}..proc
1de0: 66 6f 72 63 65 64 65 6c 65 74 65 20 7b 61 72 67 forcedelete {arg
1df0: 73 7d 20 7b 0a 20 20 64 6f 5f 64 65 6c 65 74 65 s} {. do_delete
1e00: 5f 66 69 6c 65 20 74 72 75 65 20 7b 2a 7d 24 61 _file true {*}$a
1e10: 72 67 73 0a 7d 0a 0a 70 72 6f 63 20 64 6f 5f 64 rgs.}..proc do_d
1e20: 65 6c 65 74 65 5f 66 69 6c 65 20 7b 66 6f 72 63 elete_file {forc
1e30: 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 e args} {. set
1e40: 6e 52 65 74 72 79 20 5b 67 65 74 46 69 6c 65 52 nRetry [getFileR
1e50: 65 74 72 69 65 73 5d 20 20 20 20 20 3b 23 20 4d etries] ;# M
1e60: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 aximum number of
1e70: 20 72 65 74 72 69 65 73 2e 0a 20 20 73 65 74 20 retries.. set
1e80: 6e 44 65 6c 61 79 20 5b 67 65 74 46 69 6c 65 52 nDelay [getFileR
1e90: 65 74 72 79 44 65 6c 61 79 5d 20 20 3b 23 20 44 etryDelay] ;# D
1ea0: 65 6c 61 79 20 69 6e 20 6d 73 20 62 65 66 6f 72 elay in ms befor
1eb0: 65 20 72 65 74 72 79 69 6e 67 2e 0a 0a 20 20 66 e retrying... f
1ec0: 6f 72 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 oreach filename
1ed0: 24 61 72 67 73 20 7b 0a 20 20 20 20 23 20 4f 6e $args {. # On
1ee0: 20 77 69 6e 64 6f 77 73 2c 20 73 6f 6d 65 74 69 windows, someti
1ef0: 6d 65 73 20 65 76 65 6e 20 61 20 5b 66 69 6c 65 mes even a [file
1f00: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 5d 20 delete -force]
1f10: 63 61 6e 20 66 61 69 6c 20 6a 75 73 74 20 61 66 can fail just af
1f20: 74 65 72 0a 20 20 20 20 23 20 61 20 66 69 6c 65 ter. # a file
1f30: 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65 20 is closed. The
1f40: 63 61 75 73 65 20 69 73 20 75 73 75 61 6c 6c 79 cause is usually
1f50: 20 22 74 61 67 2d 61 6c 6f 6e 67 73 22 20 2d 20 "tag-alongs" -
1f60: 70 72 6f 67 72 61 6d 73 20 6c 69 6b 65 0a 20 20 programs like.
1f70: 20 20 23 20 61 6e 74 69 2d 76 69 72 75 73 20 73 # anti-virus s
1f80: 6f 66 74 77 61 72 65 2c 20 61 75 74 6f 6d 61 74 oftware, automat
1f90: 69 63 20 62 61 63 6b 75 70 20 74 6f 6f 6c 73 20 ic backup tools
1fa0: 61 6e 64 20 76 61 72 69 6f 75 73 20 65 78 70 6c and various expl
1fb0: 6f 72 65 72 0a 20 20 20 20 23 20 65 78 74 65 6e orer. # exten
1fc0: 73 69 6f 6e 73 20 74 68 61 74 20 6b 65 65 70 20 sions that keep
1fd0: 61 20 66 69 6c 65 20 6f 70 65 6e 20 61 20 6c 69 a file open a li
1fe0: 74 74 6c 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e ttle longer than
1ff0: 20 77 65 20 65 78 70 65 63 74 2c 20 63 61 75 73 we expect, caus
2000: 69 6e 67 0a 20 20 20 20 23 20 74 68 65 20 64 65 ing. # the de
2010: 6c 65 74 65 20 74 6f 20 66 61 69 6c 2e 0a 20 20 lete to fail..
2020: 20 20 23 0a 20 20 20 20 23 20 54 68 65 20 73 6f #. # The so
2030: 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 61 69 lution is to wai
2040: 74 20 61 20 73 68 6f 72 74 20 61 6d 6f 75 6e 74 t a short amount
2050: 20 6f 66 20 74 69 6d 65 20 62 65 66 6f 72 65 20 of time before
2060: 72 65 74 72 79 69 6e 67 20 74 68 65 0a 20 20 20 retrying the.
2070: 20 23 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 23 # delete.. #
2080: 0a 20 20 20 20 69 66 20 7b 24 6e 52 65 74 72 79 . if {$nRetry
2090: 20 3e 20 30 7d 20 7b 0a 20 20 20 20 20 20 66 6f > 0} {. fo
20a0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c r {set i 0} {$i<
20b0: 24 6e 52 65 74 72 79 7d 20 7b 69 6e 63 72 20 69 $nRetry} {incr i
20c0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 } {. set
20d0: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 rc [catch {.
20e0: 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 if {$force
20f0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
2100: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 file delete -for
2110: 63 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 ce $filename.
2120: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a } else {.
2130: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 file
2140: 20 64 65 6c 65 74 65 20 24 66 69 6c 65 6e 61 6d delete $filenam
2150: 65 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 e. }.
2160: 20 20 20 20 20 20 7d 20 6d 73 67 5d 0a 20 20 20 } msg].
2170: 20 20 20 20 20 69 66 20 7b 24 72 63 3d 3d 30 7d if {$rc==0}
2180: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20 20 69 break. i
2190: 66 20 7b 24 6e 44 65 6c 61 79 20 3e 20 30 7d 20 f {$nDelay > 0}
21a0: 7b 20 61 66 74 65 72 20 24 6e 44 65 6c 61 79 20 { after $nDelay
21b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }. }.
21c0: 69 66 20 7b 24 72 63 7d 20 7b 20 65 72 72 6f 72 if {$rc} { error
21d0: 20 24 6d 73 67 20 7d 0a 20 20 20 20 7d 20 65 6c $msg }. } el
21e0: 73 65 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 se {. if {$
21f0: 66 6f 72 63 65 7d 20 7b 0a 20 20 20 20 20 20 20 force} {.
2200: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f file delete -fo
2210: 72 63 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 rce $filename.
2220: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 } else {.
2230: 20 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 file delete
2240: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 $filename.
2250: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a }. }. }.}..
2260: 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 if {$::tcl_platf
2270: 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 65 71 orm(platform) eq
2280: 20 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 "windows"} {.
2290: 70 72 6f 63 20 64 6f 5f 72 65 6d 6f 76 65 5f 77 proc do_remove_w
22a0: 69 6e 33 32 5f 64 69 72 20 7b 61 72 67 73 7d 20 in32_dir {args}
22b0: 7b 0a 20 20 20 20 73 65 74 20 6e 52 65 74 72 79 {. set nRetry
22c0: 20 5b 67 65 74 46 69 6c 65 52 65 74 72 69 65 73 [getFileRetries
22d0: 5d 20 20 20 20 20 3b 23 20 4d 61 78 69 6d 75 6d ] ;# Maximum
22e0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 number of retri
22f0: 65 73 2e 0a 20 20 20 20 73 65 74 20 6e 44 65 6c es.. set nDel
2300: 61 79 20 5b 67 65 74 46 69 6c 65 52 65 74 72 79 ay [getFileRetry
2310: 44 65 6c 61 79 5d 20 20 3b 23 20 44 65 6c 61 79 Delay] ;# Delay
2320: 20 69 6e 20 6d 73 20 62 65 66 6f 72 65 20 72 65 in ms before re
2330: 74 72 79 69 6e 67 2e 0a 0a 20 20 20 20 66 6f 72 trying... for
2340: 65 61 63 68 20 64 69 72 4e 61 6d 65 20 24 61 72 each dirName $ar
2350: 67 73 20 7b 0a 20 20 20 20 20 20 23 20 4f 6e 20 gs {. # On
2360: 77 69 6e 64 6f 77 73 2c 20 73 6f 6d 65 74 69 6d windows, sometim
2370: 65 73 20 65 76 65 6e 20 61 20 5b 72 65 6d 6f 76 es even a [remov
2380: 65 5f 77 69 6e 33 32 5f 64 69 72 5d 20 63 61 6e e_win32_dir] can
2390: 20 66 61 69 6c 20 6a 75 73 74 20 61 66 74 65 72 fail just after
23a0: 0a 20 20 20 20 20 20 23 20 61 20 64 69 72 65 63 . # a direc
23b0: 74 6f 72 79 20 69 73 20 65 6d 70 74 69 65 64 2e tory is emptied.
23c0: 20 54 68 65 20 63 61 75 73 65 20 69 73 20 75 73 The cause is us
23d0: 75 61 6c 6c 79 20 22 74 61 67 2d 61 6c 6f 6e 67 ually "tag-along
23e0: 73 22 20 2d 20 70 72 6f 67 72 61 6d 73 0a 20 20 s" - programs.
23f0: 20 20 20 20 23 20 6c 69 6b 65 20 61 6e 74 69 2d # like anti-
2400: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2c 20 virus software,
2410: 61 75 74 6f 6d 61 74 69 63 20 62 61 63 6b 75 70 automatic backup
2420: 20 74 6f 6f 6c 73 20 61 6e 64 20 76 61 72 69 6f tools and vario
2430: 75 73 20 65 78 70 6c 6f 72 65 72 0a 20 20 20 20 us explorer.
2440: 20 20 23 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 # extensions t
2450: 68 61 74 20 6b 65 65 70 20 61 20 66 69 6c 65 20 hat keep a file
2460: 6f 70 65 6e 20 61 20 6c 69 74 74 6c 65 20 6c 6f open a little lo
2470: 6e 67 65 72 20 74 68 61 6e 20 77 65 20 65 78 70 nger than we exp
2480: 65 63 74 2c 0a 20 20 20 20 20 20 23 20 63 61 75 ect,. # cau
2490: 73 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65 20 sing the delete
24a0: 74 6f 20 66 61 69 6c 2e 0a 20 20 20 20 20 20 23 to fail.. #
24b0: 0a 20 20 20 20 20 20 23 20 54 68 65 20 73 6f 6c . # The sol
24c0: 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 61 69 74 ution is to wait
24d0: 20 61 20 73 68 6f 72 74 20 61 6d 6f 75 6e 74 20 a short amount
24e0: 6f 66 20 74 69 6d 65 20 62 65 66 6f 72 65 20 72 of time before r
24f0: 65 74 72 79 69 6e 67 20 74 68 65 0a 20 20 20 20 etrying the.
2500: 20 20 23 20 72 65 6d 6f 76 61 6c 2e 0a 20 20 20 # removal..
2510: 20 20 20 23 0a 20 20 20 20 20 20 69 66 20 7b 24 #. if {$
2520: 6e 52 65 74 72 79 20 3e 20 30 7d 20 7b 0a 20 20 nRetry > 0} {.
2530: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 for {set i
2540: 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 74 72 0} {$i < $nRetr
2550: 79 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 y} {incr i} {.
2560: 20 20 20 20 20 20 20 20 73 65 74 20 72 63 20 5b set rc [
2570: 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20 20 20 catch {.
2580: 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33 32 remove_win32
2590: 5f 64 69 72 20 24 64 69 72 4e 61 6d 65 0a 20 20 _dir $dirName.
25a0: 20 20 20 20 20 20 20 20 7d 20 6d 73 67 5d 0a 20 } msg].
25b0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 63 if {$rc
25c0: 20 3d 3d 20 30 7d 20 62 72 65 61 6b 0a 20 20 20 == 0} break.
25d0: 20 20 20 20 20 20 20 69 66 20 7b 24 6e 44 65 6c if {$nDel
25e0: 61 79 20 3e 20 30 7d 20 7b 20 61 66 74 65 72 20 ay > 0} { after
25f0: 24 6e 44 65 6c 61 79 20 7d 0a 20 20 20 20 20 20 $nDelay }.
2600: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 7b }. if {
2610: 24 72 63 7d 20 7b 20 65 72 72 6f 72 20 24 6d 73 $rc} { error $ms
2620: 67 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 g }. } else
2630: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 6d 6f 76 {. remov
2640: 65 5f 77 69 6e 33 32 5f 64 69 72 20 24 64 69 72 e_win32_dir $dir
2650: 4e 61 6d 65 0a 20 20 20 20 20 20 7d 0a 20 20 20 Name. }.
2660: 20 7d 0a 20 20 7d 0a 0a 20 20 70 72 6f 63 20 64 }. }.. proc d
2670: 6f 5f 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 o_delete_win32_f
2680: 69 6c 65 20 7b 61 72 67 73 7d 20 7b 0a 20 20 20 ile {args} {.
2690: 20 73 65 74 20 6e 52 65 74 72 79 20 5b 67 65 74 set nRetry [get
26a0: 46 69 6c 65 52 65 74 72 69 65 73 5d 20 20 20 20 FileRetries]
26b0: 20 3b 23 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 ;# Maximum numb
26c0: 65 72 20 6f 66 20 72 65 74 72 69 65 73 2e 0a 20 er of retries..
26d0: 20 20 20 73 65 74 20 6e 44 65 6c 61 79 20 5b 67 set nDelay [g
26e0: 65 74 46 69 6c 65 52 65 74 72 79 44 65 6c 61 79 etFileRetryDelay
26f0: 5d 20 20 3b 23 20 44 65 6c 61 79 20 69 6e 20 6d ] ;# Delay in m
2700: 73 20 62 65 66 6f 72 65 20 72 65 74 72 79 69 6e s before retryin
2710: 67 2e 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 g... foreach
2720: 66 69 6c 65 4e 61 6d 65 20 24 61 72 67 73 20 7b fileName $args {
2730: 0a 20 20 20 20 20 20 23 20 4f 6e 20 77 69 6e 64 . # On wind
2740: 6f 77 73 2c 20 73 6f 6d 65 74 69 6d 65 73 20 65 ows, sometimes e
2750: 76 65 6e 20 61 20 5b 64 65 6c 65 74 65 5f 77 69 ven a [delete_wi
2760: 6e 33 32 5f 66 69 6c 65 5d 20 63 61 6e 20 66 61 n32_file] can fa
2770: 69 6c 20 6a 75 73 74 20 61 66 74 65 72 0a 20 20 il just after.
2780: 20 20 20 20 23 20 61 20 66 69 6c 65 20 69 73 20 # a file is
2790: 63 6c 6f 73 65 64 2e 20 54 68 65 20 63 61 75 73 closed. The caus
27a0: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 22 74 61 e is usually "ta
27b0: 67 2d 61 6c 6f 6e 67 73 22 20 2d 20 70 72 6f 67 g-alongs" - prog
27c0: 72 61 6d 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 rams like.
27d0: 23 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 # anti-virus sof
27e0: 74 77 61 72 65 2c 20 61 75 74 6f 6d 61 74 69 63 tware, automatic
27f0: 20 62 61 63 6b 75 70 20 74 6f 6f 6c 73 20 61 6e backup tools an
2800: 64 20 76 61 72 69 6f 75 73 20 65 78 70 6c 6f 72 d various explor
2810: 65 72 0a 20 20 20 20 20 20 23 20 65 78 74 65 6e er. # exten
2820: 73 69 6f 6e 73 20 74 68 61 74 20 6b 65 65 70 20 sions that keep
2830: 61 20 66 69 6c 65 20 6f 70 65 6e 20 61 20 6c 69 a file open a li
2840: 74 74 6c 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e ttle longer than
2850: 20 77 65 20 65 78 70 65 63 74 2c 0a 20 20 20 20 we expect,.
2860: 20 20 23 20 63 61 75 73 69 6e 67 20 74 68 65 20 # causing the
2870: 64 65 6c 65 74 65 20 74 6f 20 66 61 69 6c 2e 0a delete to fail..
2880: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 23 20 #. #
2890: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 The solution is
28a0: 74 6f 20 77 61 69 74 20 61 20 73 68 6f 72 74 20 to wait a short
28b0: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 62 amount of time b
28c0: 65 66 6f 72 65 20 72 65 74 72 79 69 6e 67 20 74 efore retrying t
28d0: 68 65 0a 20 20 20 20 20 20 23 20 64 65 6c 65 74 he. # delet
28e0: 65 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 e.. #.
28f0: 20 69 66 20 7b 24 6e 52 65 74 72 79 20 3e 20 30 if {$nRetry > 0
2900: 7d 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 } {. for
2910: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 {set i 0} {$i <
2920: 24 6e 52 65 74 72 79 7d 20 7b 69 6e 63 72 20 69 $nRetry} {incr i
2930: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 } {. se
2940: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 t rc [catch {.
2950: 20 20 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 delete
2960: 5f 77 69 6e 33 32 5f 66 69 6c 65 20 24 66 69 6c _win32_file $fil
2970: 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 eName.
2980: 7d 20 6d 73 67 5d 0a 20 20 20 20 20 20 20 20 20 } msg].
2990: 20 69 66 20 7b 24 72 63 20 3d 3d 20 30 7d 20 62 if {$rc == 0} b
29a0: 72 65 61 6b 0a 20 20 20 20 20 20 20 20 20 20 69 reak. i
29b0: 66 20 7b 24 6e 44 65 6c 61 79 20 3e 20 30 7d 20 f {$nDelay > 0}
29c0: 7b 20 61 66 74 65 72 20 24 6e 44 65 6c 61 79 20 { after $nDelay
29d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
29e0: 20 20 20 20 69 66 20 7b 24 72 63 7d 20 7b 20 65 if {$rc} { e
29f0: 72 72 6f 72 20 24 6d 73 67 20 7d 0a 20 20 20 20 rror $msg }.
2a00: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 } else {.
2a10: 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f delete_win32_
2a20: 66 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0a 20 file $fileName.
2a30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d }. }. }
2a40: 0a 7d 0a 0a 70 72 6f 63 20 65 78 65 63 70 72 65 .}..proc execpre
2a50: 73 71 6c 20 7b 68 61 6e 64 6c 65 20 61 72 67 73 sql {handle args
2a60: 7d 20 7b 0a 20 20 74 72 61 63 65 20 72 65 6d 6f } {. trace remo
2a70: 76 65 20 65 78 65 63 75 74 69 6f 6e 20 24 68 61 ve execution $ha
2a80: 6e 64 6c 65 20 65 6e 74 65 72 20 5b 6c 69 73 74 ndle enter [list
2a90: 20 65 78 65 63 70 72 65 73 71 6c 20 24 68 61 6e execpresql $han
2aa0: 64 6c 65 5d 0a 20 20 69 66 20 7b 5b 69 6e 66 6f dle]. if {[info
2ab0: 20 65 78 69 73 74 73 20 3a 3a 47 28 70 65 72 6d exists ::G(perm
2ac0: 3a 70 72 65 73 71 6c 29 5d 7d 20 7b 0a 20 20 20 :presql)]} {.
2ad0: 20 24 68 61 6e 64 6c 65 20 65 76 61 6c 20 24 3a $handle eval $:
2ae0: 3a 47 28 70 65 72 6d 3a 70 72 65 73 71 6c 29 0a :G(perm:presql).
2af0: 20 20 7d 0a 7d 0a 0a 23 20 54 68 69 73 20 63 6f }.}..# This co
2b00: 6d 6d 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 mmand should be
2b10: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6c 6f 61 called after loa
2b20: 64 69 6e 67 20 74 65 73 74 65 72 2e 74 63 6c 20 ding tester.tcl
2b30: 66 72 6f 6d 20 77 69 74 68 69 6e 0a 23 20 61 6c from within.# al
2b40: 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 20 74 l test scripts t
2b50: 68 61 74 20 61 72 65 20 69 6e 63 6f 6d 70 61 74 hat are incompat
2b60: 69 62 6c 65 20 77 69 74 68 20 65 6e 63 72 79 70 ible with encryp
2b70: 74 69 6f 6e 20 63 6f 64 65 63 73 2e 0a 23 0a 70 tion codecs..#.p
2b80: 72 6f 63 20 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 roc do_not_use_c
2b90: 6f 64 65 63 20 7b 7d 20 7b 0a 20 20 73 65 74 20 odec {} {. set
2ba0: 3a 3a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 ::do_not_use_cod
2bb0: 65 63 20 31 0a 20 20 72 65 73 65 74 5f 64 62 0a ec 1. reset_db.
2bc0: 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 }..# The followi
2bd0: 6e 67 20 62 6c 6f 63 6b 20 6f 6e 6c 79 20 72 75 ng block only ru
2be0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d ns the first tim
2bf0: 65 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 e this file is s
2c00: 6f 75 72 63 65 64 2e 20 49 74 0a 23 20 64 6f 65 ourced. It.# doe
2c10: 73 20 6e 6f 74 20 72 75 6e 20 69 6e 20 73 6c 61 s not run in sla
2c20: 76 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 20 ve interpreters
2c30: 28 73 69 6e 63 65 20 74 68 65 20 3a 3a 63 6d 64 (since the ::cmd
2c40: 6c 69 6e 65 61 72 67 20 61 72 72 61 79 20 69 73 linearg array is
2c50: 0a 23 20 70 6f 70 75 6c 61 74 65 64 20 62 65 66 .# populated bef
2c60: 6f 72 65 20 74 68 65 20 74 65 73 74 20 73 63 72 ore the test scr
2c70: 69 70 74 20 69 73 20 72 75 6e 20 69 6e 20 73 6c ipt is run in sl
2c80: 61 76 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 ave interpreters
2c90: 29 2e 0a 23 0a 69 66 20 7b 5b 69 6e 66 6f 20 65 )..#.if {[info e
2ca0: 78 69 73 74 73 20 63 6d 64 6c 69 6e 65 61 72 67 xists cmdlinearg
2cb0: 5d 3d 3d 30 7d 20 7b 0a 0a 20 20 23 20 50 61 72 ]==0} {.. # Par
2cc0: 73 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 se any options s
2cd0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 pecified in the
2ce0: 24 61 72 67 76 20 61 72 72 61 79 2e 20 54 68 69 $argv array. Thi
2cf0: 73 20 73 63 72 69 70 74 20 61 63 63 65 70 74 73 s script accepts
2d00: 20 74 68 65 0a 20 20 23 20 66 6f 6c 6c 6f 77 69 the. # followi
2d10: 6e 67 20 6f 70 74 69 6f 6e 73 3a 0a 20 20 23 0a ng options:. #.
2d20: 20 20 23 20 20 20 2d 2d 70 61 75 73 65 0a 20 20 # --pause.
2d30: 23 20 20 20 2d 2d 73 6f 66 74 2d 68 65 61 70 2d # --soft-heap-
2d40: 6c 69 6d 69 74 3d 4e 4e 0a 20 20 23 20 20 20 2d limit=NN. # -
2d50: 2d 6d 61 78 65 72 72 6f 72 3d 4e 4e 0a 20 20 23 -maxerror=NN. #
2d60: 20 20 20 2d 2d 6d 61 6c 6c 6f 63 74 72 61 63 65 --malloctrace
2d70: 3d 4e 0a 20 20 23 20 20 20 2d 2d 62 61 63 6b 74 =N. # --backt
2d80: 72 61 63 65 3d 4e 0a 20 20 23 20 20 20 2d 2d 62 race=N. # --b
2d90: 69 6e 61 72 79 6c 6f 67 3d 4e 0a 20 20 23 20 20 inarylog=N. #
2da0: 20 2d 2d 73 6f 61 6b 3d 4e 0a 20 20 23 20 20 20 --soak=N. #
2db0: 2d 2d 66 69 6c 65 2d 72 65 74 72 69 65 73 3d 4e --file-retries=N
2dc0: 0a 20 20 23 20 20 20 2d 2d 66 69 6c 65 2d 72 65 . # --file-re
2dd0: 74 72 79 2d 64 65 6c 61 79 3d 4e 0a 20 20 23 20 try-delay=N. #
2de0: 20 20 2d 2d 73 74 61 72 74 3d 5b 24 70 65 72 6d --start=[$perm
2df0: 75 74 61 74 69 6f 6e 3a 5d 24 74 65 73 74 66 69 utation:]$testfi
2e00: 6c 65 0a 20 20 23 20 20 20 2d 2d 6d 61 74 63 68 le. # --match
2e10: 3d 24 70 61 74 74 65 72 6e 0a 20 20 23 20 20 20 =$pattern. #
2e20: 2d 2d 76 65 72 62 6f 73 65 3d 24 76 61 6c 0a 20 --verbose=$val.
2e30: 20 23 20 20 20 2d 2d 6f 75 74 70 75 74 3d 24 66 # --output=$f
2e40: 69 6c 65 6e 61 6d 65 0a 20 20 23 20 20 20 2d 2d ilename. # --
2e50: 68 65 6c 70 0a 20 20 23 0a 20 20 73 65 74 20 63 help. #. set c
2e60: 6d 64 6c 69 6e 65 61 72 67 28 73 6f 66 74 2d 68 mdlinearg(soft-h
2e70: 65 61 70 2d 6c 69 6d 69 74 29 20 20 20 20 30 0a eap-limit) 0.
2e80: 20 20 73 65 74 20 63 6d 64 6c 69 6e 65 61 72 67 set cmdlinearg
2e90: 28 6d 61 78 65 72 72 6f 72 29 20 20 20 20 20 20 (maxerror)
2ea0: 20 20 31 30 30 30 0a 20 20 73 65 74 20 63 6d 64 1000. set cmd
2eb0: 6c 69 6e 65 61 72 67 28 6d 61 6c 6c 6f 63 74 72 linearg(malloctr
2ec0: 61 63 65 29 20 20 20 20 20 20 20 20 30 0a 20 20 ace) 0.
2ed0: 73 65 74 20 63 6d 64 6c 69 6e 65 61 72 67 28 62 set cmdlinearg(b
2ee0: 61 63 6b 74 72 61 63 65 29 20 20 20 20 20 20 20 acktrace)
2ef0: 20 20 31 30 0a 20 20 73 65 74 20 63 6d 64 6c 69 10. set cmdli
2f00: 6e 65 61 72 67 28 62 69 6e 61 72 79 6c 6f 67 29 nearg(binarylog)
2f10: 20 20 20 20 20 20 20 20 20 20 30 0a 20 20 73 65 0. se
2f20: 74 20 63 6d 64 6c 69 6e 65 61 72 67 28 73 6f 61 t cmdlinearg(soa
2f30: 6b 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 k)
2f40: 20 30 0a 20 20 73 65 74 20 63 6d 64 6c 69 6e 65 0. set cmdline
2f50: 61 72 67 28 66 69 6c 65 2d 72 65 74 72 69 65 73 arg(file-retries
2f60: 29 20 20 20 20 20 20 20 30 0a 20 20 73 65 74 20 ) 0. set
2f70: 63 6d 64 6c 69 6e 65 61 72 67 28 66 69 6c 65 2d cmdlinearg(file-
2f80: 72 65 74 72 79 2d 64 65 6c 61 79 29 20 20 20 30 retry-delay) 0
2f90: 0a 20 20 73 65 74 20 63 6d 64 6c 69 6e 65 61 72 . set cmdlinear
2fa0: 67 28 73 74 61 72 74 29 20 20 20 20 20 20 20 20 g(start)
2fb0: 20 20 20 20 20 22 22 0a 20 20 73 65 74 20 63 6d "". set cm
2fc0: 64 6c 69 6e 65 61 72 67 28 6d 61 74 63 68 29 20 dlinearg(match)
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 22 0a 20 "".
2fe0: 20 73 65 74 20 63 6d 64 6c 69 6e 65 61 72 67 28 set cmdlinearg(
2ff0: 76 65 72 62 6f 73 65 29 20 20 20 20 20 20 20 20 verbose)
3000: 20 20 20 22 22 0a 20 20 73 65 74 20 63 6d 64 6c "". set cmdl
3010: 69 6e 65 61 72 67 28 6f 75 74 70 75 74 29 20 20 inearg(output)
3020: 20 20 20 20 20 20 20 20 20 20 22 22 0a 0a 20 20 ""..
3030: 73 65 74 20 6c 65 66 74 6f 76 65 72 20 5b 6c 69 set leftover [li
3040: 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 61 20 st]. foreach a
3050: 24 61 72 67 76 20 7b 0a 20 20 20 20 73 77 69 74 $argv {. swit
3060: 63 68 20 2d 72 65 67 65 78 70 20 2d 2d 20 24 61 ch -regexp -- $a
3070: 20 7b 0a 20 20 20 20 20 20 7b 5e 2d 2b 70 61 75 {. {^-+pau
3080: 73 65 24 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 se$} {. #
3090: 20 57 61 69 74 20 66 6f 72 20 75 73 65 72 20 69 Wait for user i
30a0: 6e 70 75 74 20 62 65 66 6f 72 65 20 63 6f 6e 74 nput before cont
30b0: 69 6e 75 69 6e 67 2e 20 54 68 69 73 20 69 73 20 inuing. This is
30c0: 74 6f 20 67 69 76 65 20 74 68 65 20 75 73 65 72 to give the user
30d0: 20 61 6e 0a 20 20 20 20 20 20 20 20 23 20 6f 70 an. # op
30e0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 63 6f 6e portunity to con
30f0: 6e 65 63 74 20 70 72 6f 66 69 6c 69 6e 67 20 74 nect profiling t
3100: 6f 6f 6c 73 20 74 6f 20 74 68 65 20 70 72 6f 63 ools to the proc
3110: 65 73 73 2e 0a 20 20 20 20 20 20 20 20 70 75 74 ess.. put
3120: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 50 72 s -nonewline "Pr
3130: 65 73 73 20 52 45 54 55 52 4e 20 74 6f 20 62 65 ess RETURN to be
3140: 67 69 6e 2e 2e 2e 22 0a 20 20 20 20 20 20 20 20 gin...".
3150: 66 6c 75 73 68 20 73 74 64 6f 75 74 0a 20 20 20 flush stdout.
3160: 20 20 20 20 20 67 65 74 73 20 73 74 64 69 6e 0a gets stdin.
3170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7b 5e }. {^
3180: 2d 2b 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d 69 -+soft-heap-limi
3190: 74 3d 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20 20 t=.+$} {.
31a0: 20 66 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79 20 foreach {dummy
31b0: 63 6d 64 6c 69 6e 65 61 72 67 28 73 6f 66 74 2d cmdlinearg(soft-
31c0: 68 65 61 70 2d 6c 69 6d 69 74 29 7d 20 5b 73 70 heap-limit)} [sp
31d0: 6c 69 74 20 24 61 20 3d 5d 20 62 72 65 61 6b 0a lit $a =] break.
31e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7b 5e }. {^
31f0: 2d 2b 6d 61 78 65 72 72 6f 72 3d 2e 2b 24 7d 20 -+maxerror=.+$}
3200: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 {. foreac
3210: 68 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 6e 65 h {dummy cmdline
3220: 61 72 67 28 6d 61 78 65 72 72 6f 72 29 7d 20 5b arg(maxerror)} [
3230: 73 70 6c 69 74 20 24 61 20 3d 5d 20 62 72 65 61 split $a =] brea
3240: 6b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 k. }.
3250: 7b 5e 2d 2b 6d 61 6c 6c 6f 63 74 72 61 63 65 3d {^-+malloctrace=
3260: 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20 20 20 66 .+$} {. f
3270: 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79 20 63 6d oreach {dummy cm
3280: 64 6c 69 6e 65 61 72 67 28 6d 61 6c 6c 6f 63 74 dlinearg(malloct
3290: 72 61 63 65 29 7d 20 5b 73 70 6c 69 74 20 24 61 race)} [split $a
32a0: 20 3d 5d 20 62 72 65 61 6b 0a 20 20 20 20 20 20 =] break.
32b0: 20 20 69 66 20 7b 24 63 6d 64 6c 69 6e 65 61 72 if {$cmdlinear
32c0: 67 28 6d 61 6c 6c 6f 63 74 72 61 63 65 29 7d 20 g(malloctrace)}
32d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 {. sqli
32e0: 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 te3_memdebug_log
32f0: 20 73 74 61 72 74 0a 20 20 20 20 20 20 20 20 7d start. }
3300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7b . }. {
3310: 5e 2d 2b 62 61 63 6b 74 72 61 63 65 3d 2e 2b 24 ^-+backtrace=.+$
3320: 7d 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 } {. fore
3330: 61 63 68 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 ach {dummy cmdli
3340: 6e 65 61 72 67 28 62 61 63 6b 74 72 61 63 65 29 nearg(backtrace)
3350: 7d 20 5b 73 70 6c 69 74 20 24 61 20 3d 5d 20 62 } [split $a =] b
3360: 72 65 61 6b 0a 20 20 20 20 20 20 20 20 73 71 6c reak. sql
3370: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 62 61 ite3_memdebug_ba
3380: 63 6b 74 72 61 63 65 20 24 76 61 6c 75 65 0a 20 cktrace $value.
3390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7b 5e 2d }. {^-
33a0: 2b 62 69 6e 61 72 79 6c 6f 67 3d 2e 2b 24 7d 20 +binarylog=.+$}
33b0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 {. foreac
33c0: 68 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 6e 65 h {dummy cmdline
33d0: 61 72 67 28 62 69 6e 61 72 79 6c 6f 67 29 7d 20 arg(binarylog)}
33e0: 5b 73 70 6c 69 74 20 24 61 20 3d 5d 20 62 72 65 [split $a =] bre
33f0: 61 6b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 ak. }.
3400: 20 7b 5e 2d 2b 73 6f 61 6b 3d 2e 2b 24 7d 20 7b {^-+soak=.+$} {
3410: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 . foreach
3420: 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 6e 65 61 {dummy cmdlinea
3430: 72 67 28 73 6f 61 6b 29 7d 20 5b 73 70 6c 69 74 rg(soak)} [split
3440: 20 24 61 20 3d 5d 20 62 72 65 61 6b 0a 20 20 20 $a =] break.
3450: 20 20 20 20 20 73 65 74 20 3a 3a 47 28 69 73 73 set ::G(iss
3460: 6f 61 6b 29 20 24 63 6d 64 6c 69 6e 65 61 72 67 oak) $cmdlinearg
3470: 28 73 6f 61 6b 29 0a 20 20 20 20 20 20 7d 0a 20 (soak). }.
3480: 20 20 20 20 20 7b 5e 2d 2b 66 69 6c 65 2d 72 65 {^-+file-re
3490: 74 72 69 65 73 3d 2e 2b 24 7d 20 7b 0a 20 20 20 tries=.+$} {.
34a0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b 64 75 foreach {du
34b0: 6d 6d 79 20 63 6d 64 6c 69 6e 65 61 72 67 28 66 mmy cmdlinearg(f
34c0: 69 6c 65 2d 72 65 74 72 69 65 73 29 7d 20 5b 73 ile-retries)} [s
34d0: 70 6c 69 74 20 24 61 20 3d 5d 20 62 72 65 61 6b plit $a =] break
34e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 47 . set ::G
34f0: 28 66 69 6c 65 2d 72 65 74 72 69 65 73 29 20 24 (file-retries) $
3500: 63 6d 64 6c 69 6e 65 61 72 67 28 66 69 6c 65 2d cmdlinearg(file-
3510: 72 65 74 72 69 65 73 29 0a 20 20 20 20 20 20 7d retries). }
3520: 0a 20 20 20 20 20 20 7b 5e 2d 2b 66 69 6c 65 2d . {^-+file-
3530: 72 65 74 72 79 2d 64 65 6c 61 79 3d 2e 2b 24 7d retry-delay=.+$}
3540: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 {. forea
3550: 63 68 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 6e ch {dummy cmdlin
3560: 65 61 72 67 28 66 69 6c 65 2d 72 65 74 72 79 2d earg(file-retry-
3570: 64 65 6c 61 79 29 7d 20 5b 73 70 6c 69 74 20 24 delay)} [split $
3580: 61 20 3d 5d 20 62 72 65 61 6b 0a 20 20 20 20 20 a =] break.
3590: 20 20 20 73 65 74 20 3a 3a 47 28 66 69 6c 65 2d set ::G(file-
35a0: 72 65 74 72 79 2d 64 65 6c 61 79 29 20 24 63 6d retry-delay) $cm
35b0: 64 6c 69 6e 65 61 72 67 28 66 69 6c 65 2d 72 65 dlinearg(file-re
35c0: 74 72 79 2d 64 65 6c 61 79 29 0a 20 20 20 20 20 try-delay).
35d0: 20 7d 0a 20 20 20 20 20 20 7b 5e 2d 2b 73 74 61 }. {^-+sta
35e0: 72 74 3d 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20 rt=.+$} {.
35f0: 20 20 66 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79 foreach {dummy
3600: 20 63 6d 64 6c 69 6e 65 61 72 67 28 73 74 61 72 cmdlinearg(star
3610: 74 29 7d 20 5b 73 70 6c 69 74 20 24 61 20 3d 5d t)} [split $a =]
3620: 20 62 72 65 61 6b 0a 0a 20 20 20 20 20 20 20 20 break..
3630: 73 65 74 20 3a 3a 47 28 73 74 61 72 74 3a 66 69 set ::G(start:fi
3640: 6c 65 29 20 24 63 6d 64 6c 69 6e 65 61 72 67 28 le) $cmdlinearg(
3650: 73 74 61 72 74 29 0a 20 20 20 20 20 20 20 20 69 start). i
3660: 66 20 7b 5b 72 65 67 65 78 70 20 7b 28 2e 2a 29 f {[regexp {(.*)
3670: 3a 28 2e 2a 29 7d 20 24 63 6d 64 6c 69 6e 65 61 :(.*)} $cmdlinea
3680: 72 67 28 73 74 61 72 74 29 20 2d 3e 20 73 2e 70 rg(start) -> s.p
3690: 65 72 6d 20 73 2e 66 69 6c 65 5d 7d 20 7b 0a 20 erm s.file]} {.
36a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 47 set ::G
36b0: 28 73 74 61 72 74 3a 70 65 72 6d 75 74 61 74 69 (start:permutati
36c0: 6f 6e 29 20 24 7b 73 2e 70 65 72 6d 7d 0a 20 20 on) ${s.perm}.
36d0: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 47 28 set ::G(
36e0: 73 74 61 72 74 3a 66 69 6c 65 29 20 20 20 20 20 start:file)
36f0: 20 20 20 24 7b 73 2e 66 69 6c 65 7d 0a 20 20 20 ${s.file}.
3700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
3710: 66 20 7b 24 3a 3a 47 28 73 74 61 72 74 3a 66 69 f {$::G(start:fi
3720: 6c 65 29 20 3d 3d 20 22 22 7d 20 7b 75 6e 73 65 le) == ""} {unse
3730: 74 20 3a 3a 47 28 73 74 61 72 74 3a 66 69 6c 65 t ::G(start:file
3740: 29 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 )}. }.
3750: 20 7b 5e 2d 2b 6d 61 74 63 68 3d 2e 2b 24 7d 20 {^-+match=.+$}
3760: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 {. foreac
3770: 68 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 6e 65 h {dummy cmdline
3780: 61 72 67 28 6d 61 74 63 68 29 7d 20 5b 73 70 6c arg(match)} [spl
3790: 69 74 20 24 61 20 3d 5d 20 62 72 65 61 6b 0a 0a it $a =] break..
37a0: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 47 28 set ::G(
37b0: 6d 61 74 63 68 29 20 24 63 6d 64 6c 69 6e 65 61 match) $cmdlinea
37c0: 72 67 28 6d 61 74 63 68 29 0a 20 20 20 20 20 20 rg(match).
37d0: 20 20 69 66 20 7b 24 3a 3a 47 28 6d 61 74 63 68 if {$::G(match
37e0: 29 20 3d 3d 20 22 22 7d 20 7b 75 6e 73 65 74 20 ) == ""} {unset
37f0: 3a 3a 47 28 6d 61 74 63 68 29 7d 0a 20 20 20 20 ::G(match)}.
3800: 20 20 7d 0a 0a 20 20 20 20 20 20 7b 5e 2d 2b 6f }.. {^-+o
3810: 75 74 70 75 74 3d 2e 2b 24 7d 20 7b 0a 20 20 20 utput=.+$} {.
3820: 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b 64 75 foreach {du
3830: 6d 6d 79 20 63 6d 64 6c 69 6e 65 61 72 67 28 6f mmy cmdlinearg(o
3840: 75 74 70 75 74 29 7d 20 5b 73 70 6c 69 74 20 24 utput)} [split $
3850: 61 20 3d 5d 20 62 72 65 61 6b 0a 20 20 20 20 20 a =] break.
3860: 20 20 20 69 66 20 7b 24 63 6d 64 6c 69 6e 65 61 if {$cmdlinea
3870: 72 67 28 76 65 72 62 6f 73 65 29 3d 3d 22 22 7d rg(verbose)==""}
3880: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 {. set
3890: 20 63 6d 64 6c 69 6e 65 61 72 67 28 76 65 72 62 cmdlinearg(verb
38a0: 6f 73 65 29 20 32 0a 20 20 20 20 20 20 20 20 7d ose) 2. }
38b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7b . }. {
38c0: 5e 2d 2b 76 65 72 62 6f 73 65 3d 2e 2b 24 7d 20 ^-+verbose=.+$}
38d0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 {. foreac
38e0: 68 20 7b 64 75 6d 6d 79 20 63 6d 64 6c 69 6e 65 h {dummy cmdline
38f0: 61 72 67 28 76 65 72 62 6f 73 65 29 7d 20 5b 73 arg(verbose)} [s
3900: 70 6c 69 74 20 24 61 20 3d 5d 20 62 72 65 61 6b plit $a =] break
3910: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6d . if {$cm
3920: 64 6c 69 6e 65 61 72 67 28 76 65 72 62 6f 73 65 dlinearg(verbose
3930: 29 3d 3d 22 66 69 6c 65 22 7d 20 7b 0a 20 20 20 )=="file"} {.
3940: 20 20 20 20 20 20 20 73 65 74 20 63 6d 64 6c 69 set cmdli
3950: 6e 65 61 72 67 28 76 65 72 62 6f 73 65 29 20 32 nearg(verbose) 2
3960: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 . } elsei
3970: 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 62 6f f {[string is bo
3980: 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20 24 63 olean -strict $c
3990: 6d 64 6c 69 6e 65 61 72 67 28 76 65 72 62 6f 73 mdlinearg(verbos
39a0: 65 29 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 e)]==0} {.
39b0: 20 20 20 20 65 72 72 6f 72 20 22 6f 70 74 69 6f error "optio
39c0: 6e 20 2d 2d 76 65 72 62 6f 73 65 3d 20 6d 75 73 n --verbose= mus
39d0: 74 20 62 65 20 73 65 74 20 74 6f 20 61 20 62 6f t be set to a bo
39e0: 6f 6c 65 61 6e 20 6f 72 20 74 6f 20 5c 22 66 69 olean or to \"fi
39f0: 6c 65 5c 22 22 0a 20 20 20 20 20 20 20 20 7d 0a le\"". }.
3a00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 }.. d
3a10: 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 efault {.
3a20: 20 6c 61 70 70 65 6e 64 20 6c 65 66 74 6f 76 65 lappend leftove
3a30: 72 20 24 61 0a 20 20 20 20 20 20 7d 0a 20 20 20 r $a. }.
3a40: 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 61 72 67 }. }. set arg
3a50: 76 20 24 6c 65 66 74 6f 76 65 72 0a 0a 20 20 23 v $leftover.. #
3a60: 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 6d 61 6c Install the mal
3a70: 6c 6f 63 20 6c 61 79 65 72 20 75 73 65 64 20 74 loc layer used t
3a80: 6f 20 69 6e 6a 65 63 74 20 4f 4f 4d 20 65 72 72 o inject OOM err
3a90: 6f 72 73 2e 20 41 6e 64 20 74 68 65 20 27 61 75 ors. And the 'au
3aa0: 74 6f 6d 61 74 69 63 27 0a 20 20 23 20 65 78 74 tomatic'. # ext
3ab0: 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20 6f 6e ensions. This on
3ac0: 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 ly needs to be d
3ad0: 6f 6e 65 20 6f 6e 63 65 20 66 6f 72 20 74 68 65 one once for the
3ae0: 20 70 72 6f 63 65 73 73 2e 0a 20 20 23 0a 20 20 process.. #.
3af0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e sqlite3_shutdown
3b00: 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 61 6c 6c 6f . install_mallo
3b10: 63 5f 66 61 75 6c 74 73 69 6d 20 31 0a 20 20 73 c_faultsim 1. s
3b20: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a qlite3_initializ
3b30: 65 0a 20 20 61 75 74 6f 69 6e 73 74 61 6c 6c 5f e. autoinstall_
3b40: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 73 0a 0a test_functions..
3b50: 20 20 23 20 49 66 20 74 68 65 20 2d 2d 62 69 6e # If the --bin
3b60: 61 72 79 6c 6f 67 20 6f 70 74 69 6f 6e 20 77 61 arylog option wa
3b70: 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 72 65 s specified, cre
3b80: 61 74 65 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 ate the logging
3b90: 56 46 53 2e 20 54 68 69 73 0a 20 20 23 20 63 61 VFS. This. # ca
3ba0: 6c 6c 20 69 6e 73 74 61 6c 6c 73 20 74 68 65 20 ll installs the
3bb0: 6e 65 77 20 56 46 53 20 61 73 20 74 68 65 20 64 new VFS as the d
3bc0: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 6c 20 53 efault for all S
3bd0: 51 4c 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e QLite connection
3be0: 73 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 63 6d s.. #. if {$cm
3bf0: 64 6c 69 6e 65 61 72 67 28 62 69 6e 61 72 79 6c dlinearg(binaryl
3c00: 6f 67 29 7d 20 7b 0a 20 20 20 20 76 66 73 6c 6f og)} {. vfslo
3c10: 67 20 6e 65 77 20 62 69 6e 61 72 79 6c 6f 67 20 g new binarylog
3c20: 7b 7d 20 76 66 73 6c 6f 67 2e 62 69 6e 0a 20 20 {} vfslog.bin.
3c30: 7d 0a 0a 20 20 23 20 53 65 74 20 74 68 65 20 62 }.. # Set the b
3c40: 61 63 6b 74 72 61 63 65 20 64 65 70 74 68 2c 20 acktrace depth,
3c50: 69 66 20 6d 61 6c 6c 6f 63 20 74 72 61 63 69 6e if malloc tracin
3c60: 67 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 g is enabled..
3c70: 23 0a 20 20 69 66 20 7b 24 63 6d 64 6c 69 6e 65 #. if {$cmdline
3c80: 61 72 67 28 6d 61 6c 6c 6f 63 74 72 61 63 65 29 arg(malloctrace)
3c90: 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f } {. sqlite3_
3ca0: 6d 65 6d 64 65 62 75 67 5f 62 61 63 6b 74 72 61 memdebug_backtra
3cb0: 63 65 20 24 63 6d 64 6c 69 6e 65 61 72 67 28 62 ce $cmdlinearg(b
3cc0: 61 63 6b 74 72 61 63 65 29 0a 20 20 7d 0a 0a 20 acktrace). }..
3cd0: 20 69 66 20 7b 24 63 6d 64 6c 69 6e 65 61 72 67 if {$cmdlinearg
3ce0: 28 6f 75 74 70 75 74 29 21 3d 22 22 7d 20 7b 0a (output)!=""} {.
3cf0: 20 20 20 20 70 75 74 73 20 22 43 6f 70 79 69 6e puts "Copyin
3d00: 67 20 6f 75 74 70 75 74 20 74 6f 20 66 69 6c 65 g output to file
3d10: 20 24 63 6d 64 6c 69 6e 65 61 72 67 28 6f 75 74 $cmdlinearg(out
3d20: 70 75 74 29 22 0a 20 20 20 20 73 65 74 20 3a 3a put)". set ::
3d30: 47 28 6f 75 74 70 75 74 5f 66 64 29 20 5b 6f 70 G(output_fd) [op
3d40: 65 6e 20 24 63 6d 64 6c 69 6e 65 61 72 67 28 6f en $cmdlinearg(o
3d50: 75 74 70 75 74 29 20 77 5d 0a 20 20 20 20 66 63 utput) w]. fc
3d60: 6f 6e 66 69 67 75 72 65 20 24 3a 3a 47 28 6f 75 onfigure $::G(ou
3d70: 74 70 75 74 5f 66 64 29 20 2d 62 75 66 66 65 72 tput_fd) -buffer
3d80: 69 6e 67 20 6c 69 6e 65 0a 20 20 7d 0a 0a 20 20 ing line. }..
3d90: 69 66 20 7b 24 63 6d 64 6c 69 6e 65 61 72 67 28 if {$cmdlinearg(
3da0: 76 65 72 62 6f 73 65 29 3d 3d 22 22 7d 20 7b 0a verbose)==""} {.
3db0: 20 20 20 20 73 65 74 20 63 6d 64 6c 69 6e 65 61 set cmdlinea
3dc0: 72 67 28 76 65 72 62 6f 73 65 29 20 31 0a 20 20 rg(verbose) 1.
3dd0: 7d 0a 7d 0a 0a 23 20 55 70 64 61 74 65 20 74 68 }.}..# Update th
3de0: 65 20 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d 69 e soft-heap-limi
3df0: 74 20 65 61 63 68 20 74 69 6d 65 20 74 68 69 73 t each time this
3e00: 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 20 script is run.
3e10: 49 6e 20 74 68 61 74 0a 23 20 77 61 79 20 69 66 In that.# way if
3e20: 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 74 an individual t
3e30: 65 73 74 20 66 69 6c 65 20 63 68 61 6e 67 65 73 est file changes
3e40: 20 74 68 65 20 73 6f 66 74 2d 68 65 61 70 2d 6c the soft-heap-l
3e50: 69 6d 69 74 2c 20 69 74 0a 23 20 77 69 6c 6c 20 imit, it.# will
3e60: 62 65 20 72 65 73 65 74 20 61 74 20 74 68 65 20 be reset at the
3e70: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 start of the nex
3e80: 74 20 74 65 73 74 20 66 69 6c 65 2e 0a 23 0a 73 t test file..#.s
3e90: 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 qlite3_soft_heap
3ea0: 5f 6c 69 6d 69 74 20 24 63 6d 64 6c 69 6e 65 61 _limit $cmdlinea
3eb0: 72 67 28 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d rg(soft-heap-lim
3ec0: 69 74 29 0a 0a 23 20 43 72 65 61 74 65 20 61 20 it)..# Create a
3ed0: 74 65 73 74 20 64 61 74 61 62 61 73 65 0a 23 0a test database.#.
3ee0: 70 72 6f 63 20 72 65 73 65 74 5f 64 62 20 7b 7d proc reset_db {}
3ef0: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 {. catch {db c
3f00: 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65 64 65 6c lose}. forcedel
3f10: 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 66 6f ete test.db. fo
3f20: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 rcedelete test.d
3f30: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66 6f 72 63 b-journal. forc
3f40: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 2d edelete test.db-
3f50: 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 wal. sqlite3 db
3f60: 20 2e 2f 74 65 73 74 2e 64 62 0a 20 20 73 65 74 ./test.db. set
3f70: 20 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33 5f 63 ::DB [sqlite3_c
3f80: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 onnection_pointe
3f90: 72 20 64 62 5d 0a 20 20 69 66 20 7b 5b 69 6e 66 r db]. if {[inf
3fa0: 6f 20 65 78 69 73 74 73 20 3a 3a 53 45 54 55 50 o exists ::SETUP
3fb0: 5f 53 51 4c 5d 7d 20 7b 0a 20 20 20 20 64 62 20 _SQL]} {. db
3fc0: 65 76 61 6c 20 24 3a 3a 53 45 54 55 50 5f 53 51 eval $::SETUP_SQ
3fd0: 4c 0a 20 20 7d 0a 7d 0a 72 65 73 65 74 5f 64 62 L. }.}.reset_db
3fe0: 0a 0a 23 20 41 62 6f 72 74 20 65 61 72 6c 79 20 ..# Abort early
3ff0: 69 66 20 74 68 69 73 20 73 63 72 69 70 74 20 68 if this script h
4000: 61 73 20 62 65 65 6e 20 72 75 6e 20 62 65 66 6f as been run befo
4010: 72 65 2e 0a 23 0a 69 66 20 7b 5b 69 6e 66 6f 20 re..#.if {[info
4020: 65 78 69 73 74 73 20 54 43 28 63 6f 75 6e 74 29 exists TC(count)
4030: 5d 7d 20 72 65 74 75 72 6e 0a 0a 23 20 4d 61 6b ]} return..# Mak
4040: 65 20 73 75 72 65 20 6d 65 6d 6f 72 79 20 73 74 e sure memory st
4050: 61 74 69 73 74 69 63 73 20 61 72 65 20 65 6e 61 atistics are ena
4060: 62 6c 65 64 2e 0a 23 0a 73 71 6c 69 74 65 33 5f bled..#.sqlite3_
4070: 63 6f 6e 66 69 67 5f 6d 65 6d 73 74 61 74 75 73 config_memstatus
4080: 20 31 0a 0a 23 20 49 6e 69 74 69 61 6c 69 7a 65 1..# Initialize
4090: 20 74 68 65 20 74 65 73 74 20 63 6f 75 6e 74 65 the test counte
40a0: 72 73 20 61 6e 64 20 73 65 74 20 75 70 20 63 6f rs and set up co
40b0: 6d 6d 61 6e 64 73 20 74 6f 20 61 63 63 65 73 73 mmands to access
40c0: 20 74 68 65 6d 2e 0a 23 20 4f 72 2c 20 69 66 20 them..# Or, if
40d0: 74 68 69 73 20 69 73 20 61 20 73 6c 61 76 65 20 this is a slave
40e0: 69 6e 74 65 72 70 72 65 74 65 72 2c 20 73 65 74 interpreter, set
40f0: 20 75 70 20 61 6c 69 61 73 65 73 20 74 6f 20 77 up aliases to w
4100: 72 69 74 65 20 74 68 65 0a 23 20 63 6f 75 6e 74 rite the.# count
4110: 65 72 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e ers in the paren
4120: 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 23 t interpreter..#
4130: 0a 69 66 20 7b 30 3d 3d 5b 69 6e 66 6f 20 65 78 .if {0==[info ex
4140: 69 73 74 73 20 3a 3a 53 4c 41 56 45 5d 7d 20 7b ists ::SLAVE]} {
4150: 0a 20 20 73 65 74 20 54 43 28 65 72 72 6f 72 73 . set TC(errors
4160: 29 20 20 20 20 30 0a 20 20 73 65 74 20 54 43 28 ) 0. set TC(
4170: 63 6f 75 6e 74 29 20 20 20 20 20 30 0a 20 20 73 count) 0. s
4180: 65 74 20 54 43 28 66 61 69 6c 5f 6c 69 73 74 29 et TC(fail_list)
4190: 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74 20 54 43 [list]. set TC
41a0: 28 6f 6d 69 74 5f 6c 69 73 74 29 20 5b 6c 69 73 (omit_list) [lis
41b0: 74 5d 0a 20 20 73 65 74 20 54 43 28 77 61 72 6e t]. set TC(warn
41c0: 5f 6c 69 73 74 29 20 5b 6c 69 73 74 5d 0a 0a 20 _list) [list]..
41d0: 20 70 72 6f 63 20 73 65 74 5f 74 65 73 74 5f 63 proc set_test_c
41e0: 6f 75 6e 74 65 72 20 7b 63 6f 75 6e 74 65 72 20 ounter {counter
41f0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b args} {. if {
4200: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 7d [llength $args]}
4210: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 54 {. set ::T
4220: 43 28 24 63 6f 75 6e 74 65 72 29 20 5b 6c 69 6e C($counter) [lin
4230: 64 65 78 20 24 61 72 67 73 20 30 5d 0a 20 20 20 dex $args 0].
4240: 20 7d 0a 20 20 20 20 73 65 74 20 3a 3a 54 43 28 }. set ::TC(
4250: 24 63 6f 75 6e 74 65 72 29 0a 20 20 7d 0a 7d 0a $counter). }.}.
4260: 0a 23 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 .# Record the fa
4270: 63 74 20 74 68 61 74 20 61 20 73 65 71 75 65 6e ct that a sequen
4280: 63 65 20 6f 66 20 74 65 73 74 73 20 77 65 72 65 ce of tests were
4290: 20 6f 6d 69 74 74 65 64 2e 0a 23 0a 70 72 6f 63 omitted..#.proc
42a0: 20 6f 6d 69 74 5f 74 65 73 74 20 7b 6e 61 6d 65 omit_test {name
42b0: 20 72 65 61 73 6f 6e 20 7b 61 70 70 65 6e 64 20 reason {append
42c0: 31 7d 7d 20 7b 0a 20 20 73 65 74 20 6f 6d 69 74 1}} {. set omit
42d0: 4c 69 73 74 20 5b 73 65 74 5f 74 65 73 74 5f 63 List [set_test_c
42e0: 6f 75 6e 74 65 72 20 6f 6d 69 74 5f 6c 69 73 74 ounter omit_list
42f0: 5d 0a 20 20 69 66 20 7b 24 61 70 70 65 6e 64 7d ]. if {$append}
4300: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6f {. lappend o
4310: 6d 69 74 4c 69 73 74 20 5b 6c 69 73 74 20 24 6e mitList [list $n
4320: 61 6d 65 20 24 72 65 61 73 6f 6e 5d 0a 20 20 7d ame $reason]. }
4330: 0a 20 20 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e . set_test_coun
4340: 74 65 72 20 6f 6d 69 74 5f 6c 69 73 74 20 24 6f ter omit_list $o
4350: 6d 69 74 4c 69 73 74 0a 7d 0a 0a 23 20 52 65 63 mitList.}..# Rec
4360: 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 ord the fact tha
4370: 74 20 61 20 74 65 73 74 20 66 61 69 6c 65 64 2e t a test failed.
4380: 0a 23 0a 70 72 6f 63 20 66 61 69 6c 5f 74 65 73 .#.proc fail_tes
4390: 74 20 7b 6e 61 6d 65 7d 20 7b 0a 20 20 73 65 74 t {name} {. set
43a0: 20 66 20 5b 73 65 74 5f 74 65 73 74 5f 63 6f 75 f [set_test_cou
43b0: 6e 74 65 72 20 66 61 69 6c 5f 6c 69 73 74 5d 0a nter fail_list].
43c0: 20 20 6c 61 70 70 65 6e 64 20 66 20 24 6e 61 6d lappend f $nam
43d0: 65 0a 20 20 73 65 74 5f 74 65 73 74 5f 63 6f 75 e. set_test_cou
43e0: 6e 74 65 72 20 66 61 69 6c 5f 6c 69 73 74 20 24 nter fail_list $
43f0: 66 0a 20 20 73 65 74 5f 74 65 73 74 5f 63 6f 75 f. set_test_cou
4400: 6e 74 65 72 20 65 72 72 6f 72 73 20 5b 65 78 70 nter errors [exp
4410: 72 20 5b 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e r [set_test_coun
4420: 74 65 72 20 65 72 72 6f 72 73 5d 20 2b 20 31 5d ter errors] + 1]
4430: 0a 0a 20 20 73 65 74 20 6e 46 61 69 6c 20 5b 73 .. set nFail [s
4440: 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 et_test_counter
4450: 65 72 72 6f 72 73 5d 0a 20 20 69 66 20 7b 24 6e errors]. if {$n
4460: 46 61 69 6c 3e 3d 24 3a 3a 63 6d 64 6c 69 6e 65 Fail>=$::cmdline
4470: 61 72 67 28 6d 61 78 65 72 72 6f 72 29 7d 20 7b arg(maxerror)} {
4480: 0a 20 20 20 20 6f 75 74 70 75 74 32 20 22 2a 2a . output2 "**
4490: 2a 20 47 69 76 69 6e 67 20 75 70 2e 2e 2e 22 0a * Giving up...".
44a0: 20 20 20 20 66 69 6e 61 6c 69 7a 65 5f 74 65 73 finalize_tes
44b0: 74 69 6e 67 0a 20 20 7d 0a 7d 0a 0a 23 20 52 65 ting. }.}..# Re
44c0: 6d 65 6d 62 65 72 20 61 20 77 61 72 6e 69 6e 67 member a warning
44d0: 20 6d 65 73 73 61 67 65 20 74 6f 20 62 65 20 64 message to be d
44e0: 69 73 70 6c 61 79 65 64 20 61 74 20 74 68 65 20 isplayed at the
44f0: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 6c conclusion of al
4500: 6c 20 74 65 73 74 69 6e 67 0a 23 0a 70 72 6f 63 l testing.#.proc
4510: 20 77 61 72 6e 69 6e 67 20 7b 6d 73 67 20 7b 61 warning {msg {a
4520: 70 70 65 6e 64 20 31 7d 7d 20 7b 0a 20 20 6f 75 ppend 1}} {. ou
4530: 74 70 75 74 32 20 22 57 61 72 6e 69 6e 67 3a 20 tput2 "Warning:
4540: 24 6d 73 67 22 0a 20 20 73 65 74 20 77 61 72 6e $msg". set warn
4550: 4c 69 73 74 20 5b 73 65 74 5f 74 65 73 74 5f 63 List [set_test_c
4560: 6f 75 6e 74 65 72 20 77 61 72 6e 5f 6c 69 73 74 ounter warn_list
4570: 5d 0a 20 20 69 66 20 7b 24 61 70 70 65 6e 64 7d ]. if {$append}
4580: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 77 {. lappend w
4590: 61 72 6e 4c 69 73 74 20 24 6d 73 67 0a 20 20 7d arnList $msg. }
45a0: 0a 20 20 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e . set_test_coun
45b0: 74 65 72 20 77 61 72 6e 5f 6c 69 73 74 20 24 77 ter warn_list $w
45c0: 61 72 6e 4c 69 73 74 0a 7d 0a 0a 0a 23 20 49 6e arnList.}...# In
45d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 75 6d 62 crement the numb
45e0: 65 72 20 6f 66 20 74 65 73 74 73 20 72 75 6e 0a er of tests run.
45f0: 23 0a 70 72 6f 63 20 69 6e 63 72 5f 6e 74 65 73 #.proc incr_ntes
4600: 74 20 7b 7d 20 7b 0a 20 20 73 65 74 5f 74 65 73 t {} {. set_tes
4610: 74 5f 63 6f 75 6e 74 65 72 20 63 6f 75 6e 74 20 t_counter count
4620: 5b 65 78 70 72 20 5b 73 65 74 5f 74 65 73 74 5f [expr [set_test_
4630: 63 6f 75 6e 74 65 72 20 63 6f 75 6e 74 5d 20 2b counter count] +
4640: 20 31 5d 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 20 1].}..# Return
4650: 74 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 true if --verbos
4660: 65 3d 31 20 77 61 73 20 73 70 65 63 69 66 69 65 e=1 was specifie
4670: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 d on the command
4680: 20 6c 69 6e 65 2e 20 4f 74 68 65 72 77 69 73 65 line. Otherwise
4690: 2c 0a 23 20 72 65 74 75 72 6e 20 66 61 6c 73 65 ,.# return false
46a0: 2e 0a 23 0a 70 72 6f 63 20 76 65 72 62 6f 73 65 ..#.proc verbose
46b0: 20 7b 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20 24 {} {. return $
46c0: 3a 3a 63 6d 64 6c 69 6e 65 61 72 67 28 76 65 72 ::cmdlinearg(ver
46d0: 62 6f 73 65 29 0a 7d 0a 0a 23 20 55 73 65 20 74 bose).}..# Use t
46e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d he following com
46f0: 6d 61 6e 64 73 20 69 6e 73 74 65 61 64 20 6f 66 mands instead of
4700: 20 5b 70 75 74 73 5d 20 66 6f 72 20 74 65 73 74 [puts] for test
4710: 20 6f 75 74 70 75 74 20 77 69 74 68 69 6e 0a 23 output within.#
4720: 20 74 68 69 73 20 66 69 6c 65 2e 20 54 65 73 74 this file. Test
4730: 20 73 63 72 69 70 74 73 20 63 61 6e 20 73 74 69 scripts can sti
4740: 6c 6c 20 75 73 65 20 72 65 67 75 6c 61 72 20 5b ll use regular [
4750: 70 75 74 73 5d 2c 20 77 68 69 63 68 20 69 73 20 puts], which is
4760: 64 69 72 65 63 74 65 64 0a 23 20 74 6f 20 73 74 directed.# to st
4770: 64 6f 75 74 20 61 6e 64 2c 20 69 66 20 6f 6e 65 dout and, if one
4780: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 2d 2d is open, the --
4790: 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a 23 0a 23 output file..#.#
47a0: 20 6f 75 74 70 75 74 31 3a 20 6f 75 74 70 75 74 output1: output
47b0: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 that should be
47c0: 70 72 69 6e 74 65 64 20 69 66 20 2d 2d 76 65 72 printed if --ver
47d0: 62 6f 73 65 3d 31 20 77 61 73 20 73 70 65 63 69 bose=1 was speci
47e0: 66 69 65 64 2e 0a 23 20 6f 75 74 70 75 74 32 3a fied..# output2:
47f0: 20 6f 75 74 70 75 74 20 74 68 61 74 20 73 68 6f output that sho
4800: 75 6c 64 20 62 65 20 70 72 69 6e 74 65 64 20 75 uld be printed u
4810: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a nconditionally..
4820: 23 20 6f 75 74 70 75 74 32 5f 69 66 5f 6e 6f 5f # output2_if_no_
4830: 76 65 72 62 6f 73 65 3a 20 6f 75 74 70 75 74 20 verbose: output
4840: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 70 that should be p
4850: 72 69 6e 74 65 64 20 6f 6e 6c 79 20 69 66 20 2d rinted only if -
4860: 2d 76 65 72 62 6f 73 65 3d 30 2e 0a 23 0a 70 72 -verbose=0..#.pr
4870: 6f 63 20 6f 75 74 70 75 74 31 20 7b 61 72 67 73 oc output1 {args
4880: 7d 20 7b 0a 20 20 73 65 74 20 76 20 5b 76 65 72 } {. set v [ver
4890: 62 6f 73 65 5d 0a 20 20 69 66 20 7b 24 76 3d 3d bose]. if {$v==
48a0: 31 7d 20 7b 0a 20 20 20 20 75 70 6c 65 76 65 6c 1} {. uplevel
48b0: 20 6f 75 74 70 75 74 32 20 24 61 72 67 73 0a 20 output2 $args.
48c0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 76 3d 3d 32 } elseif {$v==2
48d0: 7d 20 7b 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 } {. uplevel
48e0: 70 75 74 73 20 5b 6c 72 61 6e 67 65 20 24 61 72 puts [lrange $ar
48f0: 67 73 20 30 20 65 6e 64 2d 31 5d 20 24 3a 3a 47 gs 0 end-1] $::G
4900: 28 6f 75 74 70 75 74 5f 66 64 29 20 5b 6c 72 61 (output_fd) [lra
4910: 6e 67 65 20 24 61 72 67 73 20 65 6e 64 20 65 6e nge $args end en
4920: 64 5d 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 6f 75 d]. }.}.proc ou
4930: 74 70 75 74 32 20 7b 61 72 67 73 7d 20 7b 0a 20 tput2 {args} {.
4940: 20 73 65 74 20 6e 41 72 67 20 5b 6c 6c 65 6e 67 set nArg [lleng
4950: 74 68 20 24 61 72 67 73 5d 0a 20 20 75 70 6c 65 th $args]. uple
4960: 76 65 6c 20 70 75 74 73 20 24 61 72 67 73 0a 7d vel puts $args.}
4970: 0a 70 72 6f 63 20 6f 75 74 70 75 74 32 5f 69 66 .proc output2_if
4980: 5f 6e 6f 5f 76 65 72 62 6f 73 65 20 7b 61 72 67 _no_verbose {arg
4990: 73 7d 20 7b 0a 20 20 73 65 74 20 76 20 5b 76 65 s} {. set v [ve
49a0: 72 62 6f 73 65 5d 0a 20 20 69 66 20 7b 24 76 3d rbose]. if {$v=
49b0: 3d 30 7d 20 7b 0a 20 20 20 20 75 70 6c 65 76 65 =0} {. upleve
49c0: 6c 20 6f 75 74 70 75 74 32 20 24 61 72 67 73 0a l output2 $args.
49d0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 76 3d 3d } elseif {$v==
49e0: 32 7d 20 7b 0a 20 20 20 20 75 70 6c 65 76 65 6c 2} {. uplevel
49f0: 20 70 75 74 73 20 5b 6c 72 61 6e 67 65 20 24 61 puts [lrange $a
4a00: 72 67 73 20 30 20 65 6e 64 2d 31 5d 20 73 74 64 rgs 0 end-1] std
4a10: 6f 75 74 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 out [lrange $arg
4a20: 73 20 65 6e 64 20 65 6e 64 5d 0a 20 20 7d 0a 7d s end end]. }.}
4a30: 0a 0a 23 20 4f 76 65 72 72 69 64 65 20 74 68 65 ..# Override the
4a40: 20 5b 70 75 74 73 5d 20 63 6f 6d 6d 61 6e 64 20 [puts] command
4a50: 73 6f 20 74 68 61 74 20 69 66 20 6e 6f 20 63 68 so that if no ch
4a60: 61 6e 6e 65 6c 20 69 73 20 65 78 70 6c 69 63 69 annel is explici
4a70: 74 6c 79 20 0a 23 20 73 70 65 63 69 66 69 65 64 tly .# specified
4a80: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 77 the string is w
4a90: 72 69 74 74 65 6e 20 74 6f 20 62 6f 74 68 20 73 ritten to both s
4aa0: 74 64 6f 75 74 20 61 6e 64 20 74 6f 20 74 68 65 tdout and to the
4ab0: 20 66 69 6c 65 20 0a 23 20 73 70 65 63 69 66 69 file .# specifi
4ac0: 65 64 20 62 79 20 22 2d 2d 6f 75 74 70 75 74 3d ed by "--output=
4ad0: 22 2c 20 69 66 20 61 6e 79 2e 0a 23 0a 70 72 6f ", if any..#.pro
4ae0: 63 20 70 75 74 73 5f 6f 76 65 72 72 69 64 65 20 c puts_override
4af0: 7b 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 6e {args} {. set n
4b00: 41 72 67 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 Arg [llength $ar
4b10: 67 73 5d 0a 20 20 69 66 20 7b 24 6e 41 72 67 3d gs]. if {$nArg=
4b20: 3d 31 20 7c 7c 20 28 24 6e 41 72 67 3d 3d 32 20 =1 || ($nArg==2
4b30: 26 26 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74 && [string first
4b40: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 [lindex $args 0
4b50: 5d 20 2d 6e 6f 6e 65 77 6c 69 6e 65 5d 3d 3d 30 ] -nonewline]==0
4b60: 29 7d 20 7b 0a 20 20 20 20 75 70 6c 65 76 65 6c )} {. uplevel
4b70: 20 70 75 74 73 5f 6f 72 69 67 69 6e 61 6c 20 24 puts_original $
4b80: 61 72 67 73 0a 20 20 20 20 69 66 20 7b 5b 69 6e args. if {[in
4b90: 66 6f 20 65 78 69 73 74 73 20 3a 3a 47 28 6f 75 fo exists ::G(ou
4ba0: 74 70 75 74 5f 66 64 29 5d 7d 20 7b 0a 20 20 20 tput_fd)]} {.
4bb0: 20 20 20 75 70 6c 65 76 65 6c 20 70 75 74 73 20 uplevel puts
4bc0: 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 20 30 20 [lrange $args 0
4bd0: 65 6e 64 2d 31 5d 20 24 3a 3a 47 28 6f 75 74 70 end-1] $::G(outp
4be0: 75 74 5f 66 64 29 20 5b 6c 72 61 6e 67 65 20 24 ut_fd) [lrange $
4bf0: 61 72 67 73 20 65 6e 64 20 65 6e 64 5d 0a 20 20 args end end].
4c00: 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 }. } else {.
4c10: 20 20 20 23 20 41 20 63 68 61 6e 6e 65 6c 20 77 # A channel w
4c20: 61 73 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 as explicitly sp
4c30: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 75 70 6c ecified.. upl
4c40: 65 76 65 6c 20 70 75 74 73 5f 6f 72 69 67 69 6e evel puts_origin
4c50: 61 6c 20 24 61 72 67 73 0a 20 20 7d 0a 7d 0a 72 al $args. }.}.r
4c60: 65 6e 61 6d 65 20 70 75 74 73 20 70 75 74 73 5f ename puts puts_
4c70: 6f 72 69 67 69 6e 61 6c 0a 70 72 6f 63 20 70 75 original.proc pu
4c80: 74 73 20 7b 61 72 67 73 7d 20 7b 20 75 70 6c 65 ts {args} { uple
4c90: 76 65 6c 20 70 75 74 73 5f 6f 76 65 72 72 69 64 vel puts_overrid
4ca0: 65 20 24 61 72 67 73 20 7d 0a 0a 0a 23 20 49 6e e $args }...# In
4cb0: 76 6f 6b 65 20 74 68 65 20 64 6f 5f 74 65 73 74 voke the do_test
4cc0: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 75 procedure to ru
4cd0: 6e 20 61 20 73 69 6e 67 6c 65 20 74 65 73 74 0a n a single test.
4ce0: 23 0a 70 72 6f 63 20 64 6f 5f 74 65 73 74 20 7b #.proc do_test {
4cf0: 6e 61 6d 65 20 63 6d 64 20 65 78 70 65 63 74 65 name cmd expecte
4d00: 64 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 72 d} {. global ar
4d10: 67 76 20 63 6d 64 6c 69 6e 65 61 72 67 0a 0a 20 gv cmdlinearg..
4d20: 20 66 69 78 5f 74 65 73 74 6e 61 6d 65 20 6e 61 fix_testname na
4d30: 6d 65 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65 me.. sqlite3_me
4d40: 6d 64 65 62 75 67 5f 73 65 74 74 69 74 6c 65 20 mdebug_settitle
4d50: 24 6e 61 6d 65 0a 0a 23 20 20 69 66 20 7b 5b 6c $name..# if {[l
4d60: 6c 65 6e 67 74 68 20 24 61 72 67 76 5d 3d 3d 30 length $argv]==0
4d70: 7d 20 7b 0a 23 20 20 20 20 73 65 74 20 67 6f 20 } {.# set go
4d80: 31 0a 23 20 20 7d 20 65 6c 73 65 20 7b 0a 23 20 1.# } else {.#
4d90: 20 20 20 73 65 74 20 67 6f 20 30 0a 23 20 20 20 set go 0.#
4da0: 20 66 6f 72 65 61 63 68 20 70 61 74 74 65 72 6e foreach pattern
4db0: 20 24 61 72 67 76 20 7b 0a 23 20 20 20 20 20 20 $argv {.#
4dc0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 if {[string matc
4dd0: 68 20 24 70 61 74 74 65 72 6e 20 24 6e 61 6d 65 h $pattern $name
4de0: 5d 7d 20 7b 0a 23 20 20 20 20 20 20 20 20 73 65 ]} {.# se
4df0: 74 20 67 6f 20 31 0a 23 20 20 20 20 20 20 20 20 t go 1.#
4e00: 62 72 65 61 6b 0a 23 20 20 20 20 20 20 7d 0a 23 break.# }.#
4e10: 20 20 20 20 7d 0a 23 20 20 7d 0a 0a 20 20 69 66 }.# }.. if
4e20: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a {[info exists :
4e30: 3a 47 28 70 65 72 6d 3a 70 72 65 66 69 78 29 5d :G(perm:prefix)]
4e40: 7d 20 7b 0a 20 20 20 20 73 65 74 20 6e 61 6d 65 } {. set name
4e50: 20 22 24 3a 3a 47 28 70 65 72 6d 3a 70 72 65 66 "$::G(perm:pref
4e60: 69 78 29 24 6e 61 6d 65 22 0a 20 20 7d 0a 0a 20 ix)$name". }..
4e70: 20 69 6e 63 72 5f 6e 74 65 73 74 0a 20 20 6f 75 incr_ntest. ou
4e80: 74 70 75 74 31 20 2d 6e 6f 6e 65 77 6c 69 6e 65 tput1 -nonewline
4e90: 20 24 6e 61 6d 65 2e 2e 2e 0a 20 20 66 6c 75 73 $name.... flus
4ea0: 68 20 73 74 64 6f 75 74 0a 0a 20 20 69 66 20 7b h stdout.. if {
4eb0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a ![info exists ::
4ec0: 47 28 6d 61 74 63 68 29 5d 20 7c 7c 20 5b 73 74 G(match)] || [st
4ed0: 72 69 6e 67 20 6d 61 74 63 68 20 24 3a 3a 47 28 ring match $::G(
4ee0: 6d 61 74 63 68 29 20 24 6e 61 6d 65 5d 7d 20 7b match) $name]} {
4ef0: 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 . if {[catch
4f00: 7b 75 70 6c 65 76 65 6c 20 23 30 20 22 24 63 6d {uplevel #0 "$cm
4f10: 64 3b 5c 6e 22 7d 20 72 65 73 75 6c 74 5d 7d 20 d;\n"} result]}
4f20: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 32 5f {. output2_
4f30: 69 66 5f 6e 6f 5f 76 65 72 62 6f 73 65 20 2d 6e if_no_verbose -n
4f40: 6f 6e 65 77 6c 69 6e 65 20 24 6e 61 6d 65 2e 2e onewline $name..
4f50: 2e 0a 20 20 20 20 20 20 6f 75 74 70 75 74 32 20 .. output2
4f60: 22 5c 6e 45 72 72 6f 72 3a 20 24 72 65 73 75 6c "\nError: $resul
4f70: 74 22 0a 20 20 20 20 20 20 66 61 69 6c 5f 74 65 t". fail_te
4f80: 73 74 20 24 6e 61 6d 65 0a 20 20 20 20 7d 20 65 st $name. } e
4f90: 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 66 20 7b lse {. if {
4fa0: 5b 72 65 67 65 78 70 20 7b 5e 7e 3f 2f 2e 2a 2f [regexp {^~?/.*/
4fb0: 24 7d 20 24 65 78 70 65 63 74 65 64 5d 7d 20 7b $} $expected]} {
4fc0: 0a 20 20 20 20 20 20 20 20 23 20 22 65 78 70 65 . # "expe
4fd0: 63 74 65 64 22 20 69 73 20 6f 66 20 74 68 65 20 cted" is of the
4fe0: 66 6f 72 6d 20 22 2f 50 41 54 54 45 52 4e 2f 22 form "/PATTERN/"
4ff0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 then the result
5000: 20 69 66 20 63 6f 72 72 65 63 74 20 69 66 0a 20 if correct if.
5010: 20 20 20 20 20 20 20 23 20 72 65 67 75 6c 61 72 # regular
5020: 20 65 78 70 72 65 73 73 69 6f 6e 20 50 41 54 54 expression PATT
5030: 45 52 4e 20 6d 61 74 63 68 65 73 20 74 68 65 20 ERN matches the
5040: 72 65 73 75 6c 74 2e 20 20 22 7e 2f 50 41 54 54 result. "~/PATT
5050: 45 52 4e 2f 22 20 6d 65 61 6e 73 0a 20 20 20 20 ERN/" means.
5060: 20 20 20 20 23 20 74 68 65 20 72 65 67 75 6c 61 # the regula
5070: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 r expression mus
5080: 74 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 20 20 20 t not match..
5090: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 if {[string
50a0: 20 69 6e 64 65 78 20 24 65 78 70 65 63 74 65 64 index $expected
50b0: 20 30 5d 3d 3d 22 7e 22 7d 20 7b 0a 20 20 20 20 0]=="~"} {.
50c0: 20 20 20 20 20 20 73 65 74 20 72 65 20 5b 73 74 set re [st
50d0: 72 69 6e 67 20 72 61 6e 67 65 20 24 65 78 70 65 ring range $expe
50e0: 63 74 65 64 20 32 20 65 6e 64 2d 31 5d 0a 20 20 cted 2 end-1].
50f0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 if {[str
5100: 69 6e 67 20 69 6e 64 65 78 20 24 72 65 20 30 5d ing index $re 0]
5110: 3d 3d 22 2a 22 7d 20 7b 0a 20 20 20 20 20 20 20 =="*"} {.
5120: 20 20 20 20 20 23 20 49 66 20 74 68 65 20 72 65 # If the re
5130: 67 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e gular expression
5140: 20 62 65 67 69 6e 73 20 77 69 74 68 20 2a 20 74 begins with * t
5150: 68 65 6e 20 74 72 65 61 74 20 69 74 20 61 73 20 hen treat it as
5160: 61 20 67 6c 6f 62 20 69 6e 73 74 65 61 64 0a 20 a glob instead.
5170: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f set o
5180: 6b 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 k [string match
5190: 24 72 65 20 24 72 65 73 75 6c 74 5d 0a 20 20 20 $re $result].
51a0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a } else {.
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 set
51c0: 72 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b re [string map {
51d0: 23 20 7b 5b 2d 30 2d 39 2e 5d 2b 7d 7d 20 24 72 # {[-0-9.]+}} $r
51e0: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 e]. s
51f0: 65 74 20 6f 6b 20 5b 72 65 67 65 78 70 20 24 72 et ok [regexp $r
5200: 65 20 24 72 65 73 75 6c 74 5d 0a 20 20 20 20 20 e $result].
5210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
5220: 20 73 65 74 20 6f 6b 20 5b 65 78 70 72 20 7b 21 set ok [expr {!
5230: 24 6f 6b 7d 5d 0a 20 20 20 20 20 20 20 20 7d 20 $ok}]. }
5240: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 else {.
5250: 20 73 65 74 20 72 65 20 5b 73 74 72 69 6e 67 20 set re [string
5260: 72 61 6e 67 65 20 24 65 78 70 65 63 74 65 64 20 range $expected
5270: 31 20 65 6e 64 2d 31 5d 0a 20 20 20 20 20 20 20 1 end-1].
5280: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 if {[string i
5290: 6e 64 65 78 20 24 72 65 20 30 5d 3d 3d 22 2a 22 ndex $re 0]=="*"
52a0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
52b0: 23 20 49 66 20 74 68 65 20 72 65 67 75 6c 61 72 # If the regular
52c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 67 69 expression begi
52d0: 6e 73 20 77 69 74 68 20 2a 20 74 68 65 6e 20 74 ns with * then t
52e0: 72 65 61 74 20 69 74 20 61 73 20 61 20 67 6c 6f reat it as a glo
52f0: 62 20 69 6e 73 74 65 61 64 0a 20 20 20 20 20 20 b instead.
5300: 20 20 20 20 20 20 73 65 74 20 6f 6b 20 5b 73 74 set ok [st
5310: 72 69 6e 67 20 6d 61 74 63 68 20 24 72 65 20 24 ring match $re $
5320: 72 65 73 75 6c 74 5d 0a 20 20 20 20 20 20 20 20 result].
5330: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 } else {.
5340: 20 20 20 20 20 20 20 73 65 74 20 72 65 20 5b 73 set re [s
5350: 74 72 69 6e 67 20 6d 61 70 20 7b 23 20 7b 5b 2d tring map {# {[-
5360: 30 2d 39 2e 5d 2b 7d 7d 20 24 72 65 5d 0a 20 20 0-9.]+}} $re].
5370: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 6b set ok
5380: 20 5b 72 65 67 65 78 70 20 24 72 65 20 24 72 65 [regexp $re $re
5390: 73 75 6c 74 5d 0a 20 20 20 20 20 20 20 20 20 20 sult].
53a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
53b0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 } elseif {[reg
53c0: 65 78 70 20 7b 5e 7e 3f 5c 2a 2e 2a 5c 2a 24 7d exp {^~?\*.*\*$}
53d0: 20 24 65 78 70 65 63 74 65 64 5d 7d 20 7b 0a 20 $expected]} {.
53e0: 20 20 20 20 20 20 20 23 20 22 65 78 70 65 63 74 # "expect
53f0: 65 64 22 20 69 73 20 6f 66 20 74 68 65 20 66 6f ed" is of the fo
5400: 72 6d 20 22 2a 47 4c 4f 42 2a 22 20 74 68 65 6e rm "*GLOB*" then
5410: 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 63 the result if c
5420: 6f 72 72 65 63 74 20 69 66 0a 20 20 20 20 20 20 orrect if.
5430: 20 20 23 20 67 6c 6f 62 20 70 61 74 74 65 72 6e # glob pattern
5440: 20 47 4c 4f 42 20 6d 61 74 63 68 65 73 20 74 68 GLOB matches th
5450: 65 20 72 65 73 75 6c 74 2e 20 20 22 7e 2f 47 4c e result. "~/GL
5460: 4f 42 2f 22 20 6d 65 61 6e 73 0a 20 20 20 20 20 OB/" means.
5470: 20 20 20 23 20 74 68 65 20 67 6c 6f 62 20 6d 75 # the glob mu
5480: 73 74 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 20 20 st not match..
5490: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e if {[strin
54a0: 67 20 69 6e 64 65 78 20 24 65 78 70 65 63 74 65 g index $expecte
54b0: 64 20 30 5d 3d 3d 22 7e 22 7d 20 7b 0a 20 20 20 d 0]=="~"} {.
54c0: 20 20 20 20 20 20 20 73 65 74 20 65 20 5b 73 74 set e [st
54d0: 72 69 6e 67 20 72 61 6e 67 65 20 24 65 78 70 65 ring range $expe
54e0: 63 74 65 64 20 31 20 65 6e 64 5d 0a 20 20 20 20 cted 1 end].
54f0: 20 20 20 20 20 20 73 65 74 20 6f 6b 20 5b 65 78 set ok [ex
5500: 70 72 20 7b 21 5b 73 74 72 69 6e 67 20 6d 61 74 pr {![string mat
5510: 63 68 20 24 65 20 24 72 65 73 75 6c 74 5d 7d 5d ch $e $result]}]
5520: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 . } else
5530: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 {. set
5540: 6f 6b 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 ok [string match
5550: 20 24 65 78 70 65 63 74 65 64 20 24 72 65 73 75 $expected $resu
5560: 6c 74 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 lt]. }.
5570: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 } else {.
5580: 20 20 20 20 20 73 65 74 20 6f 6b 20 5b 65 78 70 set ok [exp
5590: 72 20 7b 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 r {[string compa
55a0: 72 65 20 24 72 65 73 75 6c 74 20 24 65 78 70 65 re $result $expe
55b0: 63 74 65 64 5d 3d 3d 30 7d 5d 0a 20 20 20 20 20 cted]==0}].
55c0: 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 6f }. if {!$o
55d0: 6b 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 69 k} {. # i
55e0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 f {![info exists
55f0: 20 3a 3a 74 65 73 74 70 72 65 66 69 78 5d 20 7c ::testprefix] |
5600: 7c 20 24 3a 3a 74 65 73 74 70 72 65 66 69 78 20 | $::testprefix
5610: 65 71 20 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 eq ""} {.
5620: 20 23 20 20 20 65 72 72 6f 72 20 22 6e 6f 20 74 # error "no t
5630: 65 73 74 20 70 72 65 66 69 78 22 0a 20 20 20 20 est prefix".
5640: 20 20 20 20 23 20 7d 0a 20 20 20 20 20 20 20 20 # }.
5650: 6f 75 74 70 75 74 31 20 22 22 0a 20 20 20 20 20 output1 "".
5660: 20 20 20 6f 75 74 70 75 74 32 20 22 21 20 24 6e output2 "! $n
5670: 61 6d 65 20 65 78 70 65 63 74 65 64 3a 20 5c 5b ame expected: \[
5680: 24 65 78 70 65 63 74 65 64 5c 5d 5c 6e 21 20 24 $expected\]\n! $
5690: 6e 61 6d 65 20 67 6f 74 3a 20 20 20 20 20 20 5c name got: \
56a0: 5b 24 72 65 73 75 6c 74 5c 5d 22 0a 20 20 20 20 [$result\]".
56b0: 20 20 20 20 66 61 69 6c 5f 74 65 73 74 20 24 6e fail_test $n
56c0: 61 6d 65 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 ame. } else
56d0: 20 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 {. outpu
56e0: 74 31 20 22 20 4f 6b 22 0a 20 20 20 20 20 20 7d t1 " Ok". }
56f0: 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 . }. } else
5700: 7b 0a 20 20 20 20 6f 75 74 70 75 74 31 20 22 20 {. output1 "
5710: 4f 6d 69 74 74 65 64 22 0a 20 20 20 20 6f 6d 69 Omitted". omi
5720: 74 5f 74 65 73 74 20 24 6e 61 6d 65 20 22 70 61 t_test $name "pa
5730: 74 74 65 72 6e 20 6d 69 73 6d 61 74 63 68 22 20 ttern mismatch"
5740: 30 0a 20 20 7d 0a 20 20 66 6c 75 73 68 20 73 74 0. }. flush st
5750: 64 6f 75 74 0a 7d 0a 0a 70 72 6f 63 20 64 75 6d dout.}..proc dum
5760: 70 62 79 74 65 73 20 7b 73 7d 20 7b 0a 20 20 73 pbytes {s} {. s
5770: 65 74 20 72 20 22 22 0a 20 20 66 6f 72 20 7b 73 et r "". for {s
5780: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 73 et i 0} {$i < [s
5790: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 5d tring length $s]
57a0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 } {incr i} {.
57b0: 20 69 66 20 7b 24 69 20 3e 20 30 7d 20 7b 61 70 if {$i > 0} {ap
57c0: 70 65 6e 64 20 72 20 22 20 22 7d 0a 20 20 20 20 pend r " "}.
57d0: 61 70 70 65 6e 64 20 72 20 5b 66 6f 72 6d 61 74 append r [format
57e0: 20 25 30 32 58 20 5b 73 63 61 6e 20 5b 73 74 72 %02X [scan [str
57f0: 69 6e 67 20 69 6e 64 65 78 20 24 73 20 24 69 5d ing index $s $i]
5800: 20 25 63 5d 5d 0a 20 20 7d 0a 20 20 72 65 74 75 %c]]. }. retu
5810: 72 6e 20 24 72 0a 7d 0a 0a 70 72 6f 63 20 63 61 rn $r.}..proc ca
5820: 74 63 68 63 6d 64 20 7b 64 62 20 7b 63 6d 64 20 tchcmd {db {cmd
5830: 22 22 7d 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 ""}} {. global
5840: 43 4c 49 0a 20 20 73 65 74 20 6f 75 74 20 5b 6f CLI. set out [o
5850: 70 65 6e 20 63 6d 64 73 2e 74 78 74 20 77 5d 0a pen cmds.txt w].
5860: 20 20 70 75 74 73 20 24 6f 75 74 20 24 63 6d 64 puts $out $cmd
5870: 0a 20 20 63 6c 6f 73 65 20 24 6f 75 74 0a 20 20 . close $out.
5880: 73 65 74 20 6c 69 6e 65 20 22 65 78 65 63 20 24 set line "exec $
5890: 43 4c 49 20 24 64 62 20 3c 20 63 6d 64 73 2e 74 CLI $db < cmds.t
58a0: 78 74 22 0a 20 20 73 65 74 20 72 63 20 5b 63 61 xt". set rc [ca
58b0: 74 63 68 20 7b 20 65 76 61 6c 20 24 6c 69 6e 65 tch { eval $line
58c0: 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 } msg]. list $
58d0: 72 63 20 24 6d 73 67 0a 7d 0a 0a 70 72 6f 63 20 rc $msg.}..proc
58e0: 63 61 74 63 68 63 6d 64 65 78 20 7b 64 62 20 7b catchcmdex {db {
58f0: 63 6d 64 20 22 22 7d 7d 20 7b 0a 20 20 67 6c 6f cmd ""}} {. glo
5900: 62 61 6c 20 43 4c 49 0a 20 20 73 65 74 20 6f 75 bal CLI. set ou
5910: 74 20 5b 6f 70 65 6e 20 63 6d 64 73 2e 74 78 74 t [open cmds.txt
5920: 20 77 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 w]. fconfigure
5930: 20 24 6f 75 74 20 2d 65 6e 63 6f 64 69 6e 67 20 $out -encoding
5940: 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61 74 binary -translat
5950: 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 70 75 74 ion binary. put
5960: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 6f 75 s -nonewline $ou
5970: 74 20 24 63 6d 64 0a 20 20 63 6c 6f 73 65 20 24 t $cmd. close $
5980: 6f 75 74 0a 20 20 73 65 74 20 6c 69 6e 65 20 22 out. set line "
5990: 65 78 65 63 20 2d 6b 65 65 70 6e 65 77 6c 69 6e exec -keepnewlin
59a0: 65 20 2d 2d 20 24 43 4c 49 20 24 64 62 20 3c 20 e -- $CLI $db <
59b0: 63 6d 64 73 2e 74 78 74 22 0a 20 20 73 65 74 20 cmds.txt". set
59c0: 63 68 61 6e 73 20 5b 6c 69 73 74 20 73 74 64 69 chans [list stdi
59d0: 6e 20 73 74 64 6f 75 74 20 73 74 64 65 72 72 5d n stdout stderr]
59e0: 0a 20 20 66 6f 72 65 61 63 68 20 63 68 61 6e 20 . foreach chan
59f0: 24 63 68 61 6e 73 20 7b 0a 20 20 20 20 63 61 74 $chans {. cat
5a00: 63 68 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6d ch {. set m
5a10: 6f 64 65 73 28 24 63 68 61 6e 29 20 5b 66 63 6f odes($chan) [fco
5a20: 6e 66 69 67 75 72 65 20 24 63 68 61 6e 5d 0a 20 nfigure $chan].
5a30: 20 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 fconfigure
5a40: 24 63 68 61 6e 20 2d 65 6e 63 6f 64 69 6e 67 20 $chan -encoding
5a50: 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61 74 binary -translat
5a60: 69 6f 6e 20 62 69 6e 61 72 79 20 2d 62 75 66 66 ion binary -buff
5a70: 65 72 69 6e 67 20 6e 6f 6e 65 0a 20 20 20 20 7d ering none. }
5a80: 0a 20 20 7d 0a 20 20 73 65 74 20 72 63 20 5b 63 . }. set rc [c
5a90: 61 74 63 68 20 7b 20 65 76 61 6c 20 24 6c 69 6e atch { eval $lin
5aa0: 65 20 7d 20 6d 73 67 5d 0a 20 20 66 6f 72 65 61 e } msg]. forea
5ab0: 63 68 20 63 68 61 6e 20 24 63 68 61 6e 73 20 7b ch chan $chans {
5ac0: 0a 20 20 20 20 63 61 74 63 68 20 7b 0a 20 20 20 . catch {.
5ad0: 20 20 20 65 76 61 6c 20 66 63 6f 6e 66 69 67 75 eval fconfigu
5ae0: 72 65 20 5b 6c 69 73 74 20 24 63 68 61 6e 5d 20 re [list $chan]
5af0: 24 6d 6f 64 65 73 28 24 63 68 61 6e 29 0a 20 20 $modes($chan).
5b00: 20 20 7d 0a 20 20 7d 0a 20 20 23 20 70 75 74 73 }. }. # puts
5b10: 20 5b 64 75 6d 70 62 79 74 65 73 20 24 6d 73 67 [dumpbytes $msg
5b20: 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 ]. list $rc $ms
5b30: 67 0a 7d 0a 0a 70 72 6f 63 20 66 69 6c 65 70 61 g.}..proc filepa
5b40: 74 68 5f 6e 6f 72 6d 61 6c 69 7a 65 20 7b 70 7d th_normalize {p}
5b50: 20 7b 0a 20 20 23 20 74 65 73 74 20 63 61 73 65 {. # test case
5b60: 73 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 s should be writ
5b70: 74 65 6e 20 74 6f 20 61 73 73 75 6d 65 20 22 75 ten to assume "u
5b80: 6e 69 78 22 2d 6c 69 6b 65 20 66 69 6c 65 20 70 nix"-like file p
5b90: 61 74 68 73 0a 20 20 69 66 20 7b 24 3a 3a 74 63 aths. if {$::tc
5ba0: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 l_platform(platf
5bb0: 6f 72 6d 29 21 3d 22 75 6e 69 78 22 7d 20 7b 0a orm)!="unix"} {.
5bc0: 20 20 20 20 23 20 6c 72 65 76 65 72 73 65 2a 32 # lreverse*2
5bd0: 20 61 73 20 61 20 68 61 63 6b 20 74 6f 20 72 65 as a hack to re
5be0: 6d 6f 76 65 20 61 6e 79 20 75 6e 6e 65 65 64 65 move any unneede
5bf0: 64 20 7b 7d 20 61 66 74 65 72 20 74 68 65 20 73 d {} after the s
5c00: 74 72 69 6e 67 20 6d 61 70 0a 20 20 20 20 6c 72 tring map. lr
5c10: 65 76 65 72 73 65 20 5b 6c 72 65 76 65 72 73 65 everse [lreverse
5c20: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 5c 5c [string map {\\
5c30: 20 2f 7d 20 5b 72 65 67 73 75 62 20 2d 6e 6f 63 /} [regsub -noc
5c40: 61 73 65 20 2d 61 6c 6c 20 7b 5b 61 2d 7a 5d 3a ase -all {[a-z]:
5c50: 5b 2f 5c 5c 5d 2b 7d 20 24 70 20 7b 2f 7d 5d 5d [/\\]+} $p {/}]]
5c60: 5d 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 ]. } {. set
5c70: 70 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 64 6f 5f p. }.}.proc do_
5c80: 66 69 6c 65 70 61 74 68 5f 74 65 73 74 20 7b 6e filepath_test {n
5c90: 61 6d 65 20 63 6d 64 20 65 78 70 65 63 74 65 64 ame cmd expected
5ca0: 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c } {. uplevel [l
5cb0: 69 73 74 20 64 6f 5f 74 65 73 74 20 24 6e 61 6d ist do_test $nam
5cc0: 65 20 5b 0a 20 20 20 20 73 75 62 73 74 20 2d 6e e [. subst -n
5cd0: 6f 63 6f 6d 6d 61 6e 64 73 20 7b 20 66 69 6c 65 ocommands { file
5ce0: 70 61 74 68 5f 6e 6f 72 6d 61 6c 69 7a 65 20 5b path_normalize [
5cf0: 20 24 63 6d 64 20 5d 20 7d 0a 20 20 5d 20 5b 66 $cmd ] }. ] [f
5d00: 69 6c 65 70 61 74 68 5f 6e 6f 72 6d 61 6c 69 7a ilepath_normaliz
5d10: 65 20 24 65 78 70 65 63 74 65 64 5d 5d 0a 7d 0a e $expected]].}.
5d20: 0a 70 72 6f 63 20 72 65 61 6c 6e 75 6d 5f 6e 6f .proc realnum_no
5d30: 72 6d 61 6c 69 7a 65 20 7b 72 7d 20 7b 0a 20 20 rmalize {r} {.
5d40: 23 20 64 69 66 66 65 72 65 6e 74 20 54 43 4c 20 # different TCL
5d50: 76 65 72 73 69 6f 6e 73 20 64 69 73 70 6c 61 79 versions display
5d60: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 floating point
5d70: 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 values different
5d80: 6c 79 2e 0a 20 20 73 74 72 69 6e 67 20 6d 61 70 ly.. string map
5d90: 20 7b 31 2e 23 49 4e 46 20 69 6e 66 20 49 6e 66 {1.#INF inf Inf
5da0: 20 69 6e 66 20 2e 30 65 20 65 7d 20 5b 72 65 67 inf .0e e} [reg
5db0: 73 75 62 20 2d 61 6c 6c 20 7b 28 65 5b 2b 2d 5d sub -all {(e[+-]
5dc0: 29 30 2b 7d 20 24 72 20 7b 5c 31 7d 5d 0a 7d 0a )0+} $r {\1}].}.
5dd0: 70 72 6f 63 20 64 6f 5f 72 65 61 6c 6e 75 6d 5f proc do_realnum_
5de0: 74 65 73 74 20 7b 6e 61 6d 65 20 63 6d 64 20 65 test {name cmd e
5df0: 78 70 65 63 74 65 64 7d 20 7b 0a 20 20 75 70 6c xpected} {. upl
5e00: 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 74 65 evel [list do_te
5e10: 73 74 20 24 6e 61 6d 65 20 5b 0a 20 20 20 20 73 st $name [. s
5e20: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 ubst -nocommands
5e30: 20 7b 20 72 65 61 6c 6e 75 6d 5f 6e 6f 72 6d 61 { realnum_norma
5e40: 6c 69 7a 65 20 5b 20 24 63 6d 64 20 5d 20 7d 0a lize [ $cmd ] }.
5e50: 20 20 5d 20 5b 72 65 61 6c 6e 75 6d 5f 6e 6f 72 ] [realnum_nor
5e60: 6d 61 6c 69 7a 65 20 24 65 78 70 65 63 74 65 64 malize $expected
5e70: 5d 5d 0a 7d 0a 0a 70 72 6f 63 20 66 69 78 5f 74 ]].}..proc fix_t
5e80: 65 73 74 6e 61 6d 65 20 7b 76 61 72 6e 61 6d 65 estname {varname
5e90: 7d 20 7b 0a 20 20 75 70 76 61 72 20 24 76 61 72 } {. upvar $var
5ea0: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 0a 20 20 name testname.
5eb0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 if {[info exists
5ec0: 20 3a 3a 74 65 73 74 70 72 65 66 69 78 5d 0a 20 ::testprefix].
5ed0: 20 20 26 26 20 5b 73 74 72 69 6e 67 20 69 73 20 && [string is
5ee0: 64 69 67 69 74 20 5b 73 74 72 69 6e 67 20 72 61 digit [string ra
5ef0: 6e 67 65 20 24 74 65 73 74 6e 61 6d 65 20 30 20 nge $testname 0
5f00: 30 5d 5d 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65 0]]. } {. se
5f10: 74 20 74 65 73 74 6e 61 6d 65 20 22 24 7b 3a 3a t testname "${::
5f20: 74 65 73 74 70 72 65 66 69 78 7d 2d 24 74 65 73 testprefix}-$tes
5f30: 74 6e 61 6d 65 22 0a 20 20 7d 0a 7d 0a 0a 70 72 tname". }.}..pr
5f40: 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65 5f 6c 69 73 oc normalize_lis
5f50: 74 20 7b 4c 7d 20 7b 0a 20 20 73 65 74 20 4c 32 t {L} {. set L2
5f60: 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 [list]. foreac
5f70: 68 20 6c 20 24 4c 20 7b 6c 61 70 70 65 6e 64 20 h l $L {lappend
5f80: 4c 32 20 24 6c 7d 0a 20 20 73 65 74 20 4c 32 0a L2 $l}. set L2.
5f90: 7d 0a 0a 70 72 6f 63 20 64 6f 5f 65 78 65 63 73 }..proc do_execs
5fa0: 71 6c 5f 74 65 73 74 20 7b 74 65 73 74 6e 61 6d ql_test {testnam
5fb0: 65 20 73 71 6c 20 7b 72 65 73 75 6c 74 20 7b 7d e sql {result {}
5fc0: 7d 7d 20 7b 0a 20 20 66 69 78 5f 74 65 73 74 6e }} {. fix_testn
5fd0: 61 6d 65 20 74 65 73 74 6e 61 6d 65 0a 20 20 75 ame testname. u
5fe0: 70 6c 65 76 65 6c 20 64 6f 5f 74 65 73 74 20 5b plevel do_test [
5ff0: 6c 69 73 74 20 24 74 65 73 74 6e 61 6d 65 5d 20 list $testname]
6000: 5b 6c 69 73 74 20 22 65 78 65 63 73 71 6c 20 7b [list "execsql {
6010: 24 73 71 6c 7d 22 5d 20 5b 6c 69 73 74 20 5b 6c $sql}"] [list [l
6020: 69 73 74 20 7b 2a 7d 24 72 65 73 75 6c 74 5d 5d ist {*}$result]]
6030: 0a 7d 0a 70 72 6f 63 20 64 6f 5f 63 61 74 63 68 .}.proc do_catch
6040: 73 71 6c 5f 74 65 73 74 20 7b 74 65 73 74 6e 61 sql_test {testna
6050: 6d 65 20 73 71 6c 20 72 65 73 75 6c 74 7d 20 7b me sql result} {
6060: 0a 20 20 66 69 78 5f 74 65 73 74 6e 61 6d 65 20 . fix_testname
6070: 74 65 73 74 6e 61 6d 65 0a 20 20 75 70 6c 65 76 testname. uplev
6080: 65 6c 20 64 6f 5f 74 65 73 74 20 5b 6c 69 73 74 el do_test [list
6090: 20 24 74 65 73 74 6e 61 6d 65 5d 20 5b 6c 69 73 $testname] [lis
60a0: 74 20 22 63 61 74 63 68 73 71 6c 20 7b 24 73 71 t "catchsql {$sq
60b0: 6c 7d 22 5d 20 5b 6c 69 73 74 20 24 72 65 73 75 l}"] [list $resu
60c0: 6c 74 5d 0a 7d 0a 70 72 6f 63 20 64 6f 5f 74 69 lt].}.proc do_ti
60d0: 6d 65 64 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 med_execsql_test
60e0: 20 7b 74 65 73 74 6e 61 6d 65 20 73 71 6c 20 7b {testname sql {
60f0: 72 65 73 75 6c 74 20 7b 7d 7d 7d 20 7b 0a 20 20 result {}}} {.
6100: 66 69 78 5f 74 65 73 74 6e 61 6d 65 20 74 65 73 fix_testname tes
6110: 74 6e 61 6d 65 0a 20 20 75 70 6c 65 76 65 6c 20 tname. uplevel
6120: 64 6f 5f 74 65 73 74 20 5b 6c 69 73 74 20 24 74 do_test [list $t
6130: 65 73 74 6e 61 6d 65 5d 20 5b 6c 69 73 74 20 22 estname] [list "
6140: 65 78 65 63 73 71 6c 5f 74 69 6d 65 64 20 7b 24 execsql_timed {$
6150: 73 71 6c 7d 22 5d 5c 0a 20 20 20 20 20 20 20 20 sql}"]\.
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6170: 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 [list
6180: 20 5b 6c 69 73 74 20 7b 2a 7d 24 72 65 73 75 6c [list {*}$resul
6190: 74 5d 5d 0a 7d 0a 70 72 6f 63 20 64 6f 5f 65 71 t]].}.proc do_eq
61a0: 70 5f 74 65 73 74 20 7b 6e 61 6d 65 20 73 71 6c p_test {name sql
61b0: 20 72 65 73 7d 20 7b 0a 20 20 75 70 6c 65 76 65 res} {. upleve
61c0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 l do_execsql_tes
61d0: 74 20 24 6e 61 6d 65 20 5b 6c 69 73 74 20 22 45 t $name [list "E
61e0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 XPLAIN QUERY PLA
61f0: 4e 20 24 73 71 6c 22 5d 20 5b 6c 69 73 74 20 24 N $sql"] [list $
6200: 72 65 73 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d res].}..#-------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6250: 2d 2d 0a 23 20 20 20 55 73 61 67 65 3a 20 64 6f --.# Usage: do
6260: 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 20 50 52 _select_tests PR
6270: 45 46 49 58 20 3f 53 57 49 54 43 48 45 53 3f 20 EFIX ?SWITCHES?
6280: 54 45 53 54 4c 49 53 54 0a 23 0a 23 20 57 68 65 TESTLIST.#.# Whe
6290: 72 65 20 73 77 69 74 63 68 65 73 20 61 72 65 3a re switches are:
62a0: 0a 23 0a 23 20 20 20 2d 65 72 72 6f 72 66 6f 72 .#.# -errorfor
62b0: 6d 61 74 20 46 4d 54 53 54 52 49 4e 47 0a 23 20 mat FMTSTRING.#
62c0: 20 20 2d 63 6f 75 6e 74 0a 23 20 20 20 2d 71 75 -count.# -qu
62d0: 65 72 79 20 53 51 4c 0a 23 20 20 20 2d 74 63 6c ery SQL.# -tcl
62e0: 71 75 65 72 79 20 54 43 4c 0a 23 20 20 20 2d 72 query TCL.# -r
62f0: 65 70 61 69 72 20 54 43 4c 0a 23 0a 70 72 6f 63 epair TCL.#.proc
6300: 20 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 74 73 do_select_tests
6310: 20 7b 70 72 65 66 69 78 20 61 72 67 73 7d 20 7b {prefix args} {
6320: 0a 0a 20 20 73 65 74 20 74 65 73 74 6c 69 73 74 .. set testlist
6330: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 65 [lindex $args e
6340: 6e 64 5d 0a 20 20 73 65 74 20 73 77 69 74 63 68 nd]. set switch
6350: 65 73 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 es [lrange $args
6360: 20 30 20 65 6e 64 2d 31 5d 0a 0a 20 20 73 65 74 0 end-1].. set
6370: 20 65 72 72 66 6d 74 20 22 22 0a 20 20 73 65 74 errfmt "". set
6380: 20 63 6f 75 6e 74 6f 6e 6c 79 20 30 0a 20 20 73 countonly 0. s
6390: 65 74 20 74 63 6c 71 75 65 72 79 20 22 22 0a 20 et tclquery "".
63a0: 20 73 65 74 20 72 65 70 61 69 72 20 22 22 0a 0a set repair ""..
63b0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 for {set i 0}
63c0: 7b 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 {$i < [llength $
63d0: 73 77 69 74 63 68 65 73 5d 7d 20 7b 69 6e 63 72 switches]} {incr
63e0: 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 20 i} {. set s
63f0: 5b 6c 69 6e 64 65 78 20 24 73 77 69 74 63 68 65 [lindex $switche
6400: 73 20 24 69 5d 0a 20 20 20 20 73 65 74 20 6e 20 s $i]. set n
6410: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 [string length $
6420: 73 5d 0a 20 20 20 20 69 66 20 7b 24 6e 3e 3d 32 s]. if {$n>=2
6430: 20 26 26 20 5b 73 74 72 69 6e 67 20 65 71 75 61 && [string equa
6440: 6c 20 2d 6c 65 6e 67 74 68 20 24 6e 20 24 73 20 l -length $n $s
6450: 22 2d 71 75 65 72 79 22 5d 7d 20 7b 0a 20 20 20 "-query"]} {.
6460: 20 20 20 73 65 74 20 74 63 6c 71 75 65 72 79 20 set tclquery
6470: 5b 6c 69 73 74 20 65 78 65 63 73 71 6c 20 5b 6c [list execsql [l
6480: 69 6e 64 65 78 20 24 73 77 69 74 63 68 65 73 20 index $switches
6490: 5b 69 6e 63 72 20 69 5d 5d 5d 0a 20 20 20 20 7d [incr i]]]. }
64a0: 20 65 6c 73 65 69 66 20 7b 24 6e 3e 3d 32 20 26 elseif {$n>=2 &
64b0: 26 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 & [string equal
64c0: 2d 6c 65 6e 67 74 68 20 24 6e 20 24 73 20 22 2d -length $n $s "-
64d0: 74 63 6c 71 75 65 72 79 22 5d 7d 20 7b 0a 20 20 tclquery"]} {.
64e0: 20 20 20 20 73 65 74 20 74 63 6c 71 75 65 72 79 set tclquery
64f0: 20 5b 6c 69 6e 64 65 78 20 24 73 77 69 74 63 68 [lindex $switch
6500: 65 73 20 5b 69 6e 63 72 20 69 5d 5d 0a 20 20 20 es [incr i]].
6510: 20 7d 20 65 6c 73 65 69 66 20 7b 24 6e 3e 3d 32 } elseif {$n>=2
6520: 20 26 26 20 5b 73 74 72 69 6e 67 20 65 71 75 61 && [string equa
6530: 6c 20 2d 6c 65 6e 67 74 68 20 24 6e 20 24 73 20 l -length $n $s
6540: 22 2d 65 72 72 6f 72 66 6f 72 6d 61 74 22 5d 7d "-errorformat"]}
6550: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 65 72 72 {. set err
6560: 66 6d 74 20 5b 6c 69 6e 64 65 78 20 24 73 77 69 fmt [lindex $swi
6570: 74 63 68 65 73 20 5b 69 6e 63 72 20 69 5d 5d 0a tches [incr i]].
6580: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 6e } elseif {$n
6590: 3e 3d 32 20 26 26 20 5b 73 74 72 69 6e 67 20 65 >=2 && [string e
65a0: 71 75 61 6c 20 2d 6c 65 6e 67 74 68 20 24 6e 20 qual -length $n
65b0: 24 73 20 22 2d 72 65 70 61 69 72 22 5d 7d 20 7b $s "-repair"]} {
65c0: 0a 20 20 20 20 20 20 73 65 74 20 72 65 70 61 69 . set repai
65d0: 72 20 5b 6c 69 6e 64 65 78 20 24 73 77 69 74 63 r [lindex $switc
65e0: 68 65 73 20 5b 69 6e 63 72 20 69 5d 5d 0a 20 20 hes [incr i]].
65f0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 6e 3e 3d } elseif {$n>=
6600: 32 20 26 26 20 5b 73 74 72 69 6e 67 20 65 71 75 2 && [string equ
6610: 61 6c 20 2d 6c 65 6e 67 74 68 20 24 6e 20 24 73 al -length $n $s
6620: 20 22 2d 63 6f 75 6e 74 22 5d 7d 20 7b 0a 20 20 "-count"]} {.
6630: 20 20 20 20 73 65 74 20 63 6f 75 6e 74 6f 6e 6c set countonl
6640: 79 20 31 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b y 1. } else {
6650: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 75 6e . error "un
6660: 6b 6e 6f 77 6e 20 73 77 69 74 63 68 3a 20 24 73 known switch: $s
6670: 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 ". }. }.. i
6680: 66 20 7b 24 63 6f 75 6e 74 6f 6e 6c 79 20 26 26 f {$countonly &&
6690: 20 24 65 72 72 66 6d 74 21 3d 22 22 7d 20 7b 0a $errfmt!=""} {.
66a0: 20 20 20 20 65 72 72 6f 72 20 22 43 61 6e 6e 6f error "Canno
66b0: 74 20 75 73 65 20 2d 63 6f 75 6e 74 20 61 6e 64 t use -count and
66c0: 20 2d 65 72 72 6f 72 66 6f 72 6d 61 74 20 74 6f -errorformat to
66d0: 67 65 74 68 65 72 22 0a 20 20 7d 0a 20 20 73 65 gether". }. se
66e0: 74 20 6e 54 65 73 74 6c 69 73 74 20 5b 6c 6c 65 t nTestlist [lle
66f0: 6e 67 74 68 20 24 74 65 73 74 6c 69 73 74 5d 0a ngth $testlist].
6700: 20 20 69 66 20 7b 24 6e 54 65 73 74 6c 69 73 74 if {$nTestlist
6710: 25 33 20 7c 7c 20 24 6e 54 65 73 74 6c 69 73 74 %3 || $nTestlist
6720: 3d 3d 30 20 7d 20 7b 0a 20 20 20 20 65 72 72 6f ==0 } {. erro
6730: 72 20 22 53 45 4c 45 43 54 20 74 65 73 74 20 6c r "SELECT test l
6740: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 5b 6c 6c ist contains [ll
6750: 65 6e 67 74 68 20 24 74 65 73 74 6c 69 73 74 5d ength $testlist]
6760: 20 65 6c 65 6d 65 6e 74 73 22 0a 20 20 7d 0a 0a elements". }..
6770: 20 20 65 76 61 6c 20 24 72 65 70 61 69 72 0a 20 eval $repair.
6780: 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c foreach {tn sql
6790: 20 72 65 73 7d 20 24 74 65 73 74 6c 69 73 74 20 res} $testlist
67a0: 7b 0a 20 20 20 20 69 66 20 7b 24 74 63 6c 71 75 {. if {$tclqu
67b0: 65 72 79 20 21 3d 20 22 22 7d 20 7b 0a 20 20 20 ery != ""} {.
67c0: 20 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a execsql $sql.
67d0: 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 64 6f uplevel do
67e0: 5f 74 65 73 74 20 24 7b 70 72 65 66 69 78 7d 2e _test ${prefix}.
67f0: 24 74 6e 20 5b 6c 69 73 74 20 24 74 63 6c 71 75 $tn [list $tclqu
6800: 65 72 79 5d 20 5b 6c 69 73 74 20 5b 6c 69 73 74 ery] [list [list
6810: 20 7b 2a 7d 24 72 65 73 5d 5d 0a 20 20 20 20 7d {*}$res]]. }
6820: 20 65 6c 73 65 69 66 20 7b 24 63 6f 75 6e 74 6f elseif {$counto
6830: 6e 6c 79 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 nly} {. set
6840: 20 6e 52 6f 77 20 30 0a 20 20 20 20 20 20 64 62 nRow 0. db
6850: 20 65 76 61 6c 20 24 73 71 6c 20 7b 69 6e 63 72 eval $sql {incr
6860: 20 6e 52 6f 77 7d 0a 20 20 20 20 20 20 75 70 6c nRow}. upl
6870: 65 76 65 6c 20 64 6f 5f 74 65 73 74 20 24 7b 70 evel do_test ${p
6880: 72 65 66 69 78 7d 2e 24 74 6e 20 5b 6c 69 73 74 refix}.$tn [list
6890: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 6e [list set {} $n
68a0: 52 6f 77 5d 5d 20 5b 6c 69 73 74 20 24 72 65 73 Row]] [list $res
68b0: 5d 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b ]. } elseif {
68c0: 24 65 72 72 66 6d 74 3d 3d 22 22 7d 20 7b 0a 20 $errfmt==""} {.
68d0: 20 20 20 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f uplevel do_
68e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24 7b 70 execsql_test ${p
68f0: 72 65 66 69 78 7d 2e 24 7b 74 6e 7d 20 5b 6c 69 refix}.${tn} [li
6900: 73 74 20 24 73 71 6c 5d 20 5b 6c 69 73 74 20 5b st $sql] [list [
6910: 6c 69 73 74 20 7b 2a 7d 24 72 65 73 5d 5d 0a 20 list {*}$res]].
6920: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 } else {.
6930: 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 20 set res [list
6940: 31 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 1 [string trim [
6950: 66 6f 72 6d 61 74 20 24 65 72 72 66 6d 74 20 7b format $errfmt {
6960: 2a 7d 24 72 65 73 5d 5d 5d 0a 20 20 20 20 20 20 *}$res]]].
6970: 75 70 6c 65 76 65 6c 20 64 6f 5f 63 61 74 63 68 uplevel do_catch
6980: 73 71 6c 5f 74 65 73 74 20 24 7b 70 72 65 66 69 sql_test ${prefi
6990: 78 7d 2e 24 7b 74 6e 7d 20 5b 6c 69 73 74 20 24 x}.${tn} [list $
69a0: 73 71 6c 5d 20 5b 6c 69 73 74 20 24 72 65 73 5d sql] [list $res]
69b0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 76 61 6c 20 . }. eval
69c0: 24 72 65 70 61 69 72 0a 20 20 7d 0a 0a 7d 0a 0a $repair. }..}..
69d0: 70 72 6f 63 20 64 65 6c 65 74 65 5f 61 6c 6c 5f proc delete_all_
69e0: 64 61 74 61 20 7b 7d 20 7b 0a 20 20 64 62 20 65 data {} {. db e
69f0: 76 61 6c 20 7b 53 45 4c 45 43 54 20 74 62 6c 5f val {SELECT tbl_
6a00: 6e 61 6d 65 20 41 53 20 74 20 46 52 4f 4d 20 73 name AS t FROM s
6a10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 qlite_master WHE
6a20: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 RE type = 'table
6a30: 27 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c '} {. db eval
6a40: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 5b "DELETE FROM '[
6a50: 73 74 72 69 6e 67 20 6d 61 70 20 7b 27 20 27 27 string map {' ''
6a60: 7d 20 24 74 5d 27 22 0a 20 20 7d 0a 7d 0a 0a 23 } $t]'". }.}..#
6a70: 20 52 75 6e 20 61 6e 20 53 51 4c 20 73 63 72 69 Run an SQL scri
6a80: 70 74 2e 0a 23 20 52 65 74 75 72 6e 20 74 68 65 pt..# Return the
6a90: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f number of micro
6aa0: 73 65 63 6f 6e 64 73 20 70 65 72 20 73 74 61 74 seconds per stat
6ab0: 65 6d 65 6e 74 2e 0a 23 0a 70 72 6f 63 20 73 70 ement..#.proc sp
6ac0: 65 65 64 5f 74 72 69 61 6c 20 7b 6e 61 6d 65 20 eed_trial {name
6ad0: 6e 75 6d 73 74 6d 74 20 75 6e 69 74 73 20 73 71 numstmt units sq
6ae0: 6c 7d 20 7b 0a 20 20 6f 75 74 70 75 74 32 20 2d l} {. output2 -
6af0: 6e 6f 6e 65 77 6c 69 6e 65 20 5b 66 6f 72 6d 61 nonewline [forma
6b00: 74 20 7b 25 2d 32 31 2e 32 31 73 20 7d 20 24 6e t {%-21.21s } $n
6b10: 61 6d 65 2e 2e 2e 5d 0a 20 20 66 6c 75 73 68 20 ame...]. flush
6b20: 73 74 64 6f 75 74 0a 20 20 73 65 74 20 73 70 65 stdout. set spe
6b30: 65 64 20 5b 74 69 6d 65 20 7b 73 71 6c 69 74 65 ed [time {sqlite
6b40: 33 5f 65 78 65 63 5f 6e 72 20 64 62 20 24 73 71 3_exec_nr db $sq
6b50: 6c 7d 5d 0a 20 20 73 65 74 20 74 6d 20 5b 6c 69 l}]. set tm [li
6b60: 6e 64 65 78 20 24 73 70 65 65 64 20 30 5d 0a 20 ndex $speed 0].
6b70: 20 69 66 20 7b 24 74 6d 20 3d 3d 20 30 7d 20 7b if {$tm == 0} {
6b80: 0a 20 20 20 20 73 65 74 20 72 61 74 65 20 5b 66 . set rate [f
6b90: 6f 72 6d 61 74 20 25 32 30 73 20 22 6d 61 6e 79 ormat %20s "many
6ba0: 22 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 "]. } else {.
6bb0: 20 20 73 65 74 20 72 61 74 65 20 5b 66 6f 72 6d set rate [form
6bc0: 61 74 20 25 32 30 2e 35 66 20 5b 65 78 70 72 20 at %20.5f [expr
6bd0: 7b 31 30 30 30 30 30 30 2e 30 2a 24 6e 75 6d 73 {1000000.0*$nums
6be0: 74 6d 74 2f 24 74 6d 7d 5d 5d 0a 20 20 7d 0a 20 tmt/$tm}]]. }.
6bf0: 20 73 65 74 20 75 32 20 24 75 6e 69 74 73 2f 73 set u2 $units/s
6c00: 0a 20 20 6f 75 74 70 75 74 32 20 5b 66 6f 72 6d . output2 [form
6c10: 61 74 20 7b 25 31 32 64 20 75 53 20 25 73 20 25 at {%12d uS %s %
6c20: 73 7d 20 24 74 6d 20 24 72 61 74 65 20 24 75 32 s} $tm $rate $u2
6c30: 5d 0a 20 20 67 6c 6f 62 61 6c 20 74 6f 74 61 6c ]. global total
6c40: 5f 74 69 6d 65 0a 20 20 73 65 74 20 74 6f 74 61 _time. set tota
6c50: 6c 5f 74 69 6d 65 20 5b 65 78 70 72 20 7b 24 74 l_time [expr {$t
6c60: 6f 74 61 6c 5f 74 69 6d 65 2b 24 74 6d 7d 5d 0a otal_time+$tm}].
6c70: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 73 70 65 65 lappend ::spee
6c80: 64 5f 74 72 69 61 6c 5f 74 69 6d 65 73 20 24 6e d_trial_times $n
6c90: 61 6d 65 20 24 74 6d 0a 7d 0a 70 72 6f 63 20 73 ame $tm.}.proc s
6ca0: 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 7b peed_trial_tcl {
6cb0: 6e 61 6d 65 20 6e 75 6d 73 74 6d 74 20 75 6e 69 name numstmt uni
6cc0: 74 73 20 73 63 72 69 70 74 7d 20 7b 0a 20 20 6f ts script} {. o
6cd0: 75 74 70 75 74 32 20 2d 6e 6f 6e 65 77 6c 69 6e utput2 -nonewlin
6ce0: 65 20 5b 66 6f 72 6d 61 74 20 7b 25 2d 32 31 2e e [format {%-21.
6cf0: 32 31 73 20 7d 20 24 6e 61 6d 65 2e 2e 2e 5d 0a 21s } $name...].
6d00: 20 20 66 6c 75 73 68 20 73 74 64 6f 75 74 0a 20 flush stdout.
6d10: 20 73 65 74 20 73 70 65 65 64 20 5b 74 69 6d 65 set speed [time
6d20: 20 7b 65 76 61 6c 20 24 73 63 72 69 70 74 7d 5d {eval $script}]
6d30: 0a 20 20 73 65 74 20 74 6d 20 5b 6c 69 6e 64 65 . set tm [linde
6d40: 78 20 24 73 70 65 65 64 20 30 5d 0a 20 20 69 66 x $speed 0]. if
6d50: 20 7b 24 74 6d 20 3d 3d 20 30 7d 20 7b 0a 20 20 {$tm == 0} {.
6d60: 20 20 73 65 74 20 72 61 74 65 20 5b 66 6f 72 6d set rate [form
6d70: 61 74 20 25 32 30 73 20 22 6d 61 6e 79 22 5d 0a at %20s "many"].
6d80: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 } else {. s
6d90: 65 74 20 72 61 74 65 20 5b 66 6f 72 6d 61 74 20 et rate [format
6da0: 25 32 30 2e 35 66 20 5b 65 78 70 72 20 7b 31 30 %20.5f [expr {10
6db0: 30 30 30 30 30 2e 30 2a 24 6e 75 6d 73 74 6d 74 00000.0*$numstmt
6dc0: 2f 24 74 6d 7d 5d 5d 0a 20 20 7d 0a 20 20 73 65 /$tm}]]. }. se
6dd0: 74 20 75 32 20 24 75 6e 69 74 73 2f 73 0a 20 20 t u2 $units/s.
6de0: 6f 75 74 70 75 74 32 20 5b 66 6f 72 6d 61 74 20 output2 [format
6df0: 7b 25 31 32 64 20 75 53 20 25 73 20 25 73 7d 20 {%12d uS %s %s}
6e00: 24 74 6d 20 24 72 61 74 65 20 24 75 32 5d 0a 20 $tm $rate $u2].
6e10: 20 67 6c 6f 62 61 6c 20 74 6f 74 61 6c 5f 74 69 global total_ti
6e20: 6d 65 0a 20 20 73 65 74 20 74 6f 74 61 6c 5f 74 me. set total_t
6e30: 69 6d 65 20 5b 65 78 70 72 20 7b 24 74 6f 74 61 ime [expr {$tota
6e40: 6c 5f 74 69 6d 65 2b 24 74 6d 7d 5d 0a 20 20 6c l_time+$tm}]. l
6e50: 61 70 70 65 6e 64 20 3a 3a 73 70 65 65 64 5f 74 append ::speed_t
6e60: 72 69 61 6c 5f 74 69 6d 65 73 20 24 6e 61 6d 65 rial_times $name
6e70: 20 24 74 6d 0a 7d 0a 70 72 6f 63 20 73 70 65 65 $tm.}.proc spee
6e80: 64 5f 74 72 69 61 6c 5f 69 6e 69 74 20 7b 6e 61 d_trial_init {na
6e90: 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 74 me} {. global t
6ea0: 6f 74 61 6c 5f 74 69 6d 65 0a 20 20 73 65 74 20 otal_time. set
6eb0: 74 6f 74 61 6c 5f 74 69 6d 65 20 30 0a 20 20 73 total_time 0. s
6ec0: 65 74 20 3a 3a 73 70 65 65 64 5f 74 72 69 61 6c et ::speed_trial
6ed0: 5f 74 69 6d 65 73 20 5b 6c 69 73 74 5d 0a 20 20 _times [list].
6ee0: 73 71 6c 69 74 65 33 20 76 65 72 73 64 62 20 3a sqlite3 versdb :
6ef0: 6d 65 6d 6f 72 79 3a 0a 20 20 73 65 74 20 76 65 memory:. set ve
6f00: 72 73 20 5b 76 65 72 73 64 62 20 6f 6e 65 20 7b rs [versdb one {
6f10: 53 45 4c 45 43 54 20 73 71 6c 69 74 65 5f 73 6f SELECT sqlite_so
6f20: 75 72 63 65 5f 69 64 28 29 7d 5d 0a 20 20 76 65 urce_id()}]. ve
6f30: 72 73 64 62 20 63 6c 6f 73 65 0a 20 20 6f 75 74 rsdb close. out
6f40: 70 75 74 32 20 22 53 51 4c 69 74 65 20 24 76 65 put2 "SQLite $ve
6f50: 72 73 22 0a 7d 0a 70 72 6f 63 20 73 70 65 65 64 rs".}.proc speed
6f60: 5f 74 72 69 61 6c 5f 73 75 6d 6d 61 72 79 20 7b _trial_summary {
6f70: 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c name} {. global
6f80: 20 74 6f 74 61 6c 5f 74 69 6d 65 0a 20 20 6f 75 total_time. ou
6f90: 74 70 75 74 32 20 5b 66 6f 72 6d 61 74 20 7b 25 tput2 [format {%
6fa0: 2d 32 31 2e 32 31 73 20 25 31 32 64 20 75 53 20 -21.21s %12d uS
6fb0: 54 4f 54 41 4c 7d 20 24 6e 61 6d 65 20 24 74 6f TOTAL} $name $to
6fc0: 74 61 6c 5f 74 69 6d 65 5d 0a 0a 20 20 69 66 20 tal_time].. if
6fd0: 7b 20 30 20 7d 20 7b 0a 20 20 20 20 73 71 6c 69 { 0 } {. sqli
6fe0: 74 65 33 20 76 65 72 73 64 62 20 3a 6d 65 6d 6f te3 versdb :memo
6ff0: 72 79 3a 0a 20 20 20 20 73 65 74 20 76 65 72 73 ry:. set vers
7000: 20 5b 6c 69 6e 64 65 78 20 5b 76 65 72 73 64 62 [lindex [versdb
7010: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 73 71 6c one {SELECT sql
7020: 69 74 65 5f 73 6f 75 72 63 65 5f 69 64 28 29 7d ite_source_id()}
7030: 5d 20 30 5d 0a 20 20 20 20 76 65 72 73 64 62 20 ] 0]. versdb
7040: 63 6c 6f 73 65 0a 20 20 20 20 6f 75 74 70 75 74 close. output
7050: 32 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2 "CREATE TABLE
7060: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 69 IF NOT EXISTS ti
7070: 6d 65 28 76 65 72 73 69 6f 6e 2c 20 73 63 72 69 me(version, scri
7080: 70 74 2c 20 74 65 73 74 2c 20 75 73 29 3b 22 0a pt, test, us);".
7090: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 65 73 foreach {tes
70a0: 74 20 75 73 7d 20 24 3a 3a 73 70 65 65 64 5f 74 t us} $::speed_t
70b0: 72 69 61 6c 5f 74 69 6d 65 73 20 7b 0a 20 20 20 rial_times {.
70c0: 20 20 20 6f 75 74 70 75 74 32 20 22 49 4e 53 45 output2 "INSE
70d0: 52 54 20 49 4e 54 4f 20 74 69 6d 65 20 56 41 4c RT INTO time VAL
70e0: 55 45 53 28 27 24 76 65 72 73 27 2c 20 27 24 6e UES('$vers', '$n
70f0: 61 6d 65 27 2c 20 27 24 74 65 73 74 27 2c 20 24 ame', '$test', $
7100: 75 73 29 3b 22 0a 20 20 20 20 7d 0a 20 20 7d 0a us);". }. }.
7110: 7d 0a 0a 23 20 52 75 6e 20 74 68 69 73 20 72 6f }..# Run this ro
7120: 75 74 69 6e 65 20 6c 61 73 74 0a 23 0a 70 72 6f utine last.#.pro
7130: 63 20 66 69 6e 69 73 68 5f 74 65 73 74 20 7b 7d c finish_test {}
7140: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 {. catch {db c
7150: 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64 lose}. catch {d
7160: 62 31 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 b1 close}. catc
7170: 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 h {db2 close}.
7180: 63 61 74 63 68 20 7b 64 62 33 20 63 6c 6f 73 65 catch {db3 close
7190: 7d 0a 20 20 69 66 20 7b 30 3d 3d 5b 69 6e 66 6f }. if {0==[info
71a0: 20 65 78 69 73 74 73 20 3a 3a 53 4c 41 56 45 5d exists ::SLAVE]
71b0: 7d 20 7b 20 66 69 6e 61 6c 69 7a 65 5f 74 65 73 } { finalize_tes
71c0: 74 69 6e 67 20 7d 0a 7d 0a 70 72 6f 63 20 66 69 ting }.}.proc fi
71d0: 6e 61 6c 69 7a 65 5f 74 65 73 74 69 6e 67 20 7b nalize_testing {
71e0: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 73 71 6c } {. global sql
71f0: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f ite_open_file_co
7200: 75 6e 74 0a 0a 20 20 73 65 74 20 6f 6d 69 74 4c unt.. set omitL
7210: 69 73 74 20 5b 73 65 74 5f 74 65 73 74 5f 63 6f ist [set_test_co
7220: 75 6e 74 65 72 20 6f 6d 69 74 5f 6c 69 73 74 5d unter omit_list]
7230: 0a 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c .. catch {db cl
7240: 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 ose}. catch {db
7250: 32 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 2 close}. catch
7260: 20 7b 64 62 33 20 63 6c 6f 73 65 7d 0a 0a 20 20 {db3 close}..
7270: 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a vfs_unlink_test.
7280: 20 20 73 71 6c 69 74 65 33 20 64 62 20 7b 7d 0a sqlite3 db {}.
7290: 20 20 23 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 # sqlite3_clea
72a0: 72 5f 74 73 64 5f 6d 65 6d 64 65 62 75 67 0a 20 r_tsd_memdebug.
72b0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 db close. sqli
72c0: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 te3_reset_auto_e
72d0: 78 74 65 6e 73 69 6f 6e 0a 0a 20 20 73 71 6c 69 xtension.. sqli
72e0: 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 te3_soft_heap_li
72f0: 6d 69 74 20 30 0a 20 20 73 65 74 20 6e 54 65 73 mit 0. set nTes
7300: 74 20 5b 69 6e 63 72 5f 6e 74 65 73 74 5d 0a 20 t [incr_ntest].
7310: 20 73 65 74 20 6e 45 72 72 20 5b 73 65 74 5f 74 set nErr [set_t
7320: 65 73 74 5f 63 6f 75 6e 74 65 72 20 65 72 72 6f est_counter erro
7330: 72 73 5d 0a 0a 20 20 73 65 74 20 6e 4b 6e 6f 77 rs].. set nKnow
7340: 6e 20 30 0a 20 20 69 66 20 7b 5b 66 69 6c 65 20 n 0. if {[file
7350: 72 65 61 64 61 62 6c 65 20 6b 6e 6f 77 6e 2d 70 readable known-p
7360: 72 6f 62 6c 65 6d 73 2e 74 78 74 5d 7d 20 7b 0a roblems.txt]} {.
7370: 20 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e set fd [open
7380: 20 6b 6e 6f 77 6e 2d 70 72 6f 62 6c 65 6d 73 2e known-problems.
7390: 74 78 74 5d 0a 20 20 20 20 73 65 74 20 63 6f 6e txt]. set con
73a0: 74 65 6e 74 20 5b 72 65 61 64 20 24 66 64 5d 0a tent [read $fd].
73b0: 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 close $fd.
73c0: 20 20 66 6f 72 65 61 63 68 20 78 20 24 63 6f 6e foreach x $con
73d0: 74 65 6e 74 20 7b 73 65 74 20 6b 6e 6f 77 6e 5f tent {set known_
73e0: 65 72 72 6f 72 28 24 78 29 20 31 7d 0a 20 20 20 error($x) 1}.
73f0: 20 66 6f 72 65 61 63 68 20 78 20 5b 73 65 74 5f foreach x [set_
7400: 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 66 61 69 test_counter fai
7410: 6c 5f 6c 69 73 74 5d 20 7b 0a 20 20 20 20 20 20 l_list] {.
7420: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 if {[info exists
7430: 20 6b 6e 6f 77 6e 5f 65 72 72 6f 72 28 24 78 29 known_error($x)
7440: 5d 7d 20 7b 69 6e 63 72 20 6e 4b 6e 6f 77 6e 7d ]} {incr nKnown}
7450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 . }. }. if
7460: 7b 24 6e 4b 6e 6f 77 6e 3e 30 7d 20 7b 0a 20 20 {$nKnown>0} {.
7470: 20 20 6f 75 74 70 75 74 32 20 22 5b 65 78 70 72 output2 "[expr
7480: 20 7b 24 6e 45 72 72 2d 24 6e 4b 6e 6f 77 6e 7d {$nErr-$nKnown}
7490: 5d 20 6e 65 77 20 65 72 72 6f 72 73 20 61 6e 64 ] new errors and
74a0: 20 24 6e 4b 6e 6f 77 6e 20 6b 6e 6f 77 6e 20 65 $nKnown known e
74b0: 72 72 6f 72 73 5c 0a 20 20 20 20 20 20 20 20 20 rrors\.
74c0: 6f 75 74 20 6f 66 20 24 6e 54 65 73 74 20 74 65 out of $nTest te
74d0: 73 74 73 22 0a 20 20 7d 20 65 6c 73 65 20 7b 0a sts". } else {.
74e0: 20 20 20 20 73 65 74 20 63 70 75 69 6e 66 6f 20 set cpuinfo
74f0: 7b 7d 0a 20 20 20 20 69 66 20 7b 5b 63 61 74 63 {}. if {[catc
7500: 68 20 7b 65 78 65 63 20 68 6f 73 74 6e 61 6d 65 h {exec hostname
7510: 7d 20 68 6e 61 6d 65 5d 3d 3d 30 7d 20 7b 73 65 } hname]==0} {se
7520: 74 20 63 70 75 69 6e 66 6f 20 5b 73 74 72 69 6e t cpuinfo [strin
7530: 67 20 74 72 69 6d 20 24 68 6e 61 6d 65 5d 7d 0a g trim $hname]}.
7540: 20 20 20 20 61 70 70 65 6e 64 20 63 70 75 69 6e append cpuin
7550: 66 6f 20 22 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 fo " $::tcl_plat
7560: 66 6f 72 6d 28 6f 73 29 22 0a 20 20 20 20 61 70 form(os)". ap
7570: 70 65 6e 64 20 63 70 75 69 6e 66 6f 20 22 20 5b pend cpuinfo " [
7580: 65 78 70 72 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 expr {$::tcl_pla
7590: 74 66 6f 72 6d 28 70 6f 69 6e 74 65 72 53 69 7a tform(pointerSiz
75a0: 65 29 2a 38 7d 5d 2d 62 69 74 22 0a 20 20 20 20 e)*8}]-bit".
75b0: 61 70 70 65 6e 64 20 63 70 75 69 6e 66 6f 20 22 append cpuinfo "
75c0: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 45 20 [string map {E
75d0: 2d 65 7d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 -e} $::tcl_platf
75e0: 6f 72 6d 28 62 79 74 65 4f 72 64 65 72 29 5d 22 orm(byteOrder)]"
75f0: 0a 20 20 20 20 6f 75 74 70 75 74 32 20 22 53 51 . output2 "SQ
7600: 4c 69 74 65 20 5b 73 71 6c 69 74 65 33 20 2d 73 Lite [sqlite3 -s
7610: 6f 75 72 63 65 69 64 5d 22 0a 20 20 20 20 6f 75 ourceid]". ou
7620: 74 70 75 74 32 20 22 24 6e 45 72 72 20 65 72 72 tput2 "$nErr err
7630: 6f 72 73 20 6f 75 74 20 6f 66 20 24 6e 54 65 73 ors out of $nTes
7640: 74 20 74 65 73 74 73 20 6f 6e 20 24 63 70 75 69 t tests on $cpui
7650: 6e 66 6f 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 nfo". }. if {$
7660: 6e 45 72 72 3e 24 6e 4b 6e 6f 77 6e 7d 20 7b 0a nErr>$nKnown} {.
7670: 20 20 20 20 6f 75 74 70 75 74 32 20 2d 6e 6f 6e output2 -non
7680: 65 77 6c 69 6e 65 20 22 21 46 61 69 6c 75 72 65 ewline "!Failure
7690: 73 20 6f 6e 20 74 68 65 73 65 20 74 65 73 74 73 s on these tests
76a0: 3a 22 0a 20 20 20 20 66 6f 72 65 61 63 68 20 78 :". foreach x
76b0: 20 5b 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74 [set_test_count
76c0: 65 72 20 66 61 69 6c 5f 6c 69 73 74 5d 20 7b 0a er fail_list] {.
76d0: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f if {![info
76e0: 20 65 78 69 73 74 73 20 6b 6e 6f 77 6e 5f 65 72 exists known_er
76f0: 72 6f 72 28 24 78 29 5d 7d 20 7b 6f 75 74 70 75 ror($x)]} {outpu
7700: 74 32 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 t2 -nonewline "
7710: 24 78 22 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f $x"}. }. o
7720: 75 74 70 75 74 32 20 22 22 0a 20 20 7d 0a 20 20 utput2 "". }.
7730: 66 6f 72 65 61 63 68 20 77 61 72 6e 69 6e 67 20 foreach warning
7740: 5b 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74 65 [set_test_counte
7750: 72 20 77 61 72 6e 5f 6c 69 73 74 5d 20 7b 0a 20 r warn_list] {.
7760: 20 20 20 6f 75 74 70 75 74 32 20 22 57 61 72 6e output2 "Warn
7770: 69 6e 67 3a 20 24 77 61 72 6e 69 6e 67 22 0a 20 ing: $warning".
7780: 20 7d 0a 20 20 72 75 6e 5f 74 68 72 65 61 64 5f }. run_thread_
7790: 74 65 73 74 73 20 31 0a 20 20 69 66 20 7b 5b 6c tests 1. if {[l
77a0: 6c 65 6e 67 74 68 20 24 6f 6d 69 74 4c 69 73 74 length $omitList
77b0: 5d 3e 30 7d 20 7b 0a 20 20 20 20 6f 75 74 70 75 ]>0} {. outpu
77c0: 74 32 20 22 4f 6d 69 74 74 65 64 20 74 65 73 74 t2 "Omitted test
77d0: 20 63 61 73 65 73 3a 22 0a 20 20 20 20 73 65 74 cases:". set
77e0: 20 70 72 65 63 20 7b 7d 0a 20 20 20 20 66 6f 72 prec {}. for
77f0: 65 61 63 68 20 7b 72 65 63 7d 20 5b 6c 73 6f 72 each {rec} [lsor
7800: 74 20 24 6f 6d 69 74 4c 69 73 74 5d 20 7b 0a 20 t $omitList] {.
7810: 20 20 20 20 20 69 66 20 7b 24 72 65 63 3d 3d 24 if {$rec==$
7820: 70 72 65 63 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 prec} continue.
7830: 20 20 20 20 20 73 65 74 20 70 72 65 63 20 24 72 set prec $r
7840: 65 63 0a 20 20 20 20 20 20 6f 75 74 70 75 74 32 ec. output2
7850: 20 5b 66 6f 72 6d 61 74 20 7b 2e 20 20 25 2d 31 [format {. %-1
7860: 32 73 20 25 73 7d 20 5b 6c 69 6e 64 65 78 20 24 2s %s} [lindex $
7870: 72 65 63 20 30 5d 20 5b 6c 69 6e 64 65 78 20 24 rec 0] [lindex $
7880: 72 65 63 20 31 5d 5d 0a 20 20 20 20 7d 0a 20 20 rec 1]]. }.
7890: 7d 0a 20 20 69 66 20 7b 24 6e 45 72 72 3e 30 20 }. if {$nErr>0
78a0: 26 26 20 21 5b 77 6f 72 6b 69 6e 67 5f 36 34 62 && ![working_64b
78b0: 69 74 5f 69 6e 74 5d 7d 20 7b 0a 20 20 20 20 6f it_int]} {. o
78c0: 75 74 70 75 74 32 20 22 2a 2a 2a 2a 2a 2a 2a 2a utput2 "********
78d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
78e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
78f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 22 0a 20 20 20 20 **********".
7910: 6f 75 74 70 75 74 32 20 22 4e 2e 42 2e 3a 20 20 output2 "N.B.:
7920: 54 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 The version of T
7930: 43 4c 20 74 68 61 74 20 79 6f 75 20 75 73 65 64 CL that you used
7940: 20 74 6f 20 62 75 69 6c 64 20 74 68 69 73 20 74 to build this t
7950: 65 73 74 20 68 61 72 6e 65 73 73 22 0a 20 20 20 est harness".
7960: 20 6f 75 74 70 75 74 32 20 22 69 73 20 64 65 66 output2 "is def
7970: 65 63 74 69 76 65 20 69 6e 20 74 68 61 74 20 69 ective in that i
7980: 74 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f t does not suppo
7990: 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 rt 64-bit intege
79a0: 72 73 2e 20 20 53 6f 6d 65 20 6f 72 22 0a 20 20 rs. Some or".
79b0: 20 20 6f 75 74 70 75 74 32 20 22 61 6c 6c 20 6f output2 "all o
79c0: 66 20 74 68 65 20 74 65 73 74 20 66 61 69 6c 75 f the test failu
79d0: 72 65 73 20 61 62 6f 76 65 20 6d 69 67 68 74 20 res above might
79e0: 62 65 20 61 20 72 65 73 75 6c 74 20 66 72 6f 6d be a result from
79f0: 20 74 68 69 73 20 64 65 66 65 63 74 22 0a 20 20 this defect".
7a00: 20 20 6f 75 74 70 75 74 32 20 22 69 6e 20 79 6f output2 "in yo
7a10: 75 72 20 54 43 4c 20 62 75 69 6c 64 2e 22 0a 20 ur TCL build.".
7a20: 20 20 20 6f 75 74 70 75 74 32 20 22 2a 2a 2a 2a output2 "****
7a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 22 0a **************".
7a70: 20 20 7d 0a 20 20 69 66 20 7b 24 3a 3a 63 6d 64 }. if {$::cmd
7a80: 6c 69 6e 65 61 72 67 28 62 69 6e 61 72 79 6c 6f linearg(binarylo
7a90: 67 29 7d 20 7b 0a 20 20 20 20 76 66 73 6c 6f 67 g)} {. vfslog
7aa0: 20 66 69 6e 61 6c 69 7a 65 20 62 69 6e 61 72 79 finalize binary
7ab0: 6c 6f 67 0a 20 20 7d 0a 20 20 69 66 20 7b 24 73 log. }. if {$s
7ac0: 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f qlite_open_file_
7ad0: 63 6f 75 6e 74 7d 20 7b 0a 20 20 20 20 6f 75 74 count} {. out
7ae0: 70 75 74 32 20 22 24 73 71 6c 69 74 65 5f 6f 70 put2 "$sqlite_op
7af0: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 20 66 69 en_file_count fi
7b00: 6c 65 73 20 77 65 72 65 20 6c 65 66 74 20 6f 70 les were left op
7b10: 65 6e 22 0a 20 20 20 20 69 6e 63 72 20 6e 45 72 en". incr nEr
7b20: 72 0a 20 20 7d 0a 20 20 69 66 20 7b 5b 6c 69 6e r. }. if {[lin
7b30: 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 dex [sqlite3_sta
7b40: 74 75 73 20 53 51 4c 49 54 45 5f 53 54 41 54 55 tus SQLITE_STATU
7b50: 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 20 30 S_MALLOC_COUNT 0
7b60: 5d 20 31 5d 3e 30 20 7c 7c 0a 20 20 20 20 20 20 ] 1]>0 ||.
7b70: 20 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 [sqlite3
7b80: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 5d 3e 30 7d _memory_used]>0}
7b90: 20 7b 0a 20 20 20 20 6f 75 74 70 75 74 32 20 22 {. output2 "
7ba0: 55 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 3a 20 Unfreed memory:
7bb0: 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f [sqlite3_memory_
7bc0: 75 73 65 64 5d 20 62 79 74 65 73 20 69 6e 5c 0a used] bytes in\.
7bd0: 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78 [lindex
7be0: 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 [sqlite3_status
7bf0: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d SQLITE_STATUS_M
7c00: 41 4c 4c 4f 43 5f 43 4f 55 4e 54 20 30 5d 20 31 ALLOC_COUNT 0] 1
7c10: 5d 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 22 0a 20 ] allocations".
7c20: 20 20 20 69 6e 63 72 20 6e 45 72 72 0a 20 20 20 incr nErr.
7c30: 20 69 66 63 61 70 61 62 6c 65 20 6d 65 6d 64 65 ifcapable memde
7c40: 62 75 67 7c 7c 6d 65 6d 35 7c 7c 28 6d 65 6d 33 bug||mem5||(mem3
7c50: 26 26 64 65 62 75 67 29 20 7b 0a 20 20 20 20 20 &&debug) {.
7c60: 20 6f 75 74 70 75 74 32 20 22 57 72 69 74 69 6e output2 "Writin
7c70: 67 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 g unfreed memory
7c80: 20 6c 6f 67 20 74 6f 20 5c 22 2e 2f 6d 65 6d 6c log to \"./meml
7c90: 65 61 6b 2e 74 78 74 5c 22 22 0a 20 20 20 20 20 eak.txt\"".
7ca0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 sqlite3_memdebu
7cb0: 67 5f 64 75 6d 70 20 2e 2f 6d 65 6d 6c 65 61 6b g_dump ./memleak
7cc0: 2e 74 78 74 0a 20 20 20 20 7d 0a 20 20 7d 20 65 .txt. }. } e
7cd0: 6c 73 65 20 7b 0a 20 20 20 20 6f 75 74 70 75 74 lse {. output
7ce0: 32 20 22 41 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 2 "All memory al
7cf0: 6c 6f 63 61 74 69 6f 6e 73 20 66 72 65 65 64 20 locations freed
7d00: 2d 20 6e 6f 20 6c 65 61 6b 73 22 0a 20 20 20 20 - no leaks".
7d10: 69 66 63 61 70 61 62 6c 65 20 6d 65 6d 64 65 62 ifcapable memdeb
7d20: 75 67 7c 7c 6d 65 6d 35 20 7b 0a 20 20 20 20 20 ug||mem5 {.
7d30: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 sqlite3_memdebu
7d40: 67 5f 64 75 6d 70 20 2e 2f 6d 65 6d 75 73 61 67 g_dump ./memusag
7d50: 65 2e 74 78 74 0a 20 20 20 20 7d 0a 20 20 7d 0a e.txt. }. }.
7d60: 20 20 73 68 6f 77 5f 6d 65 6d 73 74 61 74 73 0a show_memstats.
7d70: 20 20 6f 75 74 70 75 74 32 20 22 4d 61 78 69 6d output2 "Maxim
7d80: 75 6d 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 3a um memory usage:
7d90: 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 [sqlite3_memory
7da0: 5f 68 69 67 68 77 61 74 65 72 20 31 5d 20 62 79 _highwater 1] by
7db0: 74 65 73 22 0a 20 20 6f 75 74 70 75 74 32 20 22 tes". output2 "
7dc0: 43 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 75 Current memory u
7dd0: 73 61 67 65 3a 20 5b 73 71 6c 69 74 65 33 5f 6d sage: [sqlite3_m
7de0: 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 5d emory_highwater]
7df0: 20 62 79 74 65 73 22 0a 20 20 69 66 20 7b 5b 69 bytes". if {[i
7e00: 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 73 71 6c nfo commands sql
7e10: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6d 61 ite3_memdebug_ma
7e20: 6c 6c 6f 63 5f 63 6f 75 6e 74 5d 20 6e 65 20 22 lloc_count] ne "
7e30: 22 7d 20 7b 0a 20 20 20 20 6f 75 74 70 75 74 32 "} {. output2
7e40: 20 22 4e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c "Number of mall
7e50: 6f 63 28 29 20 20 3a 20 5b 73 71 6c 69 74 65 33 oc() : [sqlite3
7e60: 5f 6d 65 6d 64 65 62 75 67 5f 6d 61 6c 6c 6f 63 _memdebug_malloc
7e70: 5f 63 6f 75 6e 74 5d 20 63 61 6c 6c 73 22 0a 20 _count] calls".
7e80: 20 7d 0a 20 20 69 66 20 7b 24 3a 3a 63 6d 64 6c }. if {$::cmdl
7e90: 69 6e 65 61 72 67 28 6d 61 6c 6c 6f 63 74 72 61 inearg(malloctra
7ea0: 63 65 29 7d 20 7b 0a 20 20 20 20 6f 75 74 70 75 ce)} {. outpu
7eb0: 74 32 20 22 57 72 69 74 69 6e 67 20 6d 61 6c 6c t2 "Writing mall
7ec0: 6f 63 73 2e 73 71 6c 2e 2e 2e 22 0a 20 20 20 20 ocs.sql...".
7ed0: 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 5f 73 71 6c memdebug_log_sql
7ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d . sqlite3_mem
7ef0: 64 65 62 75 67 5f 6c 6f 67 20 73 74 6f 70 0a 20 debug_log stop.
7f00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 sqlite3_memde
7f10: 62 75 67 5f 6c 6f 67 20 63 6c 65 61 72 0a 0a 20 bug_log clear..
7f20: 20 20 20 69 66 20 7b 5b 73 71 6c 69 74 65 33 5f if {[sqlite3_
7f30: 6d 65 6d 6f 72 79 5f 75 73 65 64 5d 3e 30 7d 20 memory_used]>0}
7f40: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 32 20 {. output2
7f50: 22 57 72 69 74 69 6e 67 20 6c 65 61 6b 73 2e 73 "Writing leaks.s
7f60: 71 6c 2e 2e 2e 22 0a 20 20 20 20 20 20 73 71 6c ql...". sql
7f70: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f ite3_memdebug_lo
7f80: 67 20 73 79 6e 63 0a 20 20 20 20 20 20 6d 65 6d g sync. mem
7f90: 64 65 62 75 67 5f 6c 6f 67 5f 73 71 6c 20 6c 65 debug_log_sql le
7fa0: 61 6b 73 2e 73 71 6c 0a 20 20 20 20 7d 0a 20 20 aks.sql. }.
7fb0: 7d 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 }. foreach f [g
7fc0: 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 lob -nocomplain
7fd0: 74 65 73 74 2e 64 62 2d 2a 2d 6a 6f 75 72 6e 61 test.db-*-journa
7fe0: 6c 5d 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 l] {. forcede
7ff0: 6c 65 74 65 20 24 66 0a 20 20 7d 0a 20 20 66 6f lete $f. }. fo
8000: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e reach f [glob -n
8010: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 ocomplain test.d
8020: 62 2d 6d 6a 2a 5d 20 7b 0a 20 20 20 20 66 6f 72 b-mj*] {. for
8030: 63 65 64 65 6c 65 74 65 20 24 66 0a 20 20 7d 0a cedelete $f. }.
8040: 20 20 65 78 69 74 20 5b 65 78 70 72 20 7b 24 6e exit [expr {$n
8050: 45 72 72 3e 30 7d 5d 0a 7d 0a 0a 23 20 44 69 73 Err>0}].}..# Dis
8060: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 play memory stat
8070: 69 73 74 69 63 73 20 66 6f 72 20 61 6e 61 6c 79 istics for analy
8080: 73 69 73 20 61 6e 64 20 64 65 62 75 67 67 69 6e sis and debuggin
8090: 67 20 70 75 72 70 6f 73 65 73 2e 0a 23 0a 70 72 g purposes..#.pr
80a0: 6f 63 20 73 68 6f 77 5f 6d 65 6d 73 74 61 74 73 oc show_memstats
80b0: 20 7b 7d 20 7b 0a 20 20 73 65 74 20 78 20 5b 73 {} {. set x [s
80c0: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20 53 51 qlite3_status SQ
80d0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f LITE_STATUS_MEMO
80e0: 52 59 5f 55 53 45 44 20 30 5d 0a 20 20 73 65 74 RY_USED 0]. set
80f0: 20 79 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 y [sqlite3_stat
8100: 75 73 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 us SQLITE_STATUS
8110: 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 20 30 5d 0a _MALLOC_SIZE 0].
8120: 20 20 73 65 74 20 76 61 6c 20 5b 66 6f 72 6d 61 set val [forma
8130: 74 20 7b 6e 6f 77 20 25 31 30 64 20 20 6d 61 78 t {now %10d max
8140: 20 25 31 30 64 20 20 6d 61 78 2d 73 69 7a 65 20 %10d max-size
8150: 25 31 30 64 7d 20 5c 0a 20 20 20 20 20 20 20 20 %10d} \.
8160: 20 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 78 [lindex $x
8170: 20 31 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20 32 1] [lindex $x 2
8180: 5d 20 5b 6c 69 6e 64 65 78 20 24 79 20 32 5d 5d ] [lindex $y 2]]
8190: 0a 20 20 6f 75 74 70 75 74 31 20 22 4d 65 6d 6f . output1 "Memo
81a0: 72 79 20 75 73 65 64 3a 20 20 20 20 20 20 20 20 ry used:
81b0: 20 20 24 76 61 6c 22 0a 20 20 73 65 74 20 78 20 $val". set x
81c0: 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20 [sqlite3_status
81d0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 SQLITE_STATUS_MA
81e0: 4c 4c 4f 43 5f 43 4f 55 4e 54 20 30 5d 0a 20 20 LLOC_COUNT 0].
81f0: 73 65 74 20 76 61 6c 20 5b 66 6f 72 6d 61 74 20 set val [format
8200: 7b 6e 6f 77 20 25 31 30 64 20 20 6d 61 78 20 25 {now %10d max %
8210: 31 30 64 7d 20 5b 6c 69 6e 64 65 78 20 24 78 20 10d} [lindex $x
8220: 31 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20 32 5d 1] [lindex $x 2]
8230: 5d 0a 20 20 6f 75 74 70 75 74 31 20 22 41 6c 6c ]. output1 "All
8240: 6f 63 61 74 69 6f 6e 20 63 6f 75 6e 74 3a 20 20 ocation count:
8250: 20 20 20 24 76 61 6c 22 0a 20 20 73 65 74 20 78 $val". set x
8260: 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 [sqlite3_status
8270: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 SQLITE_STATUS_P
8280: 41 47 45 43 41 43 48 45 5f 55 53 45 44 20 30 5d AGECACHE_USED 0]
8290: 0a 20 20 73 65 74 20 79 20 5b 73 71 6c 69 74 65 . set y [sqlite
82a0: 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54 45 5f 3_status SQLITE_
82b0: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 STATUS_PAGECACHE
82c0: 5f 53 49 5a 45 20 30 5d 0a 20 20 73 65 74 20 76 _SIZE 0]. set v
82d0: 61 6c 20 5b 66 6f 72 6d 61 74 20 7b 6e 6f 77 20 al [format {now
82e0: 25 31 30 64 20 20 6d 61 78 20 25 31 30 64 20 20 %10d max %10d
82f0: 6d 61 78 2d 73 69 7a 65 20 25 31 30 64 7d 20 5c max-size %10d} \
8300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b . [
8310: 6c 69 6e 64 65 78 20 24 78 20 31 5d 20 5b 6c 69 lindex $x 1] [li
8320: 6e 64 65 78 20 24 78 20 32 5d 20 5b 6c 69 6e 64 ndex $x 2] [lind
8330: 65 78 20 24 79 20 32 5d 5d 0a 20 20 6f 75 74 70 ex $y 2]]. outp
8340: 75 74 31 20 22 50 61 67 65 2d 63 61 63 68 65 20 ut1 "Page-cache
8350: 75 73 65 64 3a 20 20 20 20 20 20 24 76 61 6c 22 used: $val"
8360: 0a 20 20 73 65 74 20 78 20 5b 73 71 6c 69 74 65 . set x [sqlite
8370: 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54 45 5f 3_status SQLITE_
8380: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 STATUS_PAGECACHE
8390: 5f 4f 56 45 52 46 4c 4f 57 20 30 5d 0a 20 20 73 _OVERFLOW 0]. s
83a0: 65 74 20 76 61 6c 20 5b 66 6f 72 6d 61 74 20 7b et val [format {
83b0: 6e 6f 77 20 25 31 30 64 20 20 6d 61 78 20 25 31 now %10d max %1
83c0: 30 64 7d 20 5b 6c 69 6e 64 65 78 20 24 78 20 31 0d} [lindex $x 1
83d0: 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20 32 5d 5d ] [lindex $x 2]]
83e0: 0a 20 20 6f 75 74 70 75 74 31 20 22 50 61 67 65 . output1 "Page
83f0: 2d 63 61 63 68 65 20 6f 76 65 72 66 6c 6f 77 3a -cache overflow:
8400: 20 20 24 76 61 6c 22 0a 20 20 73 65 74 20 78 20 $val". set x
8410: 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20 [sqlite3_status
8420: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 SQLITE_STATUS_SC
8430: 52 41 54 43 48 5f 55 53 45 44 20 30 5d 0a 20 20 RATCH_USED 0].
8440: 73 65 74 20 76 61 6c 20 5b 66 6f 72 6d 61 74 20 set val [format
8450: 7b 6e 6f 77 20 25 31 30 64 20 20 6d 61 78 20 25 {now %10d max %
8460: 31 30 64 7d 20 5b 6c 69 6e 64 65 78 20 24 78 20 10d} [lindex $x
8470: 31 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20 32 5d 1] [lindex $x 2]
8480: 5d 0a 20 20 6f 75 74 70 75 74 31 20 22 53 63 72 ]. output1 "Scr
8490: 61 74 63 68 20 6d 65 6d 6f 72 79 20 75 73 65 64 atch memory used
84a0: 3a 20 20 24 76 61 6c 22 0a 20 20 73 65 74 20 78 : $val". set x
84b0: 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 [sqlite3_status
84c0: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 SQLITE_STATUS_S
84d0: 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 20 CRATCH_OVERFLOW
84e0: 30 5d 0a 20 20 73 65 74 20 79 20 5b 73 71 6c 69 0]. set y [sqli
84f0: 74 65 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54 te3_status SQLIT
8500: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 E_STATUS_SCRATCH
8510: 5f 53 49 5a 45 20 30 5d 0a 20 20 73 65 74 20 76 _SIZE 0]. set v
8520: 61 6c 20 5b 66 6f 72 6d 61 74 20 7b 6e 6f 77 20 al [format {now
8530: 25 31 30 64 20 20 6d 61 78 20 25 31 30 64 20 20 %10d max %10d
8540: 6d 61 78 2d 73 69 7a 65 20 25 31 30 64 7d 20 5c max-size %10d} \
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
8560: 5b 6c 69 6e 64 65 78 20 24 78 20 31 5d 20 5b 6c [lindex $x 1] [l
8570: 69 6e 64 65 78 20 24 78 20 32 5d 20 5b 6c 69 6e index $x 2] [lin
8580: 64 65 78 20 24 79 20 32 5d 5d 0a 20 20 6f 75 74 dex $y 2]]. out
8590: 70 75 74 31 20 22 53 63 72 61 74 63 68 20 6f 76 put1 "Scratch ov
85a0: 65 72 66 6c 6f 77 3a 20 20 20 20 20 24 76 61 6c erflow: $val
85b0: 22 0a 20 20 69 66 63 61 70 61 62 6c 65 20 79 79 ". ifcapable yy
85c0: 74 72 61 63 6b 6d 61 78 73 74 61 63 6b 64 65 70 trackmaxstackdep
85d0: 74 68 20 7b 0a 20 20 20 20 73 65 74 20 78 20 5b th {. set x [
85e0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20 53 sqlite3_status S
85f0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 QLITE_STATUS_PAR
8600: 53 45 52 5f 53 54 41 43 4b 20 30 5d 0a 20 20 20 SER_STACK 0].
8610: 20 73 65 74 20 76 61 6c 20 5b 66 6f 72 6d 61 74 set val [format
8620: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {
8630: 20 6d 61 78 20 25 31 30 64 7d 20 5b 6c 69 6e 64 max %10d} [lind
8640: 65 78 20 24 78 20 32 5d 5d 0a 20 20 20 20 6f 75 ex $x 2]]. ou
8650: 74 70 75 74 32 20 22 50 61 72 73 65 72 20 73 74 tput2 "Parser st
8660: 61 63 6b 20 64 65 70 74 68 3a 20 20 20 20 24 76 ack depth: $v
8670: 61 6c 22 0a 20 20 7d 0a 7d 0a 0a 23 20 41 20 70 al". }.}..# A p
8680: 72 6f 63 65 64 75 72 65 20 74 6f 20 65 78 65 63 rocedure to exec
8690: 75 74 65 20 53 51 4c 0a 23 0a 70 72 6f 63 20 65 ute SQL.#.proc e
86a0: 78 65 63 73 71 6c 20 7b 73 71 6c 20 7b 64 62 20 xecsql {sql {db
86b0: 64 62 7d 7d 20 7b 0a 20 20 23 20 70 75 74 73 20 db}} {. # puts
86c0: 22 53 51 4c 20 3d 20 24 73 71 6c 22 0a 20 20 75 "SQL = $sql". u
86d0: 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 24 64 62 plevel [list $db
86e0: 20 65 76 61 6c 20 24 73 71 6c 5d 0a 7d 0a 70 72 eval $sql].}.pr
86f0: 6f 63 20 65 78 65 63 73 71 6c 5f 74 69 6d 65 64 oc execsql_timed
8700: 20 7b 73 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b {sql {db db}} {
8710: 0a 20 20 73 65 74 20 74 6d 20 5b 74 69 6d 65 20 . set tm [time
8720: 7b 0a 20 20 20 20 73 65 74 20 78 20 5b 75 70 6c {. set x [upl
8730: 65 76 65 6c 20 5b 6c 69 73 74 20 24 64 62 20 65 evel [list $db e
8740: 76 61 6c 20 24 73 71 6c 5d 5d 0a 20 20 7d 20 31 val $sql]]. } 1
8750: 5d 0a 20 20 73 65 74 20 74 6d 20 5b 6c 69 6e 64 ]. set tm [lind
8760: 65 78 20 24 74 6d 20 30 5d 0a 20 20 6f 75 74 70 ex $tm 0]. outp
8770: 75 74 31 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 ut1 -nonewline "
8780: 20 28 5b 65 78 70 72 20 7b 24 74 6d 2a 30 2e 30 ([expr {$tm*0.0
8790: 30 31 7d 5d 6d 73 29 20 22 0a 20 20 73 65 74 20 01}]ms) ". set
87a0: 78 0a 7d 0a 0a 23 20 45 78 65 63 75 74 65 20 53 x.}..# Execute S
87b0: 51 4c 20 61 6e 64 20 63 61 74 63 68 20 65 78 63 QL and catch exc
87c0: 65 70 74 69 6f 6e 73 2e 0a 23 0a 70 72 6f 63 20 eptions..#.proc
87d0: 63 61 74 63 68 73 71 6c 20 7b 73 71 6c 20 7b 64 catchsql {sql {d
87e0: 62 20 64 62 7d 7d 20 7b 0a 20 20 23 20 70 75 74 b db}} {. # put
87f0: 73 20 22 53 51 4c 20 3d 20 24 73 71 6c 22 0a 20 s "SQL = $sql".
8800: 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 5b 6c set r [catch [l
8810: 69 73 74 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 ist uplevel [lis
8820: 74 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d t $db eval $sql]
8830: 5d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 ] msg]. lappend
8840: 20 72 20 24 6d 73 67 0a 20 20 72 65 74 75 72 6e r $msg. return
8850: 20 24 72 0a 7d 0a 0a 23 20 44 6f 20 61 6e 20 56 $r.}..# Do an V
8860: 44 42 45 20 63 6f 64 65 20 64 75 6d 70 20 6f 6e DBE code dump on
8870: 20 74 68 65 20 53 51 4c 20 67 69 76 65 6e 0a 23 the SQL given.#
8880: 0a 70 72 6f 63 20 65 78 70 6c 61 69 6e 20 7b 73 .proc explain {s
8890: 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 ql {db db}} {.
88a0: 6f 75 74 70 75 74 32 20 22 22 0a 20 20 6f 75 74 output2 "". out
88b0: 70 75 74 32 20 22 61 64 64 72 20 20 6f 70 63 6f put2 "addr opco
88c0: 64 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20 de p1
88d0: 20 20 70 32 20 20 20 20 20 20 70 33 20 20 20 20 p2 p3
88e0: 20 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 p4
88f0: 20 20 20 70 35 20 20 23 22 0a 20 20 6f 75 74 70 p5 #". outp
8900: 75 74 32 20 22 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d ut2 "---- -----
8910: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 20 ------- ------
8920: 20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 20 ------ ------
8930: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
8940: 20 20 2d 2d 20 20 2d 22 0a 20 20 24 64 62 20 65 -- -". $db e
8950: 76 61 6c 20 22 65 78 70 6c 61 69 6e 20 24 73 71 val "explain $sq
8960: 6c 22 20 7b 7d 20 7b 0a 20 20 20 20 6f 75 74 70 l" {} {. outp
8970: 75 74 32 20 5b 66 6f 72 6d 61 74 20 7b 25 2d 34 ut2 [format {%-4
8980: 64 20 20 25 2d 31 32 2e 31 32 73 20 20 25 2d 36 d %-12.12s %-6
8990: 64 20 20 25 2d 36 64 20 20 25 2d 36 64 20 20 25 d %-6d %-6d %
89a0: 20 2d 31 37 73 20 25 73 20 20 25 73 7d 20 5c 0a -17s %s %s} \.
89b0: 20 20 20 20 20 20 24 61 64 64 72 20 24 6f 70 63 $addr $opc
89c0: 6f 64 65 20 24 70 31 20 24 70 32 20 24 70 33 20 ode $p1 $p2 $p3
89d0: 24 70 34 20 24 70 35 20 24 63 6f 6d 6d 65 6e 74 $p4 $p5 $comment
89e0: 0a 20 20 20 20 5d 0a 20 20 7d 0a 7d 0a 0a 70 72 . ]. }.}..pr
89f0: 6f 63 20 65 78 70 6c 61 69 6e 5f 69 20 7b 73 71 oc explain_i {sq
8a00: 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 6f l {db db}} {. o
8a10: 75 74 70 75 74 32 20 22 22 0a 20 20 6f 75 74 70 utput2 "". outp
8a20: 75 74 32 20 22 61 64 64 72 20 20 6f 70 63 6f 64 ut2 "addr opcod
8a30: 65 20 20 20 20 20 20 20 20 70 31 20 20 20 20 20 e p1
8a40: 20 70 32 20 20 20 20 20 20 70 33 20 20 20 20 20 p2 p3
8a50: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20 p4
8a60: 20 20 20 70 35 20 20 23 22 0a 20 20 6f 75 74 70 p5 #". outp
8a70: 75 74 32 20 22 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d ut2 "---- -----
8a80: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 20 ------- ------
8a90: 20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 20 ------ ------
8aa0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
8ab0: 2d 20 20 2d 2d 20 20 2d 22 0a 0a 0a 20 20 23 20 - -- -"... #
8ac0: 53 65 74 20 75 70 20 63 6f 6c 6f 72 73 20 66 6f Set up colors fo
8ad0: 72 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 r the different
8ae0: 6f 70 63 6f 64 65 73 2e 20 53 63 68 65 6d 65 20 opcodes. Scheme
8af0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 is as follows:.
8b00: 20 23 0a 20 20 23 20 20 20 52 65 64 3a 20 20 20 #. # Red:
8b10: 4f 70 63 6f 64 65 73 20 74 68 61 74 20 77 72 69 Opcodes that wri
8b20: 74 65 20 74 6f 20 61 20 62 2d 74 72 65 65 2e 0a te to a b-tree..
8b30: 20 20 23 20 20 20 42 6c 75 65 3a 20 20 4f 70 63 # Blue: Opc
8b40: 6f 64 65 73 20 74 68 61 74 20 72 65 70 6f 73 69 odes that reposi
8b50: 74 69 6f 6e 20 6f 72 20 73 65 65 6b 20 61 20 63 tion or seek a c
8b60: 75 72 73 6f 72 2e 20 0a 20 20 23 20 20 20 47 72 ursor. . # Gr
8b70: 65 65 6e 3a 20 54 68 65 20 52 65 73 75 6c 74 52 een: The ResultR
8b80: 6f 77 20 6f 70 63 6f 64 65 2e 0a 20 20 23 0a 20 ow opcode.. #.
8b90: 20 69 66 20 7b 20 5b 63 61 74 63 68 20 7b 66 63 if { [catch {fc
8ba0: 6f 6e 66 69 67 75 72 65 20 73 74 64 6f 75 74 20 onfigure stdout
8bb0: 2d 6d 6f 64 65 7d 5d 3d 3d 30 20 7d 20 7b 0a 20 -mode}]==0 } {.
8bc0: 20 20 20 73 65 74 20 52 20 22 5c 30 33 33 5c 5b set R "\033\[
8bd0: 33 31 3b 31 6d 22 20 20 20 20 20 20 20 20 3b 23 31;1m" ;#
8be0: 20 52 65 64 20 66 67 0a 20 20 20 20 73 65 74 20 Red fg. set
8bf0: 47 20 22 5c 30 33 33 5c 5b 33 32 3b 31 6d 22 20 G "\033\[32;1m"
8c00: 20 20 20 20 20 20 20 3b 23 20 47 72 65 65 6e 20 ;# Green
8c10: 66 67 0a 20 20 20 20 73 65 74 20 42 20 22 5c 30 fg. set B "\0
8c20: 33 33 5c 5b 33 34 3b 31 6d 22 20 20 20 20 20 20 33\[34;1m"
8c30: 20 20 3b 23 20 52 65 64 20 66 67 0a 20 20 20 20 ;# Red fg.
8c40: 73 65 74 20 44 20 22 5c 30 33 33 5c 5b 33 39 3b set D "\033\[39;
8c50: 30 6d 22 20 20 20 20 20 20 20 20 3b 23 20 44 65 0m" ;# De
8c60: 66 61 75 6c 74 20 66 67 0a 20 20 7d 20 65 6c 73 fault fg. } els
8c70: 65 20 7b 0a 20 20 20 20 73 65 74 20 52 20 22 22 e {. set R ""
8c80: 0a 20 20 20 20 73 65 74 20 47 20 22 22 0a 20 20 . set G "".
8c90: 20 20 73 65 74 20 42 20 22 22 0a 20 20 20 20 73 set B "". s
8ca0: 65 74 20 44 20 22 22 0a 20 20 7d 0a 20 20 66 6f et D "". }. fo
8cb0: 72 65 61 63 68 20 6f 70 63 6f 64 65 20 7b 0a 20 reach opcode {.
8cc0: 20 20 20 20 20 53 65 65 6b 20 53 65 65 6b 47 65 Seek SeekGe
8cd0: 20 53 65 65 6b 47 74 20 53 65 65 6b 4c 65 20 53 SeekGt SeekLe S
8ce0: 65 65 6b 4c 74 20 4e 6f 74 46 6f 75 6e 64 20 4c eekLt NotFound L
8cf0: 61 73 74 20 52 65 77 69 6e 64 0a 20 20 20 20 20 ast Rewind.
8d00: 20 4e 6f 43 6f 6e 66 6c 69 63 74 20 4e 65 78 74 NoConflict Next
8d10: 20 50 72 65 76 20 56 4e 65 78 74 20 56 50 72 65 Prev VNext VPre
8d20: 76 20 56 46 69 6c 74 65 72 0a 20 20 20 20 20 20 v VFilter.
8d30: 53 6f 72 74 65 72 53 6f 72 74 20 53 6f 72 74 65 SorterSort Sorte
8d40: 72 4e 65 78 74 0a 20 20 7d 20 7b 0a 20 20 20 20 rNext. } {.
8d50: 73 65 74 20 63 6f 6c 6f 72 28 24 6f 70 63 6f 64 set color($opcod
8d60: 65 29 20 24 42 0a 20 20 7d 0a 20 20 66 6f 72 65 e) $B. }. fore
8d70: 61 63 68 20 6f 70 63 6f 64 65 20 7b 52 65 73 75 ach opcode {Resu
8d80: 6c 74 52 6f 77 7d 20 7b 0a 20 20 20 20 73 65 74 ltRow} {. set
8d90: 20 63 6f 6c 6f 72 28 24 6f 70 63 6f 64 65 29 20 color($opcode)
8da0: 24 47 0a 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 $G. }. foreach
8db0: 20 6f 70 63 6f 64 65 20 7b 49 64 78 49 6e 73 65 opcode {IdxInse
8dc0: 72 74 20 49 6e 73 65 72 74 20 44 65 6c 65 74 65 rt Insert Delete
8dd0: 20 49 64 78 44 65 6c 65 74 65 7d 20 7b 0a 20 20 IdxDelete} {.
8de0: 20 20 73 65 74 20 63 6f 6c 6f 72 28 24 6f 70 63 set color($opc
8df0: 6f 64 65 29 20 24 52 0a 20 20 7d 0a 0a 20 20 73 ode) $R. }.. s
8e00: 65 74 20 62 53 65 65 6e 47 6f 74 6f 20 30 0a 20 et bSeenGoto 0.
8e10: 20 24 64 62 20 65 76 61 6c 20 22 65 78 70 6c 61 $db eval "expla
8e20: 69 6e 20 24 73 71 6c 22 20 7b 7d 20 7b 0a 20 20 in $sql" {} {.
8e30: 20 20 73 65 74 20 78 28 24 61 64 64 72 29 20 30 set x($addr) 0
8e40: 0a 20 20 20 20 73 65 74 20 6f 70 28 24 61 64 64 . set op($add
8e50: 72 29 20 24 6f 70 63 6f 64 65 0a 0a 20 20 20 20 r) $opcode..
8e60: 69 66 20 7b 24 6f 70 63 6f 64 65 20 3d 3d 20 22 if {$opcode == "
8e70: 47 6f 74 6f 22 20 26 26 20 28 24 62 53 65 65 6e Goto" && ($bSeen
8e80: 47 6f 74 6f 3d 3d 30 20 7c 7c 20 28 24 70 32 20 Goto==0 || ($p2
8e90: 3e 20 24 61 64 64 72 2b 31 30 29 29 7d 20 7b 0a > $addr+10))} {.
8ea0: 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65 62 72 set linebr
8eb0: 65 61 6b 28 24 70 32 29 20 31 0a 20 20 20 20 20 eak($p2) 1.
8ec0: 20 73 65 74 20 62 53 65 65 6e 47 6f 74 6f 20 31 set bSeenGoto 1
8ed0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b . }.. if {
8ee0: 24 6f 70 63 6f 64 65 3d 3d 22 4e 65 78 74 22 20 $opcode=="Next"
8ef0: 20 7c 7c 20 24 6f 70 63 6f 64 65 3d 3d 22 50 72 || $opcode=="Pr
8f00: 65 76 22 20 0a 20 20 20 20 20 7c 7c 20 24 6f 70 ev" . || $op
8f10: 63 6f 64 65 3d 3d 22 56 4e 65 78 74 22 20 7c 7c code=="VNext" ||
8f20: 20 24 6f 70 63 6f 64 65 3d 3d 22 56 50 72 65 76 $opcode=="VPrev
8f30: 22 0a 20 20 20 20 20 7c 7c 20 24 6f 70 63 6f 64 ". || $opcod
8f40: 65 3d 3d 22 53 6f 72 74 65 72 4e 65 78 74 22 0a e=="SorterNext".
8f50: 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 66 6f } {. fo
8f60: 72 20 7b 73 65 74 20 69 20 24 70 32 7d 20 7b 24 r {set i $p2} {$
8f70: 69 3c 24 61 64 64 72 7d 20 7b 69 6e 63 72 20 69 i<$addr} {incr i
8f80: 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63 72 } {. incr
8f90: 20 78 28 24 69 29 20 32 0a 20 20 20 20 20 20 7d x($i) 2. }
8fa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b . }.. if {
8fb0: 24 6f 70 63 6f 64 65 20 3d 3d 20 22 47 6f 74 6f $opcode == "Goto
8fc0: 22 20 26 26 20 24 70 32 3c 24 61 64 64 72 20 26 " && $p2<$addr &
8fd0: 26 20 24 6f 70 28 24 70 32 29 3d 3d 22 59 69 65 & $op($p2)=="Yie
8fe0: 6c 64 22 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 ld"} {. for
8ff0: 20 7b 73 65 74 20 69 20 5b 65 78 70 72 20 24 70 {set i [expr $p
9000: 32 2b 31 5d 7d 20 7b 24 69 3c 24 61 64 64 72 7d 2+1]} {$i<$addr}
9010: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 {incr i} {.
9020: 20 20 20 20 69 6e 63 72 20 78 28 24 69 29 20 32 incr x($i) 2
9030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a . }. }..
9040: 20 20 20 20 69 66 20 7b 24 6f 70 63 6f 64 65 20 if {$opcode
9050: 3d 3d 20 22 48 61 6c 74 22 20 26 26 20 24 63 6f == "Halt" && $co
9060: 6d 6d 65 6e 74 20 3d 3d 20 22 45 6e 64 20 6f 66 mment == "End of
9070: 20 63 6f 72 6f 75 74 69 6e 65 22 7d 20 7b 0a 20 coroutine"} {.
9080: 20 20 20 20 20 73 65 74 20 6c 69 6e 65 62 72 65 set linebre
9090: 61 6b 28 5b 65 78 70 72 20 24 61 64 64 72 2b 31 ak([expr $addr+1
90a0: 5d 29 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a ]) 1. }. }..
90b0: 20 20 24 64 62 20 65 76 61 6c 20 22 65 78 70 6c $db eval "expl
90c0: 61 69 6e 20 24 73 71 6c 22 20 7b 7d 20 7b 0a 20 ain $sql" {} {.
90d0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 if {[info exi
90e0: 73 74 73 20 6c 69 6e 65 62 72 65 61 6b 28 24 61 sts linebreak($a
90f0: 64 64 72 29 5d 7d 20 7b 0a 20 20 20 20 20 20 6f ddr)]} {. o
9100: 75 74 70 75 74 32 20 22 22 0a 20 20 20 20 7d 0a utput2 "". }.
9110: 20 20 20 20 73 65 74 20 49 20 5b 73 74 72 69 6e set I [strin
9120: 67 20 72 65 70 65 61 74 20 22 20 22 20 24 78 28 g repeat " " $x(
9130: 24 61 64 64 72 29 5d 0a 0a 20 20 20 20 73 65 74 $addr)].. set
9140: 20 63 6f 6c 20 22 22 0a 20 20 20 20 63 61 74 63 col "". catc
9150: 68 20 7b 20 73 65 74 20 63 6f 6c 20 24 63 6f 6c h { set col $col
9160: 6f 72 28 24 6f 70 63 6f 64 65 29 20 7d 0a 0a 20 or($opcode) }..
9170: 20 20 20 6f 75 74 70 75 74 32 20 5b 66 6f 72 6d output2 [form
9180: 61 74 20 7b 25 2d 34 64 20 20 25 73 25 73 25 2d at {%-4d %s%s%-
9190: 31 32 2e 31 32 73 25 73 20 20 25 2d 36 64 20 20 12.12s%s %-6d
91a0: 25 2d 36 64 20 20 25 2d 36 64 20 20 25 20 2d 31 %-6d %-6d % -1
91b0: 37 73 20 25 73 20 20 25 73 7d 20 5c 0a 20 20 20 7s %s %s} \.
91c0: 20 20 20 24 61 64 64 72 20 24 49 20 24 63 6f 6c $addr $I $col
91d0: 20 24 6f 70 63 6f 64 65 20 24 44 20 24 70 31 20 $opcode $D $p1
91e0: 24 70 32 20 24 70 33 20 24 70 34 20 24 70 35 20 $p2 $p3 $p4 $p5
91f0: 24 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 5d 0a 20 $comment. ].
9200: 20 7d 0a 20 20 6f 75 74 70 75 74 32 20 22 2d 2d }. output2 "--
9210: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -- ------------
9220: 20 20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d ------ ------
9230: 20 20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d ------ ------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 20 20 ---------- --
9250: 2d 22 0a 7d 0a 0a 23 20 53 68 6f 77 20 74 68 65 -".}..# Show the
9260: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 66 6f VDBE program fo
9270: 72 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 r an SQL stateme
9280: 6e 74 20 62 75 74 20 6f 6d 69 74 20 74 68 65 20 nt but omit the
9290: 54 72 61 63 65 0a 23 20 6f 70 63 6f 64 65 20 61 Trace.# opcode a
92a0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e t the beginning.
92b0: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 This procedure
92c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 can be used to
92d0: 70 72 6f 76 65 0a 23 20 74 68 61 74 20 64 69 66 prove.# that dif
92e0: 66 65 72 65 6e 74 20 53 51 4c 20 73 74 61 74 65 ferent SQL state
92f0: 6d 65 6e 74 73 20 67 65 6e 65 72 61 74 65 20 65 ments generate e
9300: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 xactly the same
9310: 56 44 42 45 20 63 6f 64 65 2e 0a 23 0a 70 72 6f VDBE code..#.pro
9320: 63 20 65 78 70 6c 61 69 6e 5f 6e 6f 5f 74 72 61 c explain_no_tra
9330: 63 65 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 ce {sql} {. set
9340: 20 74 72 20 5b 64 62 20 65 76 61 6c 20 22 45 58 tr [db eval "EX
9350: 50 4c 41 49 4e 20 24 73 71 6c 22 5d 0a 20 20 72 PLAIN $sql"]. r
9360: 65 74 75 72 6e 20 5b 6c 72 61 6e 67 65 20 24 74 eturn [lrange $t
9370: 72 20 37 20 65 6e 64 5d 0a 7d 0a 0a 23 20 41 6e r 7 end].}..# An
9380: 6f 74 68 65 72 20 70 72 6f 63 65 64 75 72 65 20 other procedure
9390: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 20 to execute SQL.
93a0: 20 54 68 69 73 20 6f 6e 65 20 69 6e 63 6c 75 64 This one includ
93b0: 65 73 20 74 68 65 20 66 69 65 6c 64 0a 23 20 6e es the field.# n
93c0: 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 ames in the retu
93d0: 72 6e 65 64 20 6c 69 73 74 2e 0a 23 0a 70 72 6f rned list..#.pro
93e0: 63 20 65 78 65 63 73 71 6c 32 20 7b 73 71 6c 7d c execsql2 {sql}
93f0: 20 7b 0a 20 20 73 65 74 20 72 65 73 75 6c 74 20 {. set result
9400: 7b 7d 0a 20 20 64 62 20 65 76 61 6c 20 24 73 71 {}. db eval $sq
9410: 6c 20 64 61 74 61 20 7b 0a 20 20 20 20 66 6f 72 l data {. for
9420: 65 61 63 68 20 66 20 24 64 61 74 61 28 2a 29 20 each f $data(*)
9430: 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 {. lappend
9440: 72 65 73 75 6c 74 20 24 66 20 24 64 61 74 61 28 result $f $data(
9450: 24 66 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 $f). }. }.
9460: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d return $result.}
9470: 0a 0a 23 20 55 73 65 20 61 20 74 65 6d 70 6f 72 ..# Use a tempor
9480: 61 72 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 ary in-memory da
9490: 74 61 62 61 73 65 20 74 6f 20 65 78 65 63 75 74 tabase to execut
94a0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 e SQL statements
94b0: 0a 23 0a 70 72 6f 63 20 6d 65 6d 64 62 73 71 6c .#.proc memdbsql
94c0: 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 71 6c 69 74 {sql} {. sqlit
94d0: 65 33 20 6d 65 6d 64 62 20 3a 6d 65 6d 6f 72 79 e3 memdb :memory
94e0: 3a 0a 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b :. set result [
94f0: 6d 65 6d 64 62 20 65 76 61 6c 20 24 73 71 6c 5d memdb eval $sql]
9500: 0a 20 20 6d 65 6d 64 62 20 63 6c 6f 73 65 0a 20 . memdb close.
9510: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a return $result.
9520: 7d 0a 0a 23 20 55 73 65 20 74 68 65 20 6e 6f 6e }..# Use the non
9530: 2d 63 61 6c 6c 62 61 63 6b 20 41 50 49 20 74 6f -callback API to
9540: 20 65 78 65 63 75 74 65 20 6d 75 6c 74 69 70 6c execute multipl
9550: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 e SQL statements
9560: 0a 23 0a 70 72 6f 63 20 73 74 65 70 73 71 6c 20 .#.proc stepsql
9570: 7b 64 62 70 74 72 20 73 71 6c 7d 20 7b 0a 20 20 {dbptr sql} {.
9580: 73 65 74 20 73 71 6c 20 5b 73 74 72 69 6e 67 20 set sql [string
9590: 74 72 69 6d 20 24 73 71 6c 5d 0a 20 20 73 65 74 trim $sql]. set
95a0: 20 72 20 30 0a 20 20 77 68 69 6c 65 20 7b 5b 73 r 0. while {[s
95b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 71 tring length $sq
95c0: 6c 5d 3e 30 7d 20 7b 0a 20 20 20 20 69 66 20 7b l]>0} {. if {
95d0: 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f [catch {sqlite3_
95e0: 70 72 65 70 61 72 65 20 24 64 62 70 74 72 20 24 prepare $dbptr $
95f0: 73 71 6c 20 2d 31 20 73 71 6c 74 61 69 6c 7d 20 sql -1 sqltail}
9600: 76 6d 5d 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 vm]} {. ret
9610: 75 72 6e 20 5b 6c 69 73 74 20 31 20 24 76 6d 5d urn [list 1 $vm]
9620: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 . }. set s
9630: 71 6c 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 ql [string trim
9640: 24 73 71 6c 74 61 69 6c 5d 0a 23 20 20 20 20 77 $sqltail].# w
9650: 68 69 6c 65 20 7b 5b 73 71 6c 69 74 65 5f 73 74 hile {[sqlite_st
9660: 65 70 20 24 76 6d 20 4e 20 56 41 4c 20 43 4f 4c ep $vm N VAL COL
9670: 5d 3d 3d 22 53 51 4c 49 54 45 5f 52 4f 57 22 7d ]=="SQLITE_ROW"}
9680: 20 7b 0a 23 20 20 20 20 20 20 66 6f 72 65 61 63 {.# foreac
9690: 68 20 76 20 24 56 41 4c 20 7b 6c 61 70 70 65 6e h v $VAL {lappen
96a0: 64 20 72 20 24 76 7d 0a 23 20 20 20 20 7d 0a 20 d r $v}.# }.
96b0: 20 20 20 77 68 69 6c 65 20 7b 5b 73 71 6c 69 74 while {[sqlit
96c0: 65 33 5f 73 74 65 70 20 24 76 6d 5d 3d 3d 22 53 e3_step $vm]=="S
96d0: 51 4c 49 54 45 5f 52 4f 57 22 7d 20 7b 0a 20 20 QLITE_ROW"} {.
96e0: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 for {set i 0
96f0: 7d 20 7b 24 69 3c 5b 73 71 6c 69 74 65 33 5f 64 } {$i<[sqlite3_d
9700: 61 74 61 5f 63 6f 75 6e 74 20 24 76 6d 5d 7d 20 ata_count $vm]}
9710: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 {incr i} {.
9720: 20 20 20 6c 61 70 70 65 6e 64 20 72 20 5b 73 71 lappend r [sq
9730: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 lite3_column_tex
9740: 74 20 24 76 6d 20 24 69 5d 0a 20 20 20 20 20 20 t $vm $i].
9750: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b }. }. if {
9760: 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f [catch {sqlite3_
9770: 66 69 6e 61 6c 69 7a 65 20 24 76 6d 7d 20 65 72 finalize $vm} er
9780: 72 6d 73 67 5d 7d 20 7b 0a 20 20 20 20 20 20 72 rmsg]} {. r
9790: 65 74 75 72 6e 20 5b 6c 69 73 74 20 31 20 24 65 eturn [list 1 $e
97a0: 72 72 6d 73 67 5d 0a 20 20 20 20 7d 0a 20 20 7d rrmsg]. }. }
97b0: 0a 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a . return $r.}..
97c0: 23 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 # Do an integrit
97d0: 79 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 65 y check of the e
97e0: 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 0a 23 ntire database.#
97f0: 0a 70 72 6f 63 20 69 6e 74 65 67 72 69 74 79 5f .proc integrity_
9800: 63 68 65 63 6b 20 7b 6e 61 6d 65 20 7b 64 62 20 check {name {db
9810: 64 62 7d 7d 20 7b 0a 20 20 69 66 63 61 70 61 62 db}} {. ifcapab
9820: 6c 65 20 69 6e 74 65 67 72 69 74 79 63 6b 20 7b le integrityck {
9830: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 6e 61 . do_test $na
9840: 6d 65 20 5b 6c 69 73 74 20 65 78 65 63 73 71 6c me [list execsql
9850: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 {PRAGMA integri
9860: 74 79 5f 63 68 65 63 6b 7d 20 24 64 62 5d 20 7b ty_check} $db] {
9870: 6f 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 43 68 65 ok}. }.}..# Che
9880: 63 6b 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 ck the extended
9890: 65 72 72 6f 72 20 63 6f 64 65 0a 23 0a 70 72 6f error code.#.pro
98a0: 63 20 76 65 72 69 66 79 5f 65 78 5f 65 72 72 63 c verify_ex_errc
98b0: 6f 64 65 20 7b 6e 61 6d 65 20 65 78 70 65 63 74 ode {name expect
98c0: 65 64 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 ed {db db}} {.
98d0: 64 6f 5f 74 65 73 74 20 24 6e 61 6d 65 20 5b 6c do_test $name [l
98e0: 69 73 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 ist sqlite3_exte
98f0: 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 24 64 62 nded_errcode $db
9900: 5d 20 24 65 78 70 65 63 74 65 64 0a 7d 0a 0a 0a ] $expected.}...
9910: 23 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 # Return true if
9920: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 the SQL stateme
9930: 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 nt passed as the
9940: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 second argument
9950: 20 75 73 65 73 20 61 0a 23 20 73 74 61 74 65 6d uses a.# statem
9960: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e ent transaction.
9970: 0a 23 0a 70 72 6f 63 20 73 71 6c 5f 75 73 65 73 .#.proc sql_uses
9980: 5f 73 74 6d 74 20 7b 64 62 20 73 71 6c 7d 20 7b _stmt {db sql} {
9990: 0a 20 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c . set stmt [sql
99a0: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 64 62 ite3_prepare $db
99b0: 20 24 73 71 6c 20 2d 31 20 64 75 6d 6d 79 5d 0a $sql -1 dummy].
99c0: 20 20 73 65 74 20 75 73 65 73 20 5b 75 73 65 73 set uses [uses
99d0: 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 24 73 _stmt_journal $s
99e0: 74 6d 74 5d 0a 20 20 73 71 6c 69 74 65 33 5f 66 tmt]. sqlite3_f
99f0: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 0a 20 20 inalize $stmt.
9a00: 72 65 74 75 72 6e 20 24 75 73 65 73 0a 7d 0a 0a return $uses.}..
9a10: 70 72 6f 63 20 66 69 78 5f 69 66 63 61 70 61 62 proc fix_ifcapab
9a20: 6c 65 5f 65 78 70 72 20 7b 65 78 70 72 7d 20 7b le_expr {expr} {
9a30: 0a 20 20 73 65 74 20 72 65 74 20 22 22 0a 20 20 . set ret "".
9a40: 73 65 74 20 73 74 61 74 65 20 30 0a 20 20 66 6f set state 0. fo
9a50: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 r {set i 0} {$i
9a60: 3c 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 < [string length
9a70: 20 24 65 78 70 72 5d 7d 20 7b 69 6e 63 72 20 69 $expr]} {incr i
9a80: 7d 20 7b 0a 20 20 20 20 73 65 74 20 63 68 61 72 } {. set char
9a90: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 [string range $
9aa0: 65 78 70 72 20 24 69 20 24 69 5d 0a 20 20 20 20 expr $i $i].
9ab0: 73 65 74 20 6e 65 77 73 74 61 74 65 20 5b 65 78 set newstate [ex
9ac0: 70 72 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 61 pr {[string is a
9ad0: 6c 6e 75 6d 20 24 63 68 61 72 5d 20 7c 7c 20 24 lnum $char] || $
9ae0: 63 68 61 72 20 65 71 20 22 5f 22 7d 5d 0a 20 20 char eq "_"}].
9af0: 20 20 69 66 20 7b 24 6e 65 77 73 74 61 74 65 20 if {$newstate
9b00: 26 26 20 21 24 73 74 61 74 65 7d 20 7b 0a 20 20 && !$state} {.
9b10: 20 20 20 20 61 70 70 65 6e 64 20 72 65 74 20 7b append ret {
9b20: 24 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e $::sqlite_option
9b30: 73 28 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 s(}. }. if
9b40: 20 7b 21 24 6e 65 77 73 74 61 74 65 20 26 26 20 {!$newstate &&
9b50: 24 73 74 61 74 65 7d 20 7b 0a 20 20 20 20 20 20 $state} {.
9b60: 61 70 70 65 6e 64 20 72 65 74 20 29 0a 20 20 20 append ret ).
9b70: 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65 }. append re
9b80: 74 20 24 63 68 61 72 0a 20 20 20 20 73 65 74 20 t $char. set
9b90: 73 74 61 74 65 20 24 6e 65 77 73 74 61 74 65 0a state $newstate.
9ba0: 20 20 7d 0a 20 20 69 66 20 7b 24 73 74 61 74 65 }. if {$state
9bb0: 7d 20 7b 61 70 70 65 6e 64 20 72 65 74 20 29 7d } {append ret )}
9bc0: 0a 20 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d . return $ret.}
9bd0: 0a 0a 23 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d ..# Returns non-
9be0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 61 70 61 zero if the capa
9bf0: 62 69 6c 69 74 69 65 73 20 61 72 65 20 70 72 65 bilities are pre
9c00: 73 65 6e 74 3b 20 7a 65 72 6f 20 6f 74 68 65 72 sent; zero other
9c10: 77 69 73 65 2e 0a 23 0a 70 72 6f 63 20 63 61 70 wise..#.proc cap
9c20: 61 62 6c 65 20 7b 65 78 70 72 7d 20 7b 0a 20 20 able {expr} {.
9c30: 73 65 74 20 65 20 5b 66 69 78 5f 69 66 63 61 70 set e [fix_ifcap
9c40: 61 62 6c 65 5f 65 78 70 72 20 24 65 78 70 72 5d able_expr $expr]
9c50: 3b 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 28 ; return [expr (
9c60: 24 65 29 5d 0a 7d 0a 0a 23 20 45 76 61 6c 75 61 $e)].}..# Evalua
9c70: 74 65 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 te a boolean exp
9c80: 72 65 73 73 69 6f 6e 20 6f 66 20 63 61 70 61 62 ression of capab
9c90: 69 6c 69 74 69 65 73 2e 20 20 49 66 20 74 72 75 ilities. If tru
9ca0: 65 2c 20 65 78 65 63 75 74 65 20 74 68 65 0a 23 e, execute the.#
9cb0: 20 63 6f 64 65 2e 20 20 4f 6d 69 74 20 74 68 65 code. Omit the
9cc0: 20 63 6f 64 65 20 69 66 20 66 61 6c 73 65 2e 0a code if false..
9cd0: 23 0a 70 72 6f 63 20 69 66 63 61 70 61 62 6c 65 #.proc ifcapable
9ce0: 20 7b 65 78 70 72 20 63 6f 64 65 20 7b 65 6c 73 {expr code {els
9cf0: 65 20 22 22 7d 20 7b 65 6c 73 65 63 6f 64 65 20 e ""} {elsecode
9d00: 22 22 7d 7d 20 7b 0a 20 20 23 72 65 67 73 75 62 ""}} {. #regsub
9d10: 20 2d 61 6c 6c 20 7b 5b 61 2d 7a 5f 30 2d 39 5d -all {[a-z_0-9]
9d20: 2b 7d 20 24 65 78 70 72 20 7b 24 3a 3a 73 71 6c +} $expr {$::sql
9d30: 69 74 65 5f 6f 70 74 69 6f 6e 73 28 26 29 7d 20 ite_options(&)}
9d40: 65 32 0a 20 20 73 65 74 20 65 32 20 5b 66 69 78 e2. set e2 [fix
9d50: 5f 69 66 63 61 70 61 62 6c 65 5f 65 78 70 72 20 _ifcapable_expr
9d60: 24 65 78 70 72 5d 0a 20 20 69 66 20 28 24 65 32 $expr]. if ($e2
9d70: 29 20 7b 0a 20 20 20 20 73 65 74 20 63 20 5b 63 ) {. set c [c
9d80: 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 atch {uplevel 1
9d90: 24 63 6f 64 65 7d 20 72 5d 0a 20 20 7d 20 65 6c $code} r]. } el
9da0: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 63 20 5b se {. set c [
9db0: 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 catch {uplevel 1
9dc0: 20 24 65 6c 73 65 63 6f 64 65 7d 20 72 5d 0a 20 $elsecode} r].
9dd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 }. return -cod
9de0: 65 20 24 63 20 24 72 0a 7d 0a 0a 23 20 54 68 69 e $c $r.}..# Thi
9df0: 73 20 70 72 6f 63 20 65 78 65 63 73 20 61 20 73 s proc execs a s
9e00: 65 70 65 72 61 74 65 20 70 72 6f 63 65 73 73 20 eperate process
9e10: 74 68 61 74 20 63 72 61 73 68 65 73 20 6d 69 64 that crashes mid
9e20: 77 61 79 20 74 68 72 6f 75 67 68 20 65 78 65 63 way through exec
9e30: 75 74 69 6e 67 0a 23 20 74 68 65 20 53 51 4c 20 uting.# the SQL
9e40: 73 63 72 69 70 74 20 24 73 71 6c 20 6f 6e 20 64 script $sql on d
9e50: 61 74 61 62 61 73 65 20 74 65 73 74 2e 64 62 2e atabase test.db.
9e60: 0a 23 0a 23 20 54 68 65 20 63 72 61 73 68 20 6f .#.# The crash o
9e70: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 73 ccurs during a s
9e80: 79 6e 63 28 29 20 6f 66 20 66 69 6c 65 20 24 63 ync() of file $c
9e90: 72 61 73 68 66 69 6c 65 2e 20 57 68 65 6e 20 74 rashfile. When t
9ea0: 68 65 20 63 72 61 73 68 0a 23 20 6f 63 63 75 72 he crash.# occur
9eb0: 73 20 61 20 72 61 6e 64 6f 6d 20 73 75 62 73 65 s a random subse
9ec0: 74 20 6f 66 20 61 6c 6c 20 75 6e 73 79 6e 63 65 t of all unsynce
9ed0: 64 20 77 72 69 74 65 73 20 6d 61 64 65 20 62 79 d writes made by
9ee0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 61 72 65 the process are
9ef0: 0a 23 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 .# written into
9f00: 74 68 65 20 66 69 6c 65 73 20 6f 6e 20 64 69 73 the files on dis
9f10: 6b 2e 20 41 72 67 75 6d 65 6e 74 20 24 63 72 61 k. Argument $cra
9f20: 73 68 64 65 6c 61 79 20 69 6e 64 69 63 61 74 65 shdelay indicate
9f30: 73 20 74 68 65 0a 23 20 6e 75 6d 62 65 72 20 6f s the.# number o
9f40: 66 20 66 69 6c 65 20 73 79 6e 63 73 20 74 6f 20 f file syncs to
9f50: 77 61 69 74 20 62 65 66 6f 72 65 20 63 72 61 73 wait before cras
9f60: 68 69 6e 67 2e 0a 23 0a 23 20 54 68 65 20 72 65 hing..#.# The re
9f70: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 turn value is a
9f80: 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d list of two elem
9f90: 65 6e 74 73 2e 20 54 68 65 20 66 69 72 73 74 20 ents. The first
9fa0: 65 6c 65 6d 65 6e 74 20 69 73 20 61 0a 23 20 62 element is a.# b
9fb0: 6f 6f 6c 65 61 6e 2c 20 69 6e 64 69 63 61 74 69 oolean, indicati
9fc0: 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f ng whether or no
9fd0: 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 61 63 t the process ac
9fe0: 74 75 61 6c 6c 79 20 63 72 61 73 68 65 64 20 6f tually crashed o
9ff0: 72 0a 23 20 72 65 70 6f 72 74 65 64 20 73 6f 6d r.# reported som
a000: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 2e 20 54 e other error. T
a010: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e he second elemen
a020: 74 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 t in the returne
a030: 64 20 6c 69 73 74 20 69 73 20 74 68 65 0a 23 20 d list is the.#
a040: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 error message. T
a050: 68 69 73 20 69 73 20 22 63 68 69 6c 64 20 70 72 his is "child pr
a060: 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62 6e ocess exited abn
a070: 6f 72 6d 61 6c 6c 79 22 20 69 66 20 74 68 65 20 ormally" if the
a080: 63 72 61 73 68 0a 23 20 6f 63 63 75 72 72 65 64 crash.# occurred
a090: 2e 0a 23 0a 23 20 20 20 63 72 61 73 68 73 71 6c ..#.# crashsql
a0a0: 20 2d 64 65 6c 61 79 20 43 52 41 53 48 44 45 4c -delay CRASHDEL
a0b0: 41 59 20 2d 66 69 6c 65 20 43 52 41 53 48 46 49 AY -file CRASHFI
a0c0: 4c 45 20 3f 2d 62 6c 6f 63 6b 73 69 7a 65 20 42 LE ?-blocksize B
a0d0: 4c 4f 43 4b 53 49 5a 45 3f 20 24 73 71 6c 0a 23 LOCKSIZE? $sql.#
a0e0: 0a 70 72 6f 63 20 63 72 61 73 68 73 71 6c 20 7b .proc crashsql {
a0f0: 61 72 67 73 7d 20 7b 0a 0a 20 20 73 65 74 20 62 args} {.. set b
a100: 6c 6f 63 6b 73 69 7a 65 20 22 22 0a 20 20 73 65 locksize "". se
a110: 74 20 63 72 61 73 68 64 65 6c 61 79 20 31 0a 20 t crashdelay 1.
a120: 20 73 65 74 20 70 72 6e 67 73 65 65 64 20 30 0a set prngseed 0.
a130: 20 20 73 65 74 20 6f 70 65 6e 64 62 20 7b 20 73 set opendb { s
a140: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 qlite3 db test.d
a150: 62 20 2d 76 66 73 20 63 72 61 73 68 20 7d 0a 20 b -vfs crash }.
a160: 20 73 65 74 20 74 63 6c 62 6f 64 79 20 7b 7d 0a set tclbody {}.
a170: 20 20 73 65 74 20 63 72 61 73 68 66 69 6c 65 20 set crashfile
a180: 22 22 0a 20 20 73 65 74 20 64 63 20 22 22 0a 20 "". set dc "".
a190: 20 73 65 74 20 73 71 6c 20 5b 6c 69 6e 64 65 78 set sql [lindex
a1a0: 20 24 61 72 67 73 20 65 6e 64 5d 0a 0a 20 20 66 $args end].. f
a1b0: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 or {set ii 0} {$
a1c0: 69 69 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 61 ii < [llength $a
a1d0: 72 67 73 5d 2d 31 7d 20 7b 69 6e 63 72 20 69 69 rgs]-1} {incr ii
a1e0: 20 32 7d 20 7b 0a 20 20 20 20 73 65 74 20 7a 20 2} {. set z
a1f0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 24 69 [lindex $args $i
a200: 69 5d 0a 20 20 20 20 73 65 74 20 6e 20 5b 73 74 i]. set n [st
a210: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 7a 5d 0a ring length $z].
a220: 20 20 20 20 73 65 74 20 7a 32 20 5b 6c 69 6e 64 set z2 [lind
a230: 65 78 20 24 61 72 67 73 20 5b 65 78 70 72 20 24 ex $args [expr $
a240: 69 69 2b 31 5d 5d 0a 0a 20 20 20 20 69 66 20 20 ii+1]].. if
a250: 20 20 20 7b 24 6e 3e 31 20 26 26 20 5b 73 74 72 {$n>1 && [str
a260: 69 6e 67 20 66 69 72 73 74 20 24 7a 20 2d 64 65 ing first $z -de
a270: 6c 61 79 5d 3d 3d 30 7d 20 20 20 20 20 7b 73 65 lay]==0} {se
a280: 74 20 63 72 61 73 68 64 65 6c 61 79 20 24 7a 32 t crashdelay $z2
a290: 7d 20 5c 0a 20 20 20 20 65 6c 73 65 69 66 20 7b } \. elseif {
a2a0: 24 6e 3e 31 20 26 26 20 5b 73 74 72 69 6e 67 20 $n>1 && [string
a2b0: 66 69 72 73 74 20 24 7a 20 2d 6f 70 65 6e 64 62 first $z -opendb
a2c0: 5d 3d 3d 30 7d 20 20 20 20 7b 73 65 74 20 6f 70 ]==0} {set op
a2d0: 65 6e 64 62 20 24 7a 32 7d 20 5c 0a 20 20 20 20 endb $z2} \.
a2e0: 65 6c 73 65 69 66 20 7b 24 6e 3e 31 20 26 26 20 elseif {$n>1 &&
a2f0: 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20 24 7a [string first $z
a300: 20 2d 73 65 65 64 5d 3d 3d 30 7d 20 20 20 20 20 -seed]==0}
a310: 20 7b 73 65 74 20 70 72 6e 67 73 65 65 64 20 24 {set prngseed $
a320: 7a 32 7d 20 5c 0a 20 20 20 20 65 6c 73 65 69 66 z2} \. elseif
a330: 20 7b 24 6e 3e 31 20 26 26 20 5b 73 74 72 69 6e {$n>1 && [strin
a340: 67 20 66 69 72 73 74 20 24 7a 20 2d 66 69 6c 65 g first $z -file
a350: 5d 3d 3d 30 7d 20 20 20 20 20 20 7b 73 65 74 20 ]==0} {set
a360: 63 72 61 73 68 66 69 6c 65 20 24 7a 32 7d 20 20 crashfile $z2}
a370: 5c 0a 20 20 20 20 65 6c 73 65 69 66 20 7b 24 6e \. elseif {$n
a380: 3e 31 20 26 26 20 5b 73 74 72 69 6e 67 20 66 69 >1 && [string fi
a390: 72 73 74 20 24 7a 20 2d 74 63 6c 62 6f 64 79 5d rst $z -tclbody]
a3a0: 3d 3d 30 7d 20 20 20 7b 73 65 74 20 74 63 6c 62 ==0} {set tclb
a3b0: 6f 64 79 20 24 7a 32 7d 20 20 5c 0a 20 20 20 20 ody $z2} \.
a3c0: 65 6c 73 65 69 66 20 7b 24 6e 3e 31 20 26 26 20 elseif {$n>1 &&
a3d0: 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20 24 7a [string first $z
a3e0: 20 2d 62 6c 6f 63 6b 73 69 7a 65 5d 3d 3d 30 7d -blocksize]==0}
a3f0: 20 7b 73 65 74 20 62 6c 6f 63 6b 73 69 7a 65 20 {set blocksize
a400: 22 2d 73 20 24 7a 32 22 20 7d 20 5c 0a 20 20 20 "-s $z2" } \.
a410: 20 65 6c 73 65 69 66 20 7b 24 6e 3e 31 20 26 26 elseif {$n>1 &&
a420: 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20 24 [string first $
a430: 7a 20 2d 63 68 61 72 61 63 74 65 72 69 73 74 69 z -characteristi
a440: 63 73 5d 3d 3d 30 7d 20 7b 73 65 74 20 64 63 20 cs]==0} {set dc
a450: 22 2d 63 20 7b 24 7a 32 7d 22 20 7d 20 5c 0a 20 "-c {$z2}" } \.
a460: 20 20 20 65 6c 73 65 20 20 20 7b 20 65 72 72 6f else { erro
a470: 72 20 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 r "Unrecognized
a480: 6f 70 74 69 6f 6e 3a 20 24 7a 22 20 7d 0a 20 20 option: $z" }.
a490: 7d 0a 0a 20 20 69 66 20 7b 24 63 72 61 73 68 66 }.. if {$crashf
a4a0: 69 6c 65 20 65 71 20 22 22 7d 20 7b 0a 20 20 20 ile eq ""} {.
a4b0: 20 65 72 72 6f 72 20 22 43 6f 6d 70 75 6c 73 6f error "Compulso
a4c0: 72 79 20 6f 70 74 69 6f 6e 20 2d 66 69 6c 65 20 ry option -file
a4d0: 6d 69 73 73 69 6e 67 22 0a 20 20 7d 0a 0a 20 20 missing". }..
a4e0: 23 20 24 63 72 61 73 68 66 69 6c 65 20 67 65 74 # $crashfile get
a4f0: 73 20 63 6f 6d 70 61 72 65 64 20 74 6f 20 74 68 s compared to th
a500: 65 20 6e 61 74 69 76 65 20 66 69 6c 65 6e 61 6d e native filenam
a510: 65 20 69 6e 0a 20 20 23 20 63 66 53 79 6e 63 28 e in. # cfSync(
a520: 29 2c 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 ), which can be
a530: 64 69 66 66 65 72 65 6e 74 20 74 68 65 6e 20 77 different then w
a540: 68 61 74 20 54 43 4c 20 75 73 65 73 20 62 79 0a hat TCL uses by.
a550: 20 20 23 20 64 65 66 61 75 6c 74 2c 20 73 6f 20 # default, so
a560: 68 65 72 65 20 77 65 20 66 6f 72 63 65 20 69 74 here we force it
a570: 20 74 6f 20 74 68 65 20 22 6e 61 74 69 76 65 6e to the "nativen
a580: 61 6d 65 22 20 66 6f 72 6d 61 74 2e 0a 20 20 73 ame" format.. s
a590: 65 74 20 63 66 69 6c 65 20 5b 73 74 72 69 6e 67 et cfile [string
a5a0: 20 6d 61 70 20 7b 5c 5c 20 5c 5c 5c 5c 7d 20 5b map {\\ \\\\} [
a5b0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 file nativename
a5c0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 5f [file join [get_
a5d0: 70 77 64 5d 20 24 63 72 61 73 68 66 69 6c 65 5d pwd] $crashfile]
a5e0: 5d 5d 0a 0a 20 20 73 65 74 20 66 20 5b 6f 70 65 ]].. set f [ope
a5f0: 6e 20 63 72 61 73 68 2e 74 63 6c 20 77 5d 0a 20 n crash.tcl w].
a600: 20 70 75 74 73 20 24 66 20 22 73 71 6c 69 74 65 puts $f "sqlite
a610: 33 5f 63 72 61 73 68 5f 65 6e 61 62 6c 65 20 31 3_crash_enable 1
a620: 22 0a 20 20 70 75 74 73 20 24 66 20 22 73 71 6c ". puts $f "sql
a630: 69 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 ite3_crashparams
a640: 20 24 62 6c 6f 63 6b 73 69 7a 65 20 24 64 63 20 $blocksize $dc
a650: 24 63 72 61 73 68 64 65 6c 61 79 20 24 63 66 69 $crashdelay $cfi
a660: 6c 65 22 0a 20 20 70 75 74 73 20 24 66 20 22 73 le". puts $f "s
a670: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 qlite3_test_cont
a680: 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 rol_pending_byte
a690: 20 24 3a 3a 73 71 6c 69 74 65 5f 70 65 6e 64 69 $::sqlite_pendi
a6a0: 6e 67 5f 62 79 74 65 22 0a 0a 20 20 23 20 54 68 ng_byte".. # Th
a6b0: 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 74 68 is block sets th
a6c0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 6f 66 20 e cache size of
a6d0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 the main databas
a6e0: 65 20 74 6f 20 31 30 0a 20 20 23 20 70 61 67 65 e to 10. # page
a6f0: 73 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 s. This is done
a700: 69 6e 20 63 61 73 65 20 74 68 65 20 62 75 69 6c in case the buil
a710: 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 d is configured
a720: 74 6f 20 6f 6d 69 74 0a 20 20 23 20 22 50 52 41 to omit. # "PRA
a730: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e GMA cache_size".
a740: 0a 20 20 69 66 20 7b 24 6f 70 65 6e 64 62 21 3d . if {$opendb!=
a750: 22 22 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 24 ""} {. puts $
a760: 66 20 24 6f 70 65 6e 64 62 20 0a 20 20 20 20 70 f $opendb . p
a770: 75 74 73 20 24 66 20 7b 64 62 20 65 76 61 6c 20 uts $f {db eval
a780: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 {SELECT * FROM s
a790: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 7d 7d 0a qlite_master;}}.
a7a0: 20 20 20 20 70 75 74 73 20 24 66 20 7b 73 65 74 puts $f {set
a7b0: 20 62 74 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f bt [btree_from_
a7c0: 64 62 20 64 62 5d 7d 0a 20 20 20 20 70 75 74 73 db db]}. puts
a7d0: 20 24 66 20 7b 62 74 72 65 65 5f 73 65 74 5f 63 $f {btree_set_c
a7e0: 61 63 68 65 5f 73 69 7a 65 20 24 62 74 20 31 30 ache_size $bt 10
a7f0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 20 7b 24 70 72 }. }.. if {$pr
a800: 6e 67 73 65 65 64 7d 20 7b 0a 20 20 20 20 73 65 ngseed} {. se
a810: 74 20 73 65 65 64 20 5b 65 78 70 72 20 7b 24 70 t seed [expr {$p
a820: 72 6e 67 73 65 65 64 25 31 30 30 30 37 2b 31 7d rngseed%10007+1}
a830: 5d 0a 20 20 20 20 23 20 70 75 74 73 20 73 65 65 ]. # puts see
a840: 64 3d 24 73 65 65 64 0a 20 20 20 20 70 75 74 73 d=$seed. puts
a850: 20 24 66 20 22 64 62 20 65 76 61 6c 20 7b 53 45 $f "db eval {SE
a860: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 LECT randomblob(
a870: 24 73 65 65 64 29 7d 22 0a 20 20 7d 0a 0a 20 20 $seed)}". }..
a880: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 if {[string leng
a890: 74 68 20 24 74 63 6c 62 6f 64 79 5d 3e 30 7d 20 th $tclbody]>0}
a8a0: 7b 0a 20 20 20 20 70 75 74 73 20 24 66 20 24 74 {. puts $f $t
a8b0: 63 6c 62 6f 64 79 0a 20 20 7d 0a 20 20 69 66 20 clbody. }. if
a8c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 {[string length
a8d0: 24 73 71 6c 5d 3e 30 7d 20 7b 0a 20 20 20 20 70 $sql]>0} {. p
a8e0: 75 74 73 20 24 66 20 22 64 62 20 65 76 61 6c 20 uts $f "db eval
a8f0: 7b 22 0a 20 20 20 20 70 75 74 73 20 24 66 20 20 {". puts $f
a900: 20 22 24 73 71 6c 22 0a 20 20 20 20 70 75 74 73 "$sql". puts
a910: 20 24 66 20 22 7d 22 0a 20 20 7d 0a 20 20 63 6c $f "}". }. cl
a920: 6f 73 65 20 24 66 0a 20 20 73 65 74 20 72 20 5b ose $f. set r [
a930: 63 61 74 63 68 20 7b 0a 20 20 20 20 65 78 65 63 catch {. exec
a940: 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 [info nameofexe
a950: 63 5d 20 63 72 61 73 68 2e 74 63 6c 20 3e 40 73 c] crash.tcl >@s
a960: 74 64 6f 75 74 0a 20 20 7d 20 6d 73 67 5d 0a 0a tdout. } msg]..
a970: 20 20 23 20 57 69 6e 64 6f 77 73 2f 41 63 74 69 # Windows/Acti
a980: 76 65 53 74 61 74 65 20 54 43 4c 20 72 65 74 75 veState TCL retu
a990: 72 6e 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 rns a slightly d
a9a0: 69 66 66 65 72 65 6e 74 0a 20 20 23 20 65 72 72 ifferent. # err
a9b0: 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 57 65 20 or message. We
a9c0: 6d 61 70 20 74 68 61 74 20 74 6f 20 74 68 65 20 map that to the
a9d0: 65 78 70 65 63 74 65 64 20 6d 65 73 73 61 67 65 expected message
a9e0: 0a 20 20 23 20 73 6f 20 74 68 61 74 20 77 65 20 . # so that we
a9f0: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 63 68 don't have to ch
aa00: 61 6e 67 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 ange all of the
aa10: 74 65 73 74 0a 20 20 23 20 63 61 73 65 73 2e 0a test. # cases..
aa20: 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 if {$::tcl_pla
aa30: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d tform(platform)=
aa40: 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 ="windows"} {.
aa50: 20 20 69 66 20 7b 24 6d 73 67 3d 3d 22 63 68 69 if {$msg=="chi
aa60: 6c 64 20 6b 69 6c 6c 65 64 3a 20 75 6e 6b 6e 6f ld killed: unkno
aa70: 77 6e 20 73 69 67 6e 61 6c 22 7d 20 7b 0a 20 20 wn signal"} {.
aa80: 20 20 20 20 73 65 74 20 6d 73 67 20 22 63 68 69 set msg "chi
aa90: 6c 64 20 70 72 6f 63 65 73 73 20 65 78 69 74 65 ld process exite
aaa0: 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 22 0a 20 20 d abnormally".
aab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 6c 61 70 70 65 }. }.. lappe
aac0: 6e 64 20 72 20 24 6d 73 67 0a 7d 0a 0a 70 72 6f nd r $msg.}..pro
aad0: 63 20 72 75 6e 5f 69 6f 65 72 72 5f 70 72 65 70 c run_ioerr_prep
aae0: 20 7b 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71 {} {. set ::sq
aaf0: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 lite_io_error_pe
ab00: 6e 64 69 6e 67 20 30 0a 20 20 63 61 74 63 68 20 nding 0. catch
ab10: 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 {db close}. cat
ab20: 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 ch {db2 close}.
ab30: 20 63 61 74 63 68 20 7b 66 6f 72 63 65 64 65 6c catch {forcedel
ab40: 65 74 65 20 74 65 73 74 2e 64 62 7d 0a 20 20 63 ete test.db}. c
ab50: 61 74 63 68 20 7b 66 6f 72 63 65 64 65 6c 65 74 atch {forcedelet
ab60: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 e test.db-journa
ab70: 6c 7d 0a 20 20 63 61 74 63 68 20 7b 66 6f 72 63 l}. catch {forc
ab80: 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 edelete test2.db
ab90: 7d 0a 20 20 63 61 74 63 68 20 7b 66 6f 72 63 65 }. catch {force
aba0: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 2d delete test2.db-
abb0: 6a 6f 75 72 6e 61 6c 7d 0a 20 20 73 65 74 20 3a journal}. set :
abc0: 3a 44 42 20 5b 73 71 6c 69 74 65 33 20 64 62 20 :DB [sqlite3 db
abd0: 74 65 73 74 2e 64 62 3b 20 73 71 6c 69 74 65 33 test.db; sqlite3
abe0: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e _connection_poin
abf0: 74 65 72 20 64 62 5d 0a 20 20 73 71 6c 69 74 65 ter db]. sqlite
ac00: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 3_extended_resul
ac10: 74 5f 63 6f 64 65 73 20 24 3a 3a 44 42 20 24 3a t_codes $::DB $:
ac20: 3a 69 6f 65 72 72 6f 70 74 73 28 2d 65 72 63 29 :ioerropts(-erc)
ac30: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 . if {[info exi
ac40: 73 74 73 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 sts ::ioerropts(
ac50: 2d 74 63 6c 70 72 65 70 29 5d 7d 20 7b 0a 20 20 -tclprep)]} {.
ac60: 20 20 65 76 61 6c 20 24 3a 3a 69 6f 65 72 72 6f eval $::ioerro
ac70: 70 74 73 28 2d 74 63 6c 70 72 65 70 29 0a 20 20 pts(-tclprep).
ac80: 7d 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 }. if {[info ex
ac90: 69 73 74 73 20 3a 3a 69 6f 65 72 72 6f 70 74 73 ists ::ioerropts
aca0: 28 2d 73 71 6c 70 72 65 70 29 5d 7d 20 7b 0a 20 (-sqlprep)]} {.
acb0: 20 20 20 65 78 65 63 73 71 6c 20 24 3a 3a 69 6f execsql $::io
acc0: 65 72 72 6f 70 74 73 28 2d 73 71 6c 70 72 65 70 erropts(-sqlprep
acd0: 29 0a 20 20 7d 0a 20 20 65 78 70 72 20 30 0a 7d ). }. expr 0.}
ace0: 0a 0a 23 20 55 73 61 67 65 3a 20 64 6f 5f 69 6f ..# Usage: do_io
acf0: 65 72 72 5f 74 65 73 74 20 3c 74 65 73 74 20 6e err_test <test n
ad00: 75 6d 62 65 72 3e 20 3c 6f 70 74 69 6f 6e 73 2e umber> <options.
ad10: 2e 2e 3e 0a 23 0a 23 20 54 68 69 73 20 70 72 6f ..>.#.# This pro
ad20: 63 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 c is used to imp
ad30: 6c 65 6d 65 6e 74 20 74 65 73 74 20 63 61 73 65 lement test case
ad40: 73 20 74 68 61 74 20 63 68 65 63 6b 20 74 68 61 s that check tha
ad50: 74 20 49 4f 20 65 72 72 6f 72 73 0a 23 20 61 72 t IO errors.# ar
ad60: 65 20 63 6f 72 72 65 63 74 6c 79 20 68 61 6e 64 e correctly hand
ad70: 6c 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 led. The first a
ad80: 72 67 75 6d 65 6e 74 2c 20 3c 74 65 73 74 20 6e rgument, <test n
ad90: 75 6d 62 65 72 3e 2c 20 69 73 20 61 6e 20 69 6e umber>, is an in
ada0: 74 65 67 65 72 0a 23 20 75 73 65 64 20 74 6f 20 teger.# used to
adb0: 6e 61 6d 65 20 74 68 65 20 74 65 73 74 73 20 65 name the tests e
adc0: 78 65 63 75 74 65 64 20 62 79 20 74 68 69 73 20 xecuted by this
add0: 70 72 6f 63 2e 20 4f 70 74 69 6f 6e 73 20 61 72 proc. Options ar
ade0: 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a e as follows:.#.
adf0: 23 20 20 20 20 20 2d 74 63 6c 70 72 65 70 20 20 # -tclprep
ae00: 20 20 20 20 20 20 20 20 54 43 4c 20 73 63 72 69 TCL scri
ae10: 70 74 20 74 6f 20 72 75 6e 20 74 6f 20 70 72 65 pt to run to pre
ae20: 70 61 72 65 20 74 65 73 74 2e 0a 23 20 20 20 20 pare test..#
ae30: 20 2d 73 71 6c 70 72 65 70 20 20 20 20 20 20 20 -sqlprep
ae40: 20 20 20 53 51 4c 20 73 63 72 69 70 74 20 74 6f SQL script to
ae50: 20 72 75 6e 20 74 6f 20 70 72 65 70 61 72 65 20 run to prepare
ae60: 74 65 73 74 2e 0a 23 20 20 20 20 20 2d 74 63 6c test..# -tcl
ae70: 62 6f 64 79 20 20 20 20 20 20 20 20 20 20 54 43 body TC
ae80: 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 L script to run
ae90: 77 69 74 68 20 49 4f 20 65 72 72 6f 72 20 73 69 with IO error si
aea0: 6d 75 6c 61 74 69 6f 6e 2e 0a 23 20 20 20 20 20 mulation..#
aeb0: 2d 73 71 6c 62 6f 64 79 20 20 20 20 20 20 20 20 -sqlbody
aec0: 20 20 54 43 4c 20 73 63 72 69 70 74 20 74 6f 20 TCL script to
aed0: 72 75 6e 20 77 69 74 68 20 49 4f 20 65 72 72 6f run with IO erro
aee0: 72 20 73 69 6d 75 6c 61 74 69 6f 6e 2e 0a 23 20 r simulation..#
aef0: 20 20 20 20 2d 65 78 63 6c 75 64 65 20 20 20 20 -exclude
af00: 20 20 20 20 20 20 4c 69 73 74 20 6f 66 20 27 4e List of 'N
af10: 27 20 76 61 6c 75 65 73 20 6e 6f 74 20 74 6f 20 ' values not to
af20: 74 65 73 74 2e 0a 23 20 20 20 20 20 2d 65 72 63 test..# -erc
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 Us
af40: 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c e extended resul
af50: 74 20 63 6f 64 65 73 0a 23 20 20 20 20 20 2d 70 t codes.# -p
af60: 65 72 73 69 73 74 20 20 20 20 20 20 20 20 20 20 ersist
af70: 4d 61 6b 65 20 73 69 6d 75 6c 61 74 65 64 20 49 Make simulated I
af80: 2f 4f 20 65 72 72 6f 72 73 20 70 65 72 73 69 73 /O errors persis
af90: 74 65 6e 74 0a 23 20 20 20 20 20 2d 73 74 61 72 tent.# -star
afa0: 74 20 20 20 20 20 20 20 20 20 20 20 20 56 61 6c t Val
afb0: 75 65 20 6f 66 20 27 4e 27 20 74 6f 20 62 65 67 ue of 'N' to beg
afc0: 69 6e 20 77 69 74 68 20 28 64 65 66 61 75 6c 74 in with (default
afd0: 20 31 29 0a 23 0a 23 20 20 20 20 20 2d 63 6b 73 1).#.# -cks
afe0: 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 42 6f um Bo
aff0: 6f 6c 65 61 6e 2e 20 49 66 20 74 72 75 65 2c 20 olean. If true,
b000: 74 65 73 74 20 74 68 61 74 20 74 68 65 20 64 61 test that the da
b010: 74 61 62 61 73 65 20 64 6f 65 73 0a 23 20 20 20 tabase does.#
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b030: 20 20 20 20 6e 6f 74 20 63 68 61 6e 67 65 20 64 not change d
b040: 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 uring the execut
b050: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 73 74 20 ion of the test
b060: 63 61 73 65 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f case..#.proc do_
b070: 69 6f 65 72 72 5f 74 65 73 74 20 7b 74 65 73 74 ioerr_test {test
b080: 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 0a 20 20 name args} {..
b090: 73 65 74 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 set ::ioerropts(
b0a0: 2d 73 74 61 72 74 29 20 31 0a 20 20 73 65 74 20 -start) 1. set
b0b0: 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 63 6b 73 ::ioerropts(-cks
b0c0: 75 6d 29 20 30 0a 20 20 73 65 74 20 3a 3a 69 6f um) 0. set ::io
b0d0: 65 72 72 6f 70 74 73 28 2d 65 72 63 29 20 30 0a erropts(-erc) 0.
b0e0: 20 20 73 65 74 20 3a 3a 69 6f 65 72 72 6f 70 74 set ::ioerropt
b0f0: 73 28 2d 63 6f 75 6e 74 29 20 31 30 30 30 30 30 s(-count) 100000
b100: 30 30 30 0a 20 20 73 65 74 20 3a 3a 69 6f 65 72 000. set ::ioer
b110: 72 6f 70 74 73 28 2d 70 65 72 73 69 73 74 29 20 ropts(-persist)
b120: 31 0a 20 20 73 65 74 20 3a 3a 69 6f 65 72 72 6f 1. set ::ioerro
b130: 70 74 73 28 2d 63 6b 72 65 66 63 6f 75 6e 74 29 pts(-ckrefcount)
b140: 20 30 0a 20 20 73 65 74 20 3a 3a 69 6f 65 72 72 0. set ::ioerr
b150: 6f 70 74 73 28 2d 72 65 73 74 6f 72 65 70 72 6e opts(-restoreprn
b160: 67 29 20 31 0a 20 20 61 72 72 61 79 20 73 65 74 g) 1. array set
b170: 20 3a 3a 69 6f 65 72 72 6f 70 74 73 20 24 61 72 ::ioerropts $ar
b180: 67 73 0a 0a 20 20 23 20 54 45 4d 50 4f 52 41 52 gs.. # TEMPORAR
b190: 59 3a 20 46 6f 72 20 33 2e 35 2e 39 2c 20 64 69 Y: For 3.5.9, di
b1a0: 73 61 62 6c 65 20 74 65 73 74 69 6e 67 20 6f 66 sable testing of
b1b0: 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 extended result
b1c0: 20 63 6f 64 65 73 2e 20 54 68 65 72 65 20 61 72 codes. There ar
b1d0: 65 0a 20 20 23 20 61 20 63 6f 75 70 6c 65 20 6f e. # a couple o
b1e0: 66 20 6f 62 73 63 75 72 65 20 49 4f 20 65 72 72 f obscure IO err
b1f0: 6f 72 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 ors that do not
b200: 72 65 74 75 72 6e 20 74 68 65 6d 2e 0a 20 20 73 return them.. s
b210: 65 74 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d et ::ioerropts(-
b220: 65 72 63 29 20 30 0a 0a 20 20 23 20 43 72 65 61 erc) 0.. # Crea
b230: 74 65 20 61 20 73 69 6e 67 6c 65 20 54 43 4c 20 te a single TCL
b240: 73 63 72 69 70 74 20 66 72 6f 6d 20 74 68 65 20 script from the
b250: 54 43 4c 20 61 6e 64 20 53 51 4c 20 73 70 65 63 TCL and SQL spec
b260: 69 66 69 65 64 0a 20 20 23 20 61 73 20 74 68 65 ified. # as the
b270: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 65 73 body of the tes
b280: 74 2e 0a 20 20 73 65 74 20 3a 3a 69 6f 65 72 72 t.. set ::ioerr
b290: 6f 72 62 6f 64 79 20 7b 7d 0a 20 20 69 66 20 7b orbody {}. if {
b2a0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 [info exists ::i
b2b0: 6f 65 72 72 6f 70 74 73 28 2d 74 63 6c 62 6f 64 oerropts(-tclbod
b2c0: 79 29 5d 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e y)]} {. appen
b2d0: 64 20 3a 3a 69 6f 65 72 72 6f 72 62 6f 64 79 20 d ::ioerrorbody
b2e0: 22 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 74 "$::ioerropts(-t
b2f0: 63 6c 62 6f 64 79 29 5c 6e 22 0a 20 20 7d 0a 20 clbody)\n". }.
b300: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 if {[info exist
b310: 73 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 73 s ::ioerropts(-s
b320: 71 6c 62 6f 64 79 29 5d 7d 20 7b 0a 20 20 20 20 qlbody)]} {.
b330: 61 70 70 65 6e 64 20 3a 3a 69 6f 65 72 72 6f 72 append ::ioerror
b340: 62 6f 64 79 20 22 64 62 20 65 76 61 6c 20 7b 24 body "db eval {$
b350: 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 73 71 6c ::ioerropts(-sql
b360: 62 6f 64 79 29 7d 22 0a 20 20 7d 0a 0a 20 20 73 body)}". }.. s
b370: 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 20 ave_prng_state.
b380: 20 69 66 20 7b 24 3a 3a 69 6f 65 72 72 6f 70 74 if {$::ioerropt
b390: 73 28 2d 63 6b 73 75 6d 29 7d 20 7b 0a 20 20 20 s(-cksum)} {.
b3a0: 20 72 75 6e 5f 69 6f 65 72 72 5f 70 72 65 70 0a run_ioerr_prep.
b3b0: 20 20 20 20 65 76 61 6c 20 24 3a 3a 69 6f 65 72 eval $::ioer
b3c0: 72 6f 72 62 6f 64 79 0a 20 20 20 20 73 65 74 20 rorbody. set
b3d0: 3a 3a 67 6f 6f 64 63 6b 73 75 6d 20 5b 63 6b 73 ::goodcksum [cks
b3e0: 75 6d 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 3a um]. }.. set :
b3f0: 3a 67 6f 20 31 0a 20 20 23 72 65 73 65 74 5f 70 :go 1. #reset_p
b400: 72 6e 67 5f 73 74 61 74 65 0a 20 20 66 6f 72 20 rng_state. for
b410: 7b 73 65 74 20 6e 20 24 3a 3a 69 6f 65 72 72 6f {set n $::ioerro
b420: 70 74 73 28 2d 73 74 61 72 74 29 7d 20 7b 24 3a pts(-start)} {$:
b430: 3a 67 6f 7d 20 7b 69 6e 63 72 20 6e 7d 20 7b 0a :go} {incr n} {.
b440: 20 20 20 20 73 65 74 20 3a 3a 54 4e 20 24 6e 0a set ::TN $n.
b450: 20 20 20 20 69 6e 63 72 20 3a 3a 69 6f 65 72 72 incr ::ioerr
b460: 6f 70 74 73 28 2d 63 6f 75 6e 74 29 20 2d 31 0a opts(-count) -1.
b470: 20 20 20 20 69 66 20 7b 24 3a 3a 69 6f 65 72 72 if {$::ioerr
b480: 6f 70 74 73 28 2d 63 6f 75 6e 74 29 3c 30 7d 20 opts(-count)<0}
b490: 62 72 65 61 6b 0a 0a 20 20 20 20 23 20 53 6b 69 break.. # Ski
b4a0: 70 20 74 68 69 73 20 49 4f 20 65 72 72 6f 72 20 p this IO error
b4b0: 69 66 20 69 74 20 77 61 73 20 73 70 65 63 69 66 if it was specif
b4c0: 69 65 64 20 77 69 74 68 20 74 68 65 20 22 2d 65 ied with the "-e
b4d0: 78 63 6c 75 64 65 22 20 6f 70 74 69 6f 6e 2e 0a xclude" option..
b4e0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 if {[info ex
b4f0: 69 73 74 73 20 3a 3a 69 6f 65 72 72 6f 70 74 73 ists ::ioerropts
b500: 28 2d 65 78 63 6c 75 64 65 29 5d 7d 20 7b 0a 20 (-exclude)]} {.
b510: 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 if {[lsearc
b520: 68 20 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d h $::ioerropts(-
b530: 65 78 63 6c 75 64 65 29 20 24 6e 5d 21 3d 2d 31 exclude) $n]!=-1
b540: 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 7d } continue. }
b550: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 69 6f 65 72 . if {$::ioer
b560: 72 6f 70 74 73 28 2d 72 65 73 74 6f 72 65 70 72 ropts(-restorepr
b570: 6e 67 29 7d 20 7b 0a 20 20 20 20 20 20 72 65 73 ng)} {. res
b580: 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a tore_prng_state.
b590: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 44 65 6c }.. # Del
b5a0: 65 74 65 20 74 68 65 20 66 69 6c 65 73 20 74 65 ete the files te
b5b0: 73 74 2e 64 62 20 61 6e 64 20 74 65 73 74 32 2e st.db and test2.
b5c0: 64 62 2c 20 74 68 65 6e 20 65 78 65 63 75 74 65 db, then execute
b5d0: 20 74 68 65 20 54 43 4c 20 61 6e 64 0a 20 20 20 the TCL and.
b5e0: 20 23 20 53 51 4c 20 28 69 6e 20 74 68 61 74 20 # SQL (in that
b5f0: 6f 72 64 65 72 29 20 74 6f 20 70 72 65 70 61 72 order) to prepar
b600: 65 20 66 6f 72 20 74 68 65 20 74 65 73 74 20 63 e for the test c
b610: 61 73 65 2e 0a 20 20 20 20 64 6f 5f 74 65 73 74 ase.. do_test
b620: 20 24 74 65 73 74 6e 61 6d 65 2e 24 6e 2e 31 20 $testname.$n.1
b630: 7b 0a 20 20 20 20 20 20 72 75 6e 5f 69 6f 65 72 {. run_ioer
b640: 72 5f 70 72 65 70 0a 20 20 20 20 7d 20 7b 30 7d r_prep. } {0}
b650: 0a 0a 20 20 20 20 23 20 52 65 61 64 20 74 68 65 .. # Read the
b660: 20 27 63 68 65 63 6b 73 75 6d 27 20 6f 66 20 74 'checksum' of t
b670: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 he database..
b680: 20 69 66 20 7b 24 3a 3a 69 6f 65 72 72 6f 70 74 if {$::ioerropt
b690: 73 28 2d 63 6b 73 75 6d 29 7d 20 7b 0a 20 20 20 s(-cksum)} {.
b6a0: 20 20 20 73 65 74 20 3a 3a 63 68 65 63 6b 73 75 set ::checksu
b6b0: 6d 20 5b 63 6b 73 75 6d 5d 0a 20 20 20 20 7d 0a m [cksum]. }.
b6c0: 0a 20 20 20 20 23 20 53 65 74 20 74 68 65 20 4e . # Set the N
b6d0: 74 68 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 66 th IO error to f
b6e0: 61 69 6c 2e 0a 20 20 20 20 64 6f 5f 74 65 73 74 ail.. do_test
b6f0: 20 24 74 65 73 74 6e 61 6d 65 2e 24 6e 2e 32 20 $testname.$n.2
b700: 5b 73 75 62 73 74 20 7b 0a 20 20 20 20 20 20 73 [subst {. s
b710: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 et ::sqlite_io_e
b720: 72 72 6f 72 5f 70 65 72 73 69 73 74 20 24 3a 3a rror_persist $::
b730: 69 6f 65 72 72 6f 70 74 73 28 2d 70 65 72 73 69 ioerropts(-persi
b740: 73 74 29 0a 20 20 20 20 20 20 73 65 74 20 3a 3a st). set ::
b750: 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f sqlite_io_error_
b760: 70 65 6e 64 69 6e 67 20 24 6e 0a 20 20 20 20 7d pending $n. }
b770: 5d 20 24 6e 0a 0a 20 20 20 20 23 20 45 78 65 63 ] $n.. # Exec
b780: 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69 ute the TCL scri
b790: 70 74 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 pt created for t
b7a0: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 69 73 20 he body of this
b7b0: 74 65 73 74 2e 20 49 66 0a 20 20 20 20 23 20 61 test. If. # a
b7c0: 74 20 6c 65 61 73 74 20 4e 20 49 4f 20 6f 70 65 t least N IO ope
b7d0: 72 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 rations performe
b7e0: 64 20 62 79 20 53 51 4c 69 74 65 20 61 73 20 61 d by SQLite as a
b7f0: 20 72 65 73 75 6c 74 20 6f 66 0a 20 20 20 20 23 result of. #
b800: 20 74 68 65 20 73 63 72 69 70 74 2c 20 74 68 65 the script, the
b810: 20 4e 74 68 20 77 69 6c 6c 20 66 61 69 6c 2e 0a Nth will fail..
b820: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 do_test $tes
b830: 74 6e 61 6d 65 2e 24 6e 2e 33 20 7b 0a 20 20 20 tname.$n.3 {.
b840: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f set ::sqlite_
b850: 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 30 0a 20 io_error_hit 0.
b860: 20 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 set ::sqlit
b870: 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 e_io_error_hardh
b880: 69 74 20 30 0a 20 20 20 20 20 20 73 65 74 20 72 it 0. set r
b890: 20 5b 63 61 74 63 68 20 24 3a 3a 69 6f 65 72 72 [catch $::ioerr
b8a0: 6f 72 62 6f 64 79 20 6d 73 67 5d 0a 20 20 20 20 orbody msg].
b8b0: 20 20 73 65 74 20 3a 3a 65 72 72 73 65 65 6e 20 set ::errseen
b8c0: 24 72 0a 20 20 20 20 20 20 73 65 74 20 72 63 20 $r. set rc
b8d0: 5b 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 [sqlite3_errcode
b8e0: 20 24 3a 3a 44 42 5d 0a 20 20 20 20 20 20 69 66 $::DB]. if
b8f0: 20 7b 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d {$::ioerropts(-
b900: 65 72 63 29 7d 20 7b 0a 20 20 20 20 20 20 20 20 erc)} {.
b910: 23 20 49 66 20 77 65 20 61 72 65 20 69 6e 20 65 # If we are in e
b920: 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 xtended result c
b930: 6f 64 65 20 6d 6f 64 65 2c 20 6d 61 6b 65 20 73 ode mode, make s
b940: 75 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 ure all of the.
b950: 20 20 20 20 20 20 20 23 20 49 4f 45 52 52 73 20 # IOERRs
b960: 77 65 20 67 65 74 20 62 61 63 6b 20 72 65 61 6c we get back real
b970: 6c 79 20 64 6f 20 68 61 76 65 20 74 68 65 69 72 ly do have their
b980: 20 65 78 74 65 6e 64 65 64 20 63 6f 64 65 20 76 extended code v
b990: 61 6c 75 65 73 2e 0a 20 20 20 20 20 20 20 20 23 alues.. #
b9a0: 20 49 66 20 61 6e 20 65 78 74 65 6e 64 65 64 20 If an extended
b9b0: 72 65 73 75 6c 74 20 63 6f 64 65 20 69 73 20 72 result code is r
b9c0: 65 74 75 72 6e 65 64 2c 20 74 68 65 20 73 71 6c eturned, the sql
b9d0: 69 74 65 33 5f 65 72 72 63 6f 64 65 0a 20 20 20 ite3_errcode.
b9e0: 20 20 20 20 20 23 20 54 43 4c 63 6f 6d 6d 61 6e # TCLcomman
b9f0: 64 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 d will return a
ba00: 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f string of the fo
ba10: 72 6d 3a 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 rm: SQLITE_IOER
ba20: 52 2b 6e 6e 6e 6e 0a 20 20 20 20 20 20 20 20 23 R+nnnn. #
ba30: 20 77 68 65 72 65 20 6e 6e 6e 6e 20 69 73 20 61 where nnnn is a
ba40: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 number.
ba50: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 53 51 if {[regexp {^SQ
ba60: 4c 49 54 45 5f 49 4f 45 52 52 7d 20 24 72 63 5d LITE_IOERR} $rc]
ba70: 20 26 26 20 21 5b 72 65 67 65 78 70 20 7b 49 4f && ![regexp {IO
ba80: 45 52 52 5c 2b 5c 64 7d 20 24 72 63 5d 7d 20 7b ERR\+\d} $rc]} {
ba90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
baa0: 6e 20 24 72 63 0a 20 20 20 20 20 20 20 20 7d 0a n $rc. }.
bab0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 } else {.
bac0: 20 20 20 20 20 20 20 23 20 49 66 20 77 65 20 61 # If we a
bad0: 72 65 20 6e 6f 74 20 69 6e 20 65 78 74 65 6e 64 re not in extend
bae0: 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 20 6d ed result code m
baf0: 6f 64 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e ode, make sure n
bb00: 6f 0a 20 20 20 20 20 20 20 20 23 20 65 78 74 65 o. # exte
bb10: 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 73 nded error codes
bb20: 20 61 72 65 20 72 65 74 75 72 6e 65 64 2e 0a 20 are returned..
bb30: 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 if {[rege
bb40: 78 70 20 7b 5c 2b 5c 64 7d 20 24 72 63 5d 7d 20 xp {\+\d} $rc]}
bb50: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 {. retu
bb60: 72 6e 20 24 72 63 0a 20 20 20 20 20 20 20 20 7d rn $rc. }
bb70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 23 . }. #
bb80: 20 54 68 65 20 74 65 73 74 20 72 65 70 65 61 74 The test repeat
bb90: 73 20 61 73 20 6c 6f 6e 67 20 61 73 20 24 3a 3a s as long as $::
bba0: 67 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 go is non-zero.
bbb0: 20 24 3a 3a 67 6f 20 73 74 61 72 74 73 20 6f 75 $::go starts ou
bbc0: 74 0a 20 20 20 20 20 20 23 20 61 73 20 31 2e 20 t. # as 1.
bbd0: 20 57 68 65 6e 20 61 20 74 65 73 74 20 72 75 6e When a test run
bbe0: 73 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 s to completion
bbf0: 77 69 74 68 6f 75 74 20 68 69 74 74 69 6e 67 20 without hitting
bc00: 61 6e 20 49 2f 4f 0a 20 20 20 20 20 20 23 20 65 an I/O. # e
bc10: 72 72 6f 72 2c 20 74 68 61 74 20 6d 65 61 6e 73 rror, that means
bc20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 there is no poi
bc30: 6e 74 20 69 6e 20 63 6f 6e 74 69 6e 75 69 6e 67 nt in continuing
bc40: 20 77 69 74 68 20 74 68 69 73 20 74 65 73 74 0a with this test.
bc50: 20 20 20 20 20 20 23 20 63 61 73 65 20 73 6f 20 # case so
bc60: 73 65 74 20 24 3a 3a 67 6f 20 74 6f 20 7a 65 72 set $::go to zer
bc70: 6f 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 o.. #.
bc80: 20 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 69 if {$::sqlite_i
bc90: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3e o_error_pending>
bca0: 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 0} {. set
bcb0: 20 3a 3a 67 6f 20 30 0a 20 20 20 20 20 20 20 20 ::go 0.
bcc0: 73 65 74 20 71 20 30 0a 20 20 20 20 20 20 20 20 set q 0.
bcd0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f set ::sqlite_io_
bce0: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30 0a error_pending 0.
bcf0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 } else {.
bd00: 20 20 20 20 20 20 20 73 65 74 20 71 20 31 0a 20 set q 1.
bd10: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 65 }.. se
bd20: 74 20 73 20 5b 65 78 70 72 20 24 3a 3a 73 71 6c t s [expr $::sql
bd30: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 ite_io_error_hit
bd40: 3d 3d 30 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 ==0]. if {$
bd50: 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f ::sqlite_io_erro
bd60: 72 5f 68 69 74 3e 24 3a 3a 73 71 6c 69 74 65 5f r_hit>$::sqlite_
bd70: 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 69 74 io_error_hardhit
bd80: 20 26 26 20 24 72 3d 3d 30 7d 20 7b 0a 20 20 20 && $r==0} {.
bd90: 20 20 20 20 20 73 65 74 20 72 20 31 0a 20 20 20 set r 1.
bda0: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20 3a }. set :
bdb0: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 :sqlite_io_error
bdc0: 5f 68 69 74 20 30 0a 0a 20 20 20 20 20 20 23 20 _hit 0.. #
bdd0: 4f 6e 65 20 6f 66 20 74 77 6f 20 74 68 69 6e 67 One of two thing
bde0: 73 20 6d 75 73 74 20 68 61 76 65 20 68 61 70 70 s must have happ
bdf0: 65 6e 65 64 2e 20 65 69 74 68 65 72 0a 20 20 20 ened. either.
be00: 20 20 20 23 20 20 20 31 2e 20 20 57 65 20 6e 65 # 1. We ne
be10: 76 65 72 20 68 69 74 20 74 68 65 20 49 4f 20 65 ver hit the IO e
be20: 72 72 6f 72 20 61 6e 64 20 74 68 65 20 53 51 4c rror and the SQL
be30: 20 72 65 74 75 72 6e 65 64 20 4f 4b 0a 20 20 20 returned OK.
be40: 20 20 20 23 20 20 20 32 2e 20 20 41 6e 20 49 4f # 2. An IO
be50: 20 65 72 72 6f 72 20 77 61 73 20 68 69 74 20 61 error was hit a
be60: 6e 64 20 74 68 65 20 53 51 4c 20 66 61 69 6c 65 nd the SQL faile
be70: 64 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 d. #.
be80: 23 70 75 74 73 20 22 73 3d 24 73 20 72 3d 24 72 #puts "s=$s r=$r
be90: 20 71 3d 24 71 22 0a 20 20 20 20 20 20 65 78 70 q=$q". exp
bea0: 72 20 7b 20 28 24 73 20 26 26 20 21 24 72 20 26 r { ($s && !$r &
beb0: 26 20 21 24 71 29 20 7c 7c 20 28 21 24 73 20 26 & !$q) || (!$s &
bec0: 26 20 24 72 20 26 26 20 24 71 29 20 7d 0a 20 20 & $r && $q) }.
bed0: 20 20 7d 20 7b 31 7d 0a 0a 20 20 20 20 73 65 74 } {1}.. set
bee0: 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 ::sqlite_io_err
bef0: 6f 72 5f 68 69 74 20 30 0a 20 20 20 20 73 65 74 or_hit 0. set
bf00: 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 ::sqlite_io_err
bf10: 6f 72 5f 70 65 6e 64 69 6e 67 20 30 0a 0a 20 20 or_pending 0..
bf20: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 6e # Check that n
bf30: 6f 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 o page reference
bf40: 73 20 77 65 72 65 20 6c 65 61 6b 65 64 2e 20 54 s were leaked. T
bf50: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 0a 20 here should be.
bf60: 20 20 20 23 20 61 20 73 69 6e 67 6c 65 20 72 65 # a single re
bf70: 66 65 72 65 6e 63 65 20 69 66 20 74 68 65 72 65 ference if there
bf80: 20 69 73 20 73 74 69 6c 6c 20 61 6e 20 61 63 74 is still an act
bf90: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c ive transaction,
bfa0: 0a 20 20 20 20 23 20 6f 72 20 7a 65 72 6f 20 6f . # or zero o
bfb0: 74 68 65 72 77 69 73 65 2e 0a 20 20 20 20 23 0a therwise.. #.
bfc0: 20 20 20 20 23 20 55 50 44 41 54 45 3a 20 49 66 # UPDATE: If
bfd0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 6f 63 the IO error oc
bfe0: 63 75 72 73 20 61 66 74 65 72 20 61 20 27 42 45 curs after a 'BE
bff0: 47 49 4e 27 20 62 75 74 20 62 65 66 6f 72 65 20 GIN' but before
c000: 61 6e 79 0a 20 20 20 20 23 20 6c 6f 63 6b 73 20 any. # locks
c010: 61 72 65 20 65 73 74 61 62 6c 69 73 68 65 64 20 are established
c020: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 on database file
c030: 73 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 65 s (i.e. if the e
c040: 72 72 6f 72 0a 20 20 20 20 23 20 6f 63 63 75 72 rror. # occur
c050: 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 s while attempti
c060: 6e 67 20 74 6f 20 64 65 74 65 63 74 20 61 20 68 ng to detect a h
c070: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 ot-journal file)
c080: 2c 20 74 68 65 6e 0a 20 20 20 20 23 20 74 68 65 , then. # the
c090: 72 65 20 6d 61 79 20 30 20 70 61 67 65 20 72 65 re may 0 page re
c0a0: 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6e 20 ferences and an
c0b0: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 active transacti
c0c0: 6f 6e 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 on according.
c0d0: 20 23 20 74 6f 20 5b 73 71 6c 69 74 65 33 5f 67 # to [sqlite3_g
c0e0: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 5d 2e 0a et_autocommit]..
c0f0: 20 20 20 20 23 0a 20 20 20 20 69 66 20 7b 24 3a #. if {$:
c100: 3a 67 6f 20 26 26 20 24 3a 3a 73 71 6c 69 74 65 :go && $::sqlite
c110: 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 69 _io_error_hardhi
c120: 74 20 26 26 20 24 3a 3a 69 6f 65 72 72 6f 70 74 t && $::ioerropt
c130: 73 28 2d 63 6b 72 65 66 63 6f 75 6e 74 29 7d 20 s(-ckrefcount)}
c140: 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 {. do_test
c150: 24 74 65 73 74 6e 61 6d 65 2e 24 6e 2e 34 20 7b $testname.$n.4 {
c160: 0a 20 20 20 20 20 20 20 20 73 65 74 20 62 74 20 . set bt
c170: 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 20 64 [btree_from_db d
c180: 62 5d 0a 20 20 20 20 20 20 20 20 64 62 5f 65 6e b]. db_en
c190: 74 65 72 20 64 62 0a 20 20 20 20 20 20 20 20 61 ter db. a
c1a0: 72 72 61 79 20 73 65 74 20 73 74 61 74 73 20 5b rray set stats [
c1b0: 62 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74 btree_pager_stat
c1c0: 73 20 24 62 74 5d 0a 20 20 20 20 20 20 20 20 64 s $bt]. d
c1d0: 62 5f 6c 65 61 76 65 20 64 62 0a 20 20 20 20 20 b_leave db.
c1e0: 20 20 20 73 65 74 20 6e 52 65 66 20 24 73 74 61 set nRef $sta
c1f0: 74 73 28 72 65 66 29 0a 20 20 20 20 20 20 20 20 ts(ref).
c200: 65 78 70 72 20 7b 24 6e 52 65 66 20 3d 3d 20 30 expr {$nRef == 0
c210: 20 7c 7c 20 28 5b 73 71 6c 69 74 65 33 5f 67 65 || ([sqlite3_ge
c220: 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64 62 5d t_autocommit db]
c230: 3d 3d 30 20 26 26 20 24 6e 52 65 66 20 3d 3d 20 ==0 && $nRef ==
c240: 31 29 7d 0a 20 20 20 20 20 20 7d 20 7b 31 7d 0a 1)}. } {1}.
c250: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 49 66 20 }.. # If
c260: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e there is an open
c270: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 database handle
c280: 20 61 6e 64 20 6e 6f 20 6f 70 65 6e 20 74 72 61 and no open tra
c290: 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 23 20 nsaction,. #
c2a0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 and the pager is
c2b0: 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 69 6e 20 not running in
c2c0: 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e exclusive-lockin
c2d0: 67 20 6d 6f 64 65 2c 0a 20 20 20 20 23 20 63 68 g mode,. # ch
c2e0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 eck that the pag
c2f0: 65 72 20 69 73 20 69 6e 20 22 75 6e 6c 6f 63 6b er is in "unlock
c300: 65 64 22 20 73 74 61 74 65 2e 20 54 68 65 6f 72 ed" state. Theor
c310: 65 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 23 20 etically,. #
c320: 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e if a call to xUn
c330: 6c 6f 63 6b 28 29 20 66 61 69 6c 65 64 20 64 75 lock() failed du
c340: 65 20 74 6f 20 61 6e 20 49 4f 20 65 72 72 6f 72 e to an IO error
c350: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a the underlying.
c360: 20 20 20 20 23 20 66 69 6c 65 20 6d 61 79 20 73 # file may s
c370: 74 69 6c 6c 20 62 65 20 6c 6f 63 6b 65 64 2e 0a till be locked..
c380: 20 20 20 20 23 0a 20 20 20 20 69 66 63 61 70 61 #. ifcapa
c390: 62 6c 65 20 70 72 61 67 6d 61 20 7b 0a 20 20 20 ble pragma {.
c3a0: 20 20 20 69 66 20 7b 20 5b 69 6e 66 6f 20 63 6f if { [info co
c3b0: 6d 6d 61 6e 64 73 20 64 62 5d 20 6e 65 20 22 22 mmands db] ne ""
c3c0: 0a 20 20 20 20 20 20 20 20 26 26 20 24 3a 3a 69 . && $::i
c3d0: 6f 65 72 72 6f 70 74 73 28 2d 63 6b 72 65 66 63 oerropts(-ckrefc
c3e0: 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 20 26 26 ount). &&
c3f0: 20 5b 64 62 20 6f 6e 65 20 7b 70 72 61 67 6d 61 [db one {pragma
c400: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 5d 20 locking_mode}]
c410: 65 71 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 eq "normal".
c420: 20 20 20 20 26 26 20 5b 73 71 6c 69 74 65 33 5f && [sqlite3_
c430: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64 get_autocommit d
c440: 62 5d 0a 20 20 20 20 20 20 7d 20 7b 0a 20 20 20 b]. } {.
c450: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65 do_test $te
c460: 73 74 6e 61 6d 65 2e 24 6e 2e 35 20 7b 0a 20 20 stname.$n.5 {.
c470: 20 20 20 20 20 20 20 20 73 65 74 20 62 74 20 5b set bt [
c480: 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 20 64 62 btree_from_db db
c490: 5d 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f 65 ]. db_e
c4a0: 6e 74 65 72 20 64 62 0a 20 20 20 20 20 20 20 20 nter db.
c4b0: 20 20 61 72 72 61 79 20 73 65 74 20 73 74 61 74 array set stat
c4c0: 73 20 5b 62 74 72 65 65 5f 70 61 67 65 72 5f 73 s [btree_pager_s
c4d0: 74 61 74 73 20 24 62 74 5d 0a 20 20 20 20 20 20 tats $bt].
c4e0: 20 20 20 20 64 62 5f 6c 65 61 76 65 20 64 62 0a db_leave db.
c4f0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 74 set st
c500: 61 74 73 28 73 74 61 74 65 29 0a 20 20 20 20 20 ats(state).
c510: 20 20 20 7d 20 30 0a 20 20 20 20 20 20 7d 0a 20 } 0. }.
c520: 20 20 20 7d 0a 0a 20 20 20 20 23 20 49 66 20 61 }.. # If a
c530: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 n IO error occur
c540: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 red, then the ch
c550: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 64 61 ecksum of the da
c560: 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 20 20 tabase should.
c570: 20 20 23 20 62 65 20 74 68 65 20 73 61 6d 65 20 # be the same
c580: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 as before the sc
c590: 72 69 70 74 20 74 68 61 74 20 63 61 75 73 65 64 ript that caused
c5a0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 77 61 the IO error wa
c5b0: 73 20 72 75 6e 2e 0a 20 20 20 20 23 0a 20 20 20 s run.. #.
c5c0: 20 69 66 20 7b 24 3a 3a 67 6f 20 26 26 20 24 3a if {$::go && $:
c5d0: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 :sqlite_io_error
c5e0: 5f 68 61 72 64 68 69 74 20 26 26 20 24 3a 3a 69 _hardhit && $::i
c5f0: 6f 65 72 72 6f 70 74 73 28 2d 63 6b 73 75 6d 29 oerropts(-cksum)
c600: 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 } {. do_tes
c610: 74 20 24 74 65 73 74 6e 61 6d 65 2e 24 6e 2e 36 t $testname.$n.6
c620: 20 7b 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 {. catch
c630: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 20 20 {db close}.
c640: 20 20 20 20 63 61 74 63 68 20 7b 64 62 32 20 63 catch {db2 c
c650: 6c 6f 73 65 7d 0a 20 20 20 20 20 20 20 20 73 65 lose}. se
c660: 74 20 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33 20 t ::DB [sqlite3
c670: 64 62 20 74 65 73 74 2e 64 62 3b 20 73 71 6c 69 db test.db; sqli
c680: 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 te3_connection_p
c690: 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20 20 20 20 ointer db].
c6a0: 20 20 20 73 65 74 20 6e 6f 77 63 6b 73 75 6d 20 set nowcksum
c6b0: 5b 63 6b 73 75 6d 5d 0a 20 20 20 20 20 20 20 20 [cksum].
c6c0: 73 65 74 20 72 65 73 20 5b 65 78 70 72 20 7b 24 set res [expr {$
c6d0: 6e 6f 77 63 6b 73 75 6d 3d 3d 24 3a 3a 63 68 65 nowcksum==$::che
c6e0: 63 6b 73 75 6d 20 7c 7c 20 24 6e 6f 77 63 6b 73 cksum || $nowcks
c6f0: 75 6d 3d 3d 24 3a 3a 67 6f 6f 64 63 6b 73 75 6d um==$::goodcksum
c700: 7d 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 }]. if {$
c710: 72 65 73 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 res==0} {.
c720: 20 20 20 20 6f 75 74 70 75 74 32 20 22 6e 6f 77 output2 "now
c730: 3d 24 6e 6f 77 63 6b 73 75 6d 22 0a 20 20 20 20 =$nowcksum".
c740: 20 20 20 20 20 20 6f 75 74 70 75 74 32 20 22 74 output2 "t
c750: 68 65 3d 24 3a 3a 63 68 65 63 6b 73 75 6d 22 0a he=$::checksum".
c760: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 output
c770: 32 20 22 66 77 64 3d 24 3a 3a 67 6f 6f 64 63 6b 2 "fwd=$::goodck
c780: 73 75 6d 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 sum". }.
c790: 20 20 20 20 20 20 20 73 65 74 20 72 65 73 0a 20 set res.
c7a0: 20 20 20 20 20 7d 20 31 0a 20 20 20 20 7d 0a 0a } 1. }..
c7b0: 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 set ::sqlite
c7c0: 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 69 _io_error_hardhi
c7d0: 74 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 t 0. set ::sq
c7e0: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 lite_io_error_pe
c7f0: 6e 64 69 6e 67 20 30 0a 20 20 20 20 69 66 20 7b nding 0. if {
c800: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 [info exists ::i
c810: 6f 65 72 72 6f 70 74 73 28 2d 63 6c 65 61 6e 75 oerropts(-cleanu
c820: 70 29 5d 7d 20 7b 0a 20 20 20 20 20 20 63 61 74 p)]} {. cat
c830: 63 68 20 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28 ch $::ioerropts(
c840: 2d 63 6c 65 61 6e 75 70 29 0a 20 20 20 20 7d 0a -cleanup). }.
c850: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 }. set ::sqli
c860: 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 te_io_error_pend
c870: 69 6e 67 20 30 0a 20 20 73 65 74 20 3a 3a 73 71 ing 0. set ::sq
c880: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 lite_io_error_pe
c890: 72 73 69 73 74 20 30 0a 20 20 75 6e 73 65 74 20 rsist 0. unset
c8a0: 3a 3a 69 6f 65 72 72 6f 70 74 73 0a 7d 0a 0a 23 ::ioerropts.}..#
c8b0: 20 52 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 Return a checks
c8c0: 75 6d 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 um based on the
c8d0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
c8e0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 61 73 main database as
c8f0: 73 6f 63 69 61 74 65 64 0a 23 20 77 69 74 68 20 sociated.# with
c900: 63 6f 6e 6e 65 63 74 69 6f 6e 20 24 64 62 0a 23 connection $db.#
c910: 0a 70 72 6f 63 20 63 6b 73 75 6d 20 7b 7b 64 62 .proc cksum {{db
c920: 20 64 62 7d 7d 20 7b 0a 20 20 73 65 74 20 74 78 db}} {. set tx
c930: 74 20 5b 24 64 62 20 65 76 61 6c 20 7b 0a 20 20 t [$db eval {.
c940: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c SELECT name,
c950: 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 type, sql FROM
c960: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 sqlite_master or
c970: 64 65 72 20 62 79 20 6e 61 6d 65 0a 20 20 7d 5d der by name. }]
c980: 5c 6e 0a 20 20 66 6f 72 65 61 63 68 20 74 62 6c \n. foreach tbl
c990: 20 5b 24 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 [$db eval {.
c9a0: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 SELECT name F
c9b0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 ROM sqlite_maste
c9c0: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 r WHERE type='ta
c9d0: 62 6c 65 27 20 6f 72 64 65 72 20 62 79 20 6e 61 ble' order by na
c9e0: 6d 65 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 61 70 me. }] {. ap
c9f0: 70 65 6e 64 20 74 78 74 20 5b 24 64 62 20 65 76 pend txt [$db ev
ca00: 61 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f al "SELECT * FRO
ca10: 4d 20 24 74 62 6c 22 5d 5c 6e 0a 20 20 7d 0a 20 M $tbl"]\n. }.
ca20: 20 66 6f 72 65 61 63 68 20 70 72 61 67 20 7b 64 foreach prag {d
ca30: 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f efault_synchrono
ca40: 75 73 20 64 65 66 61 75 6c 74 5f 63 61 63 68 65 us default_cache
ca50: 5f 73 69 7a 65 7d 20 7b 0a 20 20 20 20 61 70 70 _size} {. app
ca60: 65 6e 64 20 74 78 74 20 24 70 72 61 67 2d 5b 24 end txt $prag-[$
ca70: 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 db eval "PRAGMA
ca80: 24 70 72 61 67 22 5d 5c 6e 0a 20 20 7d 0a 20 20 $prag"]\n. }.
ca90: 73 65 74 20 63 6b 73 75 6d 20 5b 73 74 72 69 6e set cksum [strin
caa0: 67 20 6c 65 6e 67 74 68 20 24 74 78 74 5d 2d 5b g length $txt]-[
cab0: 6d 64 35 20 24 74 78 74 5d 0a 20 20 23 20 70 75 md5 $txt]. # pu
cac0: 74 73 20 24 63 6b 73 75 6d 2d 5b 66 69 6c 65 20 ts $cksum-[file
cad0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 20 20 size test.db].
cae0: 72 65 74 75 72 6e 20 24 63 6b 73 75 6d 0a 7d 0a return $cksum.}.
caf0: 0a 23 20 47 65 6e 65 72 61 74 65 20 61 20 63 68 .# Generate a ch
cb00: 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 ecksum based on
cb10: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 the contents of
cb20: 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d the main and tem
cb30: 70 20 74 61 62 6c 65 73 0a 23 20 64 61 74 61 62 p tables.# datab
cb40: 61 73 65 20 24 64 62 2e 20 49 66 20 74 68 65 20 ase $db. If the
cb50: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 77 6f 20 checksum of two
cb60: 64 61 74 61 62 61 73 65 73 20 69 73 20 74 68 65 databases is the
cb70: 20 73 61 6d 65 2c 20 61 6e 64 20 74 68 65 0a 23 same, and the.#
cb80: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b integrity-check
cb90: 20 70 61 73 73 65 73 20 66 6f 72 20 62 6f 74 68 passes for both
cba0: 2c 20 74 68 65 20 74 77 6f 20 64 61 74 61 62 61 , the two databa
cbb0: 73 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 ses are identica
cbc0: 6c 2e 0a 23 0a 70 72 6f 63 20 61 6c 6c 63 6b 73 l..#.proc allcks
cbd0: 75 6d 20 7b 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 um {{db db}} {.
cbe0: 20 73 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a set ret [list].
cbf0: 20 20 69 66 63 61 70 61 62 6c 65 20 74 65 6d 70 ifcapable temp
cc00: 64 62 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c db {. set sql
cc10: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 {. SELECT
cc20: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 name FROM sqlite
cc30: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 _master WHERE ty
cc40: 70 65 20 3d 20 27 74 61 62 6c 65 27 20 55 4e 49 pe = 'table' UNI
cc50: 4f 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 ON. SELECT
cc60: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 name FROM sqlite
cc70: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 57 48 45 _temp_master WHE
cc80: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 RE type = 'table
cc90: 27 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20 53 45 ' UNION. SE
cca0: 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 LECT 'sqlite_mas
ccb0: 74 65 72 27 20 55 4e 49 4f 4e 0a 20 20 20 20 20 ter' UNION.
ccc0: 20 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f SELECT 'sqlite_
ccd0: 74 65 6d 70 5f 6d 61 73 74 65 72 27 20 4f 52 44 temp_master' ORD
cce0: 45 52 20 42 59 20 31 0a 20 20 20 20 7d 0a 20 20 ER BY 1. }.
ccf0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 } else {. set
cd00: 20 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c sql {. SEL
cd10: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 ECT name FROM sq
cd20: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 lite_master WHER
cd30: 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 E type = 'table'
cd40: 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20 53 45 4c UNION. SEL
cd50: 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74 ECT 'sqlite_mast
cd60: 65 72 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 er' ORDER BY 1.
cd70: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 74 }. }. set t
cd80: 62 6c 6c 69 73 74 20 5b 24 64 62 20 65 76 61 6c bllist [$db eval
cd90: 20 24 73 71 6c 5d 0a 20 20 73 65 74 20 74 78 74 $sql]. set txt
cda0: 20 7b 7d 0a 20 20 66 6f 72 65 61 63 68 20 74 62 {}. foreach tb
cdb0: 6c 20 24 74 62 6c 6c 69 73 74 20 7b 0a 20 20 20 l $tbllist {.
cdc0: 20 61 70 70 65 6e 64 20 74 78 74 20 5b 24 64 62 append txt [$db
cdd0: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a 20 eval "SELECT *
cde0: 46 52 4f 4d 20 24 74 62 6c 22 5d 0a 20 20 7d 0a FROM $tbl"]. }.
cdf0: 20 20 66 6f 72 65 61 63 68 20 70 72 61 67 20 7b foreach prag {
ce00: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 default_cache_si
ce10: 7a 65 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 ze} {. append
ce20: 20 74 78 74 20 24 70 72 61 67 2d 5b 24 64 62 20 txt $prag-[$db
ce30: 65 76 61 6c 20 22 50 52 41 47 4d 41 20 24 70 72 eval "PRAGMA $pr
ce40: 61 67 22 5d 5c 6e 0a 20 20 7d 0a 20 20 23 20 70 ag"]\n. }. # p
ce50: 75 74 73 20 74 78 74 3d 24 74 78 74 0a 20 20 72 uts txt=$txt. r
ce60: 65 74 75 72 6e 20 5b 6d 64 35 20 24 74 78 74 5d eturn [md5 $txt]
ce70: 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74 65 20 61 .}..# Generate a
ce80: 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 checksum based
ce90: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 on the contents
cea0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 of a single data
ceb0: 62 61 73 65 20 77 69 74 68 0a 23 20 61 20 64 61 base with.# a da
cec0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
ced0: 6e 2e 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 n. The name of
cee0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 the database is
cef0: 24 64 62 6e 61 6d 65 2e 0a 23 20 45 78 61 6d 70 $dbname..# Examp
cf00: 6c 65 73 20 6f 66 20 24 64 62 6e 61 6d 65 20 61 les of $dbname a
cf10: 72 65 20 22 74 65 6d 70 22 20 6f 72 20 22 6d 61 re "temp" or "ma
cf20: 69 6e 22 2e 0a 23 0a 70 72 6f 63 20 64 62 63 6b in"..#.proc dbck
cf30: 73 75 6d 20 7b 64 62 20 64 62 6e 61 6d 65 7d 20 sum {db dbname}
cf40: 7b 0a 20 20 69 66 20 7b 24 64 62 6e 61 6d 65 3d {. if {$dbname=
cf50: 3d 22 74 65 6d 70 22 7d 20 7b 0a 20 20 20 20 73 ="temp"} {. s
cf60: 65 74 20 6d 61 73 74 65 72 20 73 71 6c 69 74 65 et master sqlite
cf70: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20 7d _temp_master. }
cf80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 else {. set
cf90: 6d 61 73 74 65 72 20 24 64 62 6e 61 6d 65 2e 73 master $dbname.s
cfa0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 7d qlite_master. }
cfb0: 0a 20 20 73 65 74 20 61 6c 6c 74 61 62 20 5b 24 . set alltab [$
cfc0: 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 db eval "SELECT
cfd0: 6e 61 6d 65 20 46 52 4f 4d 20 24 6d 61 73 74 65 name FROM $maste
cfe0: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 r WHERE type='ta
cff0: 62 6c 65 27 22 5d 0a 20 20 73 65 74 20 74 78 74 ble'"]. set txt
d000: 20 5b 24 64 62 20 65 76 61 6c 20 22 53 45 4c 45 [$db eval "SELE
d010: 43 54 20 2a 20 46 52 4f 4d 20 24 6d 61 73 74 65 CT * FROM $maste
d020: 72 22 5d 5c 6e 0a 20 20 66 6f 72 65 61 63 68 20 r"]\n. foreach
d030: 74 61 62 20 24 61 6c 6c 74 61 62 20 7b 0a 20 20 tab $alltab {.
d040: 20 20 61 70 70 65 6e 64 20 74 78 74 20 5b 24 64 append txt [$d
d050: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a b eval "SELECT *
d060: 20 46 52 4f 4d 20 24 64 62 6e 61 6d 65 2e 24 74 FROM $dbname.$t
d070: 61 62 22 5d 5c 6e 0a 20 20 7d 0a 20 20 72 65 74 ab"]\n. }. ret
d080: 75 72 6e 20 5b 6d 64 35 20 24 74 78 74 5d 0a 7d urn [md5 $txt].}
d090: 0a 0a 70 72 6f 63 20 6d 65 6d 64 65 62 75 67 5f ..proc memdebug_
d0a0: 6c 6f 67 5f 73 71 6c 20 7b 7b 66 69 6c 65 6e 61 log_sql {{filena
d0b0: 6d 65 20 6d 61 6c 6c 6f 63 73 2e 73 71 6c 7d 7d me mallocs.sql}}
d0c0: 20 7b 0a 0a 20 20 73 65 74 20 64 61 74 61 20 5b {.. set data [
d0d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 sqlite3_memdebug
d0e0: 5f 6c 6f 67 20 64 75 6d 70 5d 0a 20 20 73 65 74 _log dump]. set
d0f0: 20 6e 46 72 61 6d 65 20 5b 65 78 70 72 20 5b 6c nFrame [expr [l
d100: 6c 65 6e 67 74 68 20 5b 6c 69 6e 64 65 78 20 24 length [lindex $
d110: 64 61 74 61 20 30 5d 5d 2d 32 5d 0a 20 20 69 66 data 0]]-2]. if
d120: 20 7b 24 6e 46 72 61 6d 65 20 3c 20 30 7d 20 7b {$nFrame < 0} {
d130: 20 72 65 74 75 72 6e 20 22 22 20 7d 0a 0a 20 20 return "" }..
d140: 73 65 74 20 64 61 74 61 62 61 73 65 20 74 65 6d set database tem
d150: 70 0a 0a 20 20 73 65 74 20 74 62 6c 20 22 43 52 p.. set tbl "CR
d160: 45 41 54 45 20 54 41 42 4c 45 20 24 7b 64 61 74 EATE TABLE ${dat
d170: 61 62 61 73 65 7d 2e 6d 61 6c 6c 6f 63 28 7a 54 abase}.malloc(zT
d180: 65 73 74 2c 20 6e 43 61 6c 6c 2c 20 6e 42 79 74 est, nCall, nByt
d190: 65 2c 20 6c 53 74 61 63 6b 29 3b 22 0a 0a 20 20 e, lStack);"..
d1a0: 73 65 74 20 73 71 6c 20 22 22 0a 20 20 66 6f 72 set sql "". for
d1b0: 65 61 63 68 20 65 20 24 64 61 74 61 20 7b 0a 20 each e $data {.
d1c0: 20 20 20 73 65 74 20 6e 43 61 6c 6c 20 5b 6c 69 set nCall [li
d1d0: 6e 64 65 78 20 24 65 20 30 5d 0a 20 20 20 20 73 ndex $e 0]. s
d1e0: 65 74 20 6e 42 79 74 65 20 5b 6c 69 6e 64 65 78 et nByte [lindex
d1f0: 20 24 65 20 31 5d 0a 20 20 20 20 73 65 74 20 6c $e 1]. set l
d200: 53 74 61 63 6b 20 5b 6c 72 61 6e 67 65 20 24 65 Stack [lrange $e
d210: 20 32 20 65 6e 64 5d 0a 20 20 20 20 61 70 70 65 2 end]. appe
d220: 6e 64 20 73 71 6c 20 22 49 4e 53 45 52 54 20 49 nd sql "INSERT I
d230: 4e 54 4f 20 24 7b 64 61 74 61 62 61 73 65 7d 2e NTO ${database}.
d240: 6d 61 6c 6c 6f 63 20 56 41 4c 55 45 53 22 0a 20 malloc VALUES".
d250: 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 28 append sql "(
d260: 27 74 65 73 74 27 2c 20 24 6e 43 61 6c 6c 2c 20 'test', $nCall,
d270: 24 6e 42 79 74 65 2c 20 27 24 6c 53 74 61 63 6b $nByte, '$lStack
d280: 27 29 3b 5c 6e 22 0a 20 20 20 20 66 6f 72 65 61 ');\n". forea
d290: 63 68 20 66 20 24 6c 53 74 61 63 6b 20 7b 0a 20 ch f $lStack {.
d2a0: 20 20 20 20 20 73 65 74 20 66 72 61 6d 65 73 28 set frames(
d2b0: 24 66 29 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a $f) 1. }. }.
d2c0: 0a 20 20 73 65 74 20 74 62 6c 32 20 22 43 52 45 . set tbl2 "CRE
d2d0: 41 54 45 20 54 41 42 4c 45 20 24 7b 64 61 74 61 ATE TABLE ${data
d2e0: 62 61 73 65 7d 2e 66 72 61 6d 65 28 66 72 61 6d base}.frame(fram
d2f0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 e INTEGER PRIMAR
d300: 59 20 4b 45 59 2c 20 6c 69 6e 65 29 3b 5c 6e 22 Y KEY, line);\n"
d310: 0a 20 20 73 65 74 20 74 62 6c 33 20 22 43 52 45 . set tbl3 "CRE
d320: 41 54 45 20 54 41 42 4c 45 20 24 7b 64 61 74 61 ATE TABLE ${data
d330: 62 61 73 65 7d 2e 66 69 6c 65 28 6e 61 6d 65 20 base}.file(name
d340: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 6f 6e PRIMARY KEY, con
d350: 74 65 6e 74 29 3b 5c 6e 22 0a 0a 20 20 66 6f 72 tent);\n".. for
d360: 65 61 63 68 20 66 20 5b 61 72 72 61 79 20 6e 61 each f [array na
d370: 6d 65 73 20 66 72 61 6d 65 73 5d 20 7b 0a 20 20 mes frames] {.
d380: 20 20 73 65 74 20 61 64 64 72 20 5b 66 6f 72 6d set addr [form
d390: 61 74 20 25 78 20 24 66 5d 0a 20 20 20 20 73 65 at %x $f]. se
d3a0: 74 20 63 6d 64 20 22 61 64 64 72 32 6c 69 6e 65 t cmd "addr2line
d3b0: 20 2d 65 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66 -e [info nameof
d3c0: 65 78 65 63 5d 20 24 61 64 64 72 22 0a 20 20 20 exec] $addr".
d3d0: 20 73 65 74 20 6c 69 6e 65 20 5b 65 76 61 6c 20 set line [eval
d3e0: 65 78 65 63 20 24 63 6d 64 5d 0a 20 20 20 20 61 exec $cmd]. a
d3f0: 70 70 65 6e 64 20 73 71 6c 20 22 49 4e 53 45 52 ppend sql "INSER
d400: 54 20 49 4e 54 4f 20 24 7b 64 61 74 61 62 61 73 T INTO ${databas
d410: 65 7d 2e 66 72 61 6d 65 20 56 41 4c 55 45 53 28 e}.frame VALUES(
d420: 24 66 2c 20 27 24 6c 69 6e 65 27 29 3b 5c 6e 22 $f, '$line');\n"
d430: 0a 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b .. set file [
d440: 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24 6c lindex [split $l
d450: 69 6e 65 20 3a 5d 20 30 5d 0a 20 20 20 20 73 65 ine :] 0]. se
d460: 74 20 66 69 6c 65 73 28 24 66 69 6c 65 29 20 31 t files($file) 1
d470: 0a 20 20 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 . }.. foreach
d480: 66 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 66 f [array names f
d490: 69 6c 65 73 5d 20 7b 0a 20 20 20 20 73 65 74 20 iles] {. set
d4a0: 63 6f 6e 74 65 6e 74 73 20 22 22 0a 20 20 20 20 contents "".
d4b0: 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20 73 65 catch {. se
d4c0: 74 20 66 64 20 5b 6f 70 65 6e 20 24 66 5d 0a 20 t fd [open $f].
d4d0: 20 20 20 20 20 73 65 74 20 63 6f 6e 74 65 6e 74 set content
d4e0: 73 20 5b 72 65 61 64 20 24 66 64 5d 0a 20 20 20 s [read $fd].
d4f0: 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 close $fd.
d500: 20 7d 0a 20 20 20 20 73 65 74 20 63 6f 6e 74 65 }. set conte
d510: 6e 74 73 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 nts [string map
d520: 7b 27 20 27 27 7d 20 24 63 6f 6e 74 65 6e 74 73 {' ''} $contents
d530: 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c ]. append sql
d540: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 7b "INSERT INTO ${
d550: 64 61 74 61 62 61 73 65 7d 2e 66 69 6c 65 20 56 database}.file V
d560: 41 4c 55 45 53 28 27 24 66 27 2c 20 27 24 63 6f ALUES('$f', '$co
d570: 6e 74 65 6e 74 73 27 29 3b 5c 6e 22 0a 20 20 7d ntents');\n". }
d580: 0a 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e .. set fd [open
d590: 20 24 66 69 6c 65 6e 61 6d 65 20 77 5d 0a 20 20 $filename w].
d5a0: 70 75 74 73 20 24 66 64 20 22 42 45 47 49 4e 3b puts $fd "BEGIN;
d5b0: 20 24 7b 74 62 6c 7d 24 7b 74 62 6c 32 7d 24 7b ${tbl}${tbl2}${
d5c0: 74 62 6c 33 7d 24 7b 73 71 6c 7d 20 3b 20 43 4f tbl3}${sql} ; CO
d5d0: 4d 4d 49 54 3b 22 0a 20 20 63 6c 6f 73 65 20 24 MMIT;". close $
d5e0: 66 64 0a 7d 0a 0a 23 20 44 72 6f 70 20 61 6c 6c fd.}..# Drop all
d5f0: 20 74 61 62 6c 65 73 20 69 6e 20 64 61 74 61 62 tables in datab
d600: 61 73 65 20 5b 64 62 5d 0a 70 72 6f 63 20 64 72 ase [db].proc dr
d610: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 20 7b 7b op_all_tables {{
d620: 64 62 20 64 62 7d 7d 20 7b 0a 20 20 69 66 63 61 db db}} {. ifca
d630: 70 61 62 6c 65 20 74 72 69 67 67 65 72 26 26 66 pable trigger&&f
d640: 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 20 20 oreignkey {.
d650: 73 65 74 20 70 6b 20 5b 24 64 62 20 6f 6e 65 20 set pk [$db one
d660: 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f "PRAGMA foreign_
d670: 6b 65 79 73 22 5d 0a 20 20 20 20 24 64 62 20 65 keys"]. $db e
d680: 76 61 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 val "PRAGMA fore
d690: 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 22 0a ign_keys = OFF".
d6a0: 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 7b 69 }. foreach {i
d6b0: 64 78 20 6e 61 6d 65 20 66 69 6c 65 7d 20 5b 64 dx name file} [d
d6c0: 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 64 b eval {PRAGMA d
d6d0: 61 74 61 62 61 73 65 5f 6c 69 73 74 7d 5d 20 7b atabase_list}] {
d6e0: 0a 20 20 20 20 69 66 20 7b 24 69 64 78 3d 3d 31 . if {$idx==1
d6f0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6d 61 } {. set ma
d700: 73 74 65 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 ster sqlite_temp
d710: 5f 6d 61 73 74 65 72 0a 20 20 20 20 7d 20 65 6c _master. } el
d720: 73 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6d se {. set m
d730: 61 73 74 65 72 20 24 6e 61 6d 65 2e 73 71 6c 69 aster $name.sqli
d740: 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 7d 0a te_master. }.
d750: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 20 74 foreach {t t
d760: 79 70 65 7d 20 5b 24 64 62 20 65 76 61 6c 20 22 ype} [$db eval "
d770: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 61 . SELECT na
d780: 6d 65 2c 20 74 79 70 65 20 46 52 4f 4d 20 24 6d me, type FROM $m
d790: 61 73 74 65 72 0a 20 20 20 20 20 20 57 48 45 52 aster. WHER
d7a0: 45 20 74 79 70 65 20 49 4e 28 27 74 61 62 6c 65 E type IN('table
d7b0: 27 2c 20 27 76 69 65 77 27 29 20 41 4e 44 20 6e ', 'view') AND n
d7c0: 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 ame NOT LIKE 'sq
d7d0: 6c 69 74 65 58 5f 25 27 20 45 53 43 41 50 45 20 liteX_%' ESCAPE
d7e0: 27 58 27 0a 20 20 20 20 22 5d 20 7b 0a 20 20 20 'X'. "] {.
d7f0: 20 20 20 24 64 62 20 65 76 61 6c 20 22 44 52 4f $db eval "DRO
d800: 50 20 24 74 79 70 65 20 5c 22 24 74 5c 22 22 0a P $type \"$t\"".
d810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 63 61 }. }. ifca
d820: 70 61 62 6c 65 20 74 72 69 67 67 65 72 26 26 66 pable trigger&&f
d830: 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 20 20 oreignkey {.
d840: 24 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 $db eval "PRAGMA
d850: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 foreign_keys =
d860: 24 70 6b 22 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d $pk". }.}..#---
d870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d8b0: 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61 20 74 65 ------.# If a te
d8c0: 73 74 20 73 63 72 69 70 74 20 69 73 20 65 78 65 st script is exe
d8d0: 63 75 74 65 64 20 77 69 74 68 20 67 6c 6f 62 61 cuted with globa
d8e0: 6c 20 76 61 72 69 61 62 6c 65 20 24 3a 3a 47 28 l variable $::G(
d8f0: 70 65 72 6d 3a 6e 61 6d 65 29 20 73 65 74 20 74 perm:name) set t
d900: 6f 0a 23 20 22 77 61 6c 22 2c 20 74 68 65 6e 20 o.# "wal", then
d910: 74 68 65 20 74 65 73 74 73 20 61 72 65 20 72 75 the tests are ru
d920: 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 4f n in WAL mode. O
d930: 74 68 65 72 77 69 73 65 2c 20 74 68 65 79 20 73 therwise, they s
d940: 68 6f 75 6c 64 20 62 65 20 72 75 6e 0a 23 20 69 hould be run.# i
d950: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e n rollback mode.
d960: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 The following T
d970: 63 6c 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 cl procs are use
d980: 64 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 6c d to make this l
d990: 65 73 73 0a 23 20 69 6e 74 72 75 73 69 76 65 3a ess.# intrusive:
d9a0: 0a 23 0a 23 20 20 20 77 61 6c 5f 73 65 74 5f 6a .#.# wal_set_j
d9b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3f 44 42 3f ournal_mode ?DB?
d9c0: 0a 23 0a 23 20 20 20 20 20 49 66 20 72 75 6e 6e .#.# If runn
d9d0: 69 6e 67 20 61 20 57 41 4c 20 74 65 73 74 2c 20 ing a WAL test,
d9e0: 65 78 65 63 75 74 65 20 22 50 52 41 47 4d 41 20 execute "PRAGMA
d9f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 journal_mode = w
da00: 61 6c 22 20 75 73 69 6e 67 0a 23 20 20 20 20 20 al" using.#
da10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c connection handl
da20: 65 20 44 42 2e 20 4f 74 68 65 72 77 69 73 65 2c e DB. Otherwise,
da30: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 this command is
da40: 20 61 20 6e 6f 2d 6f 70 2e 0a 23 0a 23 20 20 20 a no-op..#.#
da50: 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61 wal_check_journa
da60: 6c 5f 6d 6f 64 65 20 54 45 53 54 4e 41 4d 45 20 l_mode TESTNAME
da70: 3f 44 42 3f 0a 23 0a 23 20 20 20 20 20 49 66 20 ?DB?.#.# If
da80: 72 75 6e 6e 69 6e 67 20 61 20 57 41 4c 20 74 65 running a WAL te
da90: 73 74 2c 20 65 78 65 63 75 74 65 20 61 20 74 65 st, execute a te
daa0: 73 74 73 20 63 61 73 65 20 74 68 61 74 20 66 61 sts case that fa
dab0: 69 6c 73 20 69 66 20 74 68 65 20 6d 61 69 6e 0a ils if the main.
dac0: 23 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 # database f
dad0: 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 or connection ha
dae0: 6e 64 6c 65 20 44 42 20 69 73 20 6e 6f 74 20 63 ndle DB is not c
daf0: 75 72 72 65 6e 74 6c 79 20 61 20 57 41 4c 20 64 urrently a WAL d
db00: 61 74 61 62 61 73 65 2e 0a 23 20 20 20 20 20 4f atabase..# O
db10: 74 68 65 72 77 69 73 65 20 28 69 66 20 6e 6f 74 therwise (if not
db20: 20 72 75 6e 6e 69 6e 67 20 61 20 57 41 4c 20 70 running a WAL p
db30: 65 72 6d 75 74 61 74 69 6f 6e 29 20 74 68 69 73 ermutation) this
db40: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 23 0a 23 is a no-op..#.#
db50: 20 20 20 77 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f wal_is_wal_mo
db60: 64 65 0a 23 0a 23 20 20 20 20 20 52 65 74 75 72 de.#.# Retur
db70: 6e 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20 ns true if this
db80: 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 72 test should be r
db90: 75 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 un in WAL mode.
dba0: 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e False otherwise.
dbb0: 0a 23 0a 70 72 6f 63 20 77 61 6c 5f 69 73 5f 77 .#.proc wal_is_w
dbc0: 61 6c 5f 6d 6f 64 65 20 7b 7d 20 7b 0a 20 20 65 al_mode {} {. e
dbd0: 78 70 72 20 7b 5b 70 65 72 6d 75 74 61 74 69 6f xpr {[permutatio
dbe0: 6e 5d 20 65 71 20 22 77 61 6c 22 7d 0a 7d 0a 70 n] eq "wal"}.}.p
dbf0: 72 6f 63 20 77 61 6c 5f 73 65 74 5f 6a 6f 75 72 roc wal_set_jour
dc00: 6e 61 6c 5f 6d 6f 64 65 20 7b 7b 64 62 20 64 62 nal_mode {{db db
dc10: 7d 7d 20 7b 0a 20 20 69 66 20 7b 20 5b 77 61 6c }} {. if { [wal
dc20: 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65 5d 20 7d 20 _is_wal_mode] }
dc30: 7b 0a 20 20 20 20 24 64 62 20 65 76 61 6c 20 22 {. $db eval "
dc40: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d PRAGMA journal_m
dc50: 6f 64 65 20 3d 20 57 41 4c 22 0a 20 20 7d 0a 7d ode = WAL". }.}
dc60: 0a 70 72 6f 63 20 77 61 6c 5f 63 68 65 63 6b 5f .proc wal_check_
dc70: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7b 74 65 journal_mode {te
dc80: 73 74 6e 61 6d 65 20 7b 64 62 20 64 62 7d 7d 20 stname {db db}}
dc90: 7b 0a 20 20 69 66 20 7b 20 5b 77 61 6c 5f 69 73 {. if { [wal_is
dca0: 5f 77 61 6c 5f 6d 6f 64 65 5d 20 7d 20 7b 0a 20 _wal_mode] } {.
dcb0: 20 20 20 24 64 62 20 65 76 61 6c 20 7b 20 53 45 $db eval { SE
dcc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 LECT * FROM sqli
dcd0: 74 65 5f 6d 61 73 74 65 72 20 7d 0a 20 20 20 20 te_master }.
dce0: 64 6f 5f 74 65 73 74 20 24 74 65 73 74 6e 61 6d do_test $testnam
dcf0: 65 20 5b 6c 69 73 74 20 24 64 62 20 65 76 61 6c e [list $db eval
dd00: 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f "PRAGMA main.jo
dd10: 75 72 6e 61 6c 5f 6d 6f 64 65 22 5d 20 7b 77 61 urnal_mode"] {wa
dd20: 6c 7d 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 70 l}. }.}..proc p
dd30: 65 72 6d 75 74 61 74 69 6f 6e 20 7b 7d 20 7b 0a ermutation {} {.
dd40: 20 20 73 65 74 20 70 65 72 6d 20 22 22 0a 20 20 set perm "".
dd50: 63 61 74 63 68 20 7b 73 65 74 20 70 65 72 6d 20 catch {set perm
dd60: 24 3a 3a 47 28 70 65 72 6d 3a 6e 61 6d 65 29 7d $::G(perm:name)}
dd70: 0a 20 20 73 65 74 20 70 65 72 6d 0a 7d 0a 70 72 . set perm.}.pr
dd80: 6f 63 20 70 72 65 73 71 6c 20 7b 7d 20 7b 0a 20 oc presql {} {.
dd90: 20 73 65 74 20 70 72 65 73 71 6c 20 22 22 0a 20 set presql "".
dda0: 20 63 61 74 63 68 20 7b 73 65 74 20 70 72 65 73 catch {set pres
ddb0: 71 6c 20 24 3a 3a 47 28 70 65 72 6d 3a 70 72 65 ql $::G(perm:pre
ddc0: 73 71 6c 29 7d 0a 20 20 73 65 74 20 70 72 65 73 sql)}. set pres
ddd0: 71 6c 0a 7d 0a 0a 70 72 6f 63 20 69 73 71 75 69 ql.}..proc isqui
dde0: 63 6b 20 7b 7d 20 7b 0a 20 20 73 65 74 20 72 65 ck {} {. set re
ddf0: 74 20 30 0a 20 20 63 61 74 63 68 20 7b 73 65 74 t 0. catch {set
de00: 20 72 65 74 20 24 3a 3a 47 28 69 73 71 75 69 63 ret $::G(isquic
de10: 6b 29 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 0a k)}. set ret.}.
de20: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .#--------------
de30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 70 72 -----------.#.pr
de70: 6f 63 20 73 6c 61 76 65 5f 74 65 73 74 5f 73 63 oc slave_test_sc
de80: 72 69 70 74 20 7b 73 63 72 69 70 74 7d 20 7b 0a ript {script} {.
de90: 0a 20 20 23 20 43 72 65 61 74 65 20 74 68 65 20 . # Create the
dea0: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64 interpreter used
deb0: 20 74 6f 20 72 75 6e 20 74 68 65 20 74 65 73 74 to run the test
dec0: 20 73 63 72 69 70 74 2e 0a 20 20 69 6e 74 65 72 script.. inter
ded0: 70 20 63 72 65 61 74 65 20 74 69 6e 74 65 72 70 p create tinterp
dee0: 0a 0a 20 20 23 20 50 6f 70 75 6c 61 74 65 20 73 .. # Populate s
def0: 6f 6d 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 ome global varia
df00: 62 6c 65 73 20 74 68 61 74 20 74 65 73 74 65 72 bles that tester
df10: 2e 74 63 6c 20 65 78 70 65 63 74 73 20 74 6f 20 .tcl expects to
df20: 73 65 65 2e 0a 20 20 66 6f 72 65 61 63 68 20 7b see.. foreach {
df30: 76 61 72 20 76 61 6c 75 65 7d 20 5b 6c 69 73 74 var value} [list
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a \.
df50: 20 20 20 20 3a 3a 61 72 67 76 30 20 24 3a 3a 61 ::argv0 $::a
df60: 72 67 76 30 20 20 20 20 20 20 20 20 20 20 20 20 rgv0
df70: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 3a \. :
df80: 3a 61 72 67 76 20 20 7b 7d 20 20 20 20 20 20 20 :argv {}
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
dfa0: 20 20 20 20 5c 0a 20 20 20 20 3a 3a 53 4c 41 56 \. ::SLAV
dfb0: 45 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 E 1
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
dfd0: 0a 20 20 5d 20 7b 0a 20 20 20 20 69 6e 74 65 72 . ] {. inter
dfe0: 70 20 65 76 61 6c 20 74 69 6e 74 65 72 70 20 5b p eval tinterp [
dff0: 6c 69 73 74 20 73 65 74 20 24 76 61 72 20 24 76 list set $var $v
e000: 61 6c 75 65 5d 0a 20 20 7d 0a 0a 20 20 23 20 49 alue]. }.. # I
e010: 66 20 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e f output is bein
e020: 67 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 61 20 g copied into a
e030: 66 69 6c 65 2c 20 73 68 61 72 65 20 74 68 65 20 file, share the
e040: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 file-descriptor
e050: 77 69 74 68 0a 20 20 23 20 74 68 65 20 69 6e 74 with. # the int
e060: 65 72 70 72 65 74 65 72 2e 0a 20 20 69 66 20 7b erpreter.. if {
e070: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 47 [info exists ::G
e080: 28 6f 75 74 70 75 74 5f 66 64 29 5d 7d 20 7b 0a (output_fd)]} {.
e090: 20 20 20 20 69 6e 74 65 72 70 20 73 68 61 72 65 interp share
e0a0: 20 7b 7d 20 24 3a 3a 47 28 6f 75 74 70 75 74 5f {} $::G(output_
e0b0: 66 64 29 20 74 69 6e 74 65 72 70 0a 20 20 7d 0a fd) tinterp. }.
e0c0: 0a 20 20 23 20 54 68 65 20 61 6c 69 61 73 20 75 . # The alias u
e0d0: 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 sed to access th
e0e0: 65 20 67 6c 6f 62 61 6c 20 74 65 73 74 20 63 6f e global test co
e0f0: 75 6e 74 65 72 73 2e 0a 20 20 74 69 6e 74 65 72 unters.. tinter
e100: 70 20 61 6c 69 61 73 20 73 65 74 5f 74 65 73 74 p alias set_test
e110: 5f 63 6f 75 6e 74 65 72 20 73 65 74 5f 74 65 73 _counter set_tes
e120: 74 5f 63 6f 75 6e 74 65 72 0a 0a 20 20 23 20 53 t_counter.. # S
e130: 65 74 20 75 70 20 74 68 65 20 3a 3a 63 6d 64 6c et up the ::cmdl
e140: 69 6e 65 61 72 67 20 61 72 72 61 79 20 69 6e 20 inearg array in
e150: 74 68 65 20 73 6c 61 76 65 2e 0a 20 20 69 6e 74 the slave.. int
e160: 65 72 70 20 65 76 61 6c 20 74 69 6e 74 65 72 70 erp eval tinterp
e170: 20 5b 6c 69 73 74 20 61 72 72 61 79 20 73 65 74 [list array set
e180: 20 3a 3a 63 6d 64 6c 69 6e 65 61 72 67 20 5b 61 ::cmdlinearg [a
e190: 72 72 61 79 20 67 65 74 20 3a 3a 63 6d 64 6c 69 rray get ::cmdli
e1a0: 6e 65 61 72 67 5d 5d 0a 0a 20 20 23 20 53 65 74 nearg]].. # Set
e1b0: 20 75 70 20 74 68 65 20 3a 3a 47 20 61 72 72 61 up the ::G arra
e1c0: 79 20 69 6e 20 74 68 65 20 73 6c 61 76 65 2e 0a y in the slave..
e1d0: 20 20 69 6e 74 65 72 70 20 65 76 61 6c 20 74 69 interp eval ti
e1e0: 6e 74 65 72 70 20 5b 6c 69 73 74 20 61 72 72 61 nterp [list arra
e1f0: 79 20 73 65 74 20 3a 3a 47 20 5b 61 72 72 61 79 y set ::G [array
e200: 20 67 65 74 20 3a 3a 47 5d 5d 0a 0a 20 20 23 20 get ::G]].. #
e210: 4c 6f 61 64 20 74 68 65 20 76 61 72 69 6f 75 73 Load the various
e220: 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 test interfaces
e230: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 implemented in
e240: 43 2e 0a 20 20 6c 6f 61 64 5f 74 65 73 74 66 69 C.. load_testfi
e250: 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73 xture_extensions
e260: 20 74 69 6e 74 65 72 70 0a 0a 20 20 23 20 52 75 tinterp.. # Ru
e270: 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70 n the test scrip
e280: 74 2e 0a 20 20 69 6e 74 65 72 70 20 65 76 61 6c t.. interp eval
e290: 20 74 69 6e 74 65 72 70 20 24 73 63 72 69 70 74 tinterp $script
e2a0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 69 66 20 74 .. # Check if t
e2b0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 he interpreter c
e2c0: 61 6c 6c 20 5b 72 75 6e 5f 74 68 72 65 61 64 5f all [run_thread_
e2d0: 74 65 73 74 73 5d 0a 20 20 69 66 20 7b 20 5b 69 tests]. if { [i
e2e0: 6e 74 65 72 70 20 65 76 61 6c 20 74 69 6e 74 65 nterp eval tinte
e2f0: 72 70 20 7b 69 6e 66 6f 20 65 78 69 73 74 73 20 rp {info exists
e300: 3a 3a 72 75 6e 5f 74 68 72 65 61 64 5f 74 65 73 ::run_thread_tes
e310: 74 73 5f 63 61 6c 6c 65 64 7d 5d 20 7d 20 7b 0a ts_called}] } {.
e320: 20 20 20 20 73 65 74 20 3a 3a 72 75 6e 5f 74 68 set ::run_th
e330: 72 65 61 64 5f 74 65 73 74 73 5f 63 61 6c 6c 65 read_tests_calle
e340: 64 20 31 0a 20 20 7d 0a 0a 20 20 23 20 44 65 6c d 1. }.. # Del
e350: 65 74 65 20 74 68 65 20 69 6e 74 65 72 70 72 65 ete the interpre
e360: 74 65 72 20 75 73 65 64 20 74 6f 20 72 75 6e 20 ter used to run
e370: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 2e the test script.
e380: 0a 20 20 69 6e 74 65 72 70 20 64 65 6c 65 74 65 . interp delete
e390: 20 74 69 6e 74 65 72 70 0a 7d 0a 0a 70 72 6f 63 tinterp.}..proc
e3a0: 20 73 6c 61 76 65 5f 74 65 73 74 5f 66 69 6c 65 slave_test_file
e3b0: 20 7b 7a 46 69 6c 65 7d 20 7b 0a 20 20 73 65 74 {zFile} {. set
e3c0: 20 74 61 69 6c 20 5b 66 69 6c 65 20 74 61 69 6c tail [file tail
e3d0: 20 24 7a 46 69 6c 65 5d 0a 0a 20 20 69 66 20 7b $zFile].. if {
e3e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 47 [info exists ::G
e3f0: 28 73 74 61 72 74 3a 70 65 72 6d 75 74 61 74 69 (start:permutati
e400: 6f 6e 29 5d 7d 20 7b 0a 20 20 20 20 69 66 20 7b on)]} {. if {
e410: 5b 70 65 72 6d 75 74 61 74 69 6f 6e 5d 20 21 3d [permutation] !=
e420: 20 24 3a 3a 47 28 73 74 61 72 74 3a 70 65 72 6d $::G(start:perm
e430: 75 74 61 74 69 6f 6e 29 7d 20 72 65 74 75 72 6e utation)} return
e440: 0a 20 20 20 20 75 6e 73 65 74 20 3a 3a 47 28 73 . unset ::G(s
e450: 74 61 72 74 3a 70 65 72 6d 75 74 61 74 69 6f 6e tart:permutation
e460: 29 0a 20 20 7d 0a 20 20 69 66 20 7b 5b 69 6e 66 ). }. if {[inf
e470: 6f 20 65 78 69 73 74 73 20 3a 3a 47 28 73 74 61 o exists ::G(sta
e480: 72 74 3a 66 69 6c 65 29 5d 7d 20 7b 0a 20 20 20 rt:file)]} {.
e490: 20 69 66 20 7b 24 74 61 69 6c 20 21 3d 20 24 3a if {$tail != $:
e4a0: 3a 47 28 73 74 61 72 74 3a 66 69 6c 65 29 20 26 :G(start:file) &
e4b0: 26 20 24 74 61 69 6c 21 3d 22 24 3a 3a 47 28 73 & $tail!="$::G(s
e4c0: 74 61 72 74 3a 66 69 6c 65 29 2e 74 65 73 74 22 tart:file).test"
e4d0: 7d 20 72 65 74 75 72 6e 0a 20 20 20 20 75 6e 73 } return. uns
e4e0: 65 74 20 3a 3a 47 28 73 74 61 72 74 3a 66 69 6c et ::G(start:fil
e4f0: 65 29 0a 20 20 7d 0a 0a 20 20 23 20 52 65 6d 65 e). }.. # Reme
e500: 6d 62 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f mber the value o
e510: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 f the shared-cac
e520: 68 65 20 73 65 74 74 69 6e 67 2e 20 53 6f 20 74 he setting. So t
e530: 68 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 hat it is possib
e540: 6c 65 0a 20 20 23 20 74 6f 20 63 68 65 63 6b 20 le. # to check
e550: 61 66 74 65 72 77 61 72 64 73 20 74 68 61 74 20 afterwards that
e560: 69 74 20 77 61 73 20 6e 6f 74 20 6d 6f 64 69 66 it was not modif
e570: 69 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 ied by the test
e580: 73 63 72 69 70 74 2e 0a 20 20 23 0a 20 20 69 66 script.. #. if
e590: 63 61 70 61 62 6c 65 20 73 68 61 72 65 64 5f 63 capable shared_c
e5a0: 61 63 68 65 20 7b 20 73 65 74 20 73 63 73 20 5b ache { set scs [
e5b0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 sqlite3_enable_s
e5c0: 68 61 72 65 64 5f 63 61 63 68 65 5d 20 7d 0a 0a hared_cache] }..
e5d0: 20 20 23 20 52 75 6e 20 74 68 65 20 74 65 73 74 # Run the test
e5e0: 20 73 63 72 69 70 74 20 69 6e 20 61 20 73 6c 61 script in a sla
e5f0: 76 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a ve interpreter..
e600: 20 20 23 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 #. unset -noc
e610: 6f 6d 70 6c 61 69 6e 20 3a 3a 72 75 6e 5f 74 68 omplain ::run_th
e620: 72 65 61 64 5f 74 65 73 74 73 5f 63 61 6c 6c 65 read_tests_calle
e630: 64 0a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 d. reset_prng_s
e640: 74 61 74 65 0a 20 20 73 65 74 20 3a 3a 73 71 6c tate. set ::sql
e650: 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f ite_open_file_co
e660: 75 6e 74 20 30 0a 20 20 73 65 74 20 74 69 6d 65 unt 0. set time
e670: 20 5b 74 69 6d 65 20 7b 20 73 6c 61 76 65 5f 74 [time { slave_t
e680: 65 73 74 5f 73 63 72 69 70 74 20 5b 6c 69 73 74 est_script [list
e690: 20 73 6f 75 72 63 65 20 24 7a 46 69 6c 65 5d 20 source $zFile]
e6a0: 7d 5d 0a 20 20 73 65 74 20 6d 73 20 5b 65 78 70 }]. set ms [exp
e6b0: 72 20 5b 6c 69 6e 64 65 78 20 24 74 69 6d 65 20 r [lindex $time
e6c0: 30 5d 20 2f 20 31 30 30 30 5d 0a 0a 20 20 23 20 0] / 1000].. #
e6d0: 54 65 73 74 20 74 68 61 74 20 61 6c 6c 20 66 69 Test that all fi
e6e0: 6c 65 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 les opened by th
e6f0: 65 20 74 65 73 74 20 73 63 72 69 70 74 20 77 65 e test script we
e700: 72 65 20 63 6c 6f 73 65 64 2e 20 4f 6d 69 74 20 re closed. Omit
e710: 74 68 69 73 0a 20 20 23 20 69 66 20 74 68 65 20 this. # if the
e720: 74 65 73 74 20 73 63 72 69 70 74 20 68 61 73 20 test script has
e730: 22 74 68 72 65 61 64 22 20 69 6e 20 69 74 73 20 "thread" in its
e740: 6e 61 6d 65 2e 20 54 68 65 20 6f 70 65 6e 20 66 name. The open f
e750: 69 6c 65 20 63 6f 75 6e 74 65 72 0a 20 20 23 20 ile counter. #
e760: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 is not thread-sa
e770: 66 65 2e 0a 20 20 23 0a 20 20 69 66 20 7b 5b 69 fe.. #. if {[i
e780: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 75 6e nfo exists ::run
e790: 5f 74 68 72 65 61 64 5f 74 65 73 74 73 5f 63 61 _thread_tests_ca
e7a0: 6c 6c 65 64 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 lled]==0} {.
e7b0: 64 6f 5f 74 65 73 74 20 24 7b 74 61 69 6c 7d 2d do_test ${tail}-
e7c0: 63 6c 6f 73 65 61 6c 6c 66 69 6c 65 73 20 7b 20 closeallfiles {
e7d0: 65 78 70 72 20 7b 24 3a 3a 73 71 6c 69 74 65 5f expr {$::sqlite_
e7e0: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3e open_file_count>
e7f0: 30 7d 20 7d 20 7b 30 7d 0a 20 20 7d 0a 20 20 73 0} } {0}. }. s
e800: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 65 6e et ::sqlite_open
e810: 5f 66 69 6c 65 5f 63 6f 75 6e 74 20 30 0a 0a 20 _file_count 0..
e820: 20 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65 # Test that the
e830: 20 67 6c 6f 62 61 6c 20 22 73 68 61 72 65 64 2d global "shared-
e840: 63 61 63 68 65 22 20 73 65 74 74 69 6e 67 20 77 cache" setting w
e850: 61 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 as not altered b
e860: 79 0a 20 20 23 20 74 68 65 20 74 65 73 74 20 73 y. # the test s
e870: 63 72 69 70 74 2e 0a 20 20 23 0a 20 20 69 66 63 cript.. #. ifc
e880: 61 70 61 62 6c 65 20 73 68 61 72 65 64 5f 63 61 apable shared_ca
e890: 63 68 65 20 7b 0a 20 20 20 20 73 65 74 20 72 65 che {. set re
e8a0: 73 20 5b 65 78 70 72 20 7b 5b 73 71 6c 69 74 65 s [expr {[sqlite
e8b0: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 3_enable_shared_
e8c0: 63 61 63 68 65 5d 20 3d 3d 20 24 73 63 73 7d 5d cache] == $scs}]
e8d0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 7b 74 . do_test ${t
e8e0: 61 69 6c 7d 2d 73 68 61 72 65 64 63 61 63 68 65 ail}-sharedcache
e8f0: 73 65 74 74 69 6e 67 20 5b 6c 69 73 74 20 73 65 setting [list se
e900: 74 20 7b 7d 20 24 72 65 73 5d 20 31 0a 20 20 7d t {} $res] 1. }
e910: 0a 0a 20 20 23 20 41 64 64 20 73 6f 6d 65 20 69 .. # Add some i
e920: 6e 66 6f 20 74 6f 20 74 68 65 20 6f 75 74 70 75 nfo to the outpu
e930: 74 2e 0a 20 20 23 0a 20 20 6f 75 74 70 75 74 32 t.. #. output2
e940: 20 22 54 69 6d 65 3a 20 24 74 61 69 6c 20 24 6d "Time: $tail $m
e950: 73 20 6d 73 22 0a 20 20 73 68 6f 77 5f 6d 65 6d s ms". show_mem
e960: 73 74 61 74 73 0a 7d 0a 0a 23 20 4f 70 65 6e 20 stats.}..# Open
e970: 61 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e a new connection
e980: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 74 65 73 on database tes
e990: 74 2e 64 62 20 61 6e 64 20 65 78 65 63 75 74 65 t.db and execute
e9a0: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 0a the SQL script.
e9b0: 23 20 73 75 70 70 6c 69 65 64 20 61 73 20 61 6e # supplied as an
e9c0: 20 61 72 67 75 6d 65 6e 74 2e 20 42 65 66 6f 72 argument. Befor
e9d0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 63 6c 6f e returning, clo
e9e0: 73 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 65 63 se the new conec
e9f0: 74 69 6f 6e 20 61 6e 64 0a 23 20 72 65 73 74 6f tion and.# resto
ea00: 72 65 20 74 68 65 20 34 20 62 79 74 65 20 66 69 re the 4 byte fi
ea10: 65 6c 64 73 20 73 74 61 72 74 69 6e 67 20 61 74 elds starting at
ea20: 20 68 65 61 64 65 72 20 6f 66 66 73 65 74 73 20 header offsets
ea30: 32 38 2c 20 39 32 20 61 6e 64 20 39 36 0a 23 20 28, 92 and 96.#
ea40: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 to the values th
ea50: 65 79 20 68 65 6c 64 20 62 65 66 6f 72 65 20 74 ey held before t
ea60: 68 65 20 53 51 4c 20 77 61 73 20 65 78 65 63 75 he SQL was execu
ea70: 74 65 64 2e 20 54 68 69 73 20 73 69 6d 75 6c 61 ted. This simula
ea80: 74 65 73 0a 23 20 61 20 77 72 69 74 65 20 62 79 tes.# a write by
ea90: 20 61 20 70 72 65 2d 33 2e 37 2e 30 20 63 6c 69 a pre-3.7.0 cli
eaa0: 65 6e 74 2e 0a 23 0a 70 72 6f 63 20 73 71 6c 33 ent..#.proc sql3
eab0: 36 32 33 31 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 6231 {sql} {. s
eac0: 65 74 20 42 20 5b 68 65 78 69 6f 5f 72 65 61 64 et B [hexio_read
ead0: 20 74 65 73 74 2e 64 62 20 39 32 20 38 5d 0a 20 test.db 92 8].
eae0: 20 73 65 74 20 41 20 5b 68 65 78 69 6f 5f 72 65 set A [hexio_re
eaf0: 61 64 20 74 65 73 74 2e 64 62 20 32 38 20 34 5d ad test.db 28 4]
eb00: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 33 36 32 . sqlite3 db362
eb10: 33 31 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 31 test.db. cat
eb20: 63 68 20 7b 20 64 62 33 36 32 33 31 20 66 75 6e ch { db36231 fun
eb30: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 c a_string a_str
eb40: 69 6e 67 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 ing }. execsql
eb50: 24 73 71 6c 20 64 62 33 36 32 33 31 0a 20 20 64 $sql db36231. d
eb60: 62 33 36 32 33 31 20 63 6c 6f 73 65 0a 20 20 68 b36231 close. h
eb70: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e exio_write test.
eb80: 64 62 20 32 38 20 24 41 0a 20 20 68 65 78 69 6f db 28 $A. hexio
eb90: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 39 _write test.db 9
eba0: 32 20 24 42 0a 20 20 72 65 74 75 72 6e 20 22 22 2 $B. return ""
ebb0: 0a 7d 0a 0a 70 72 6f 63 20 64 62 5f 73 61 76 65 .}..proc db_save
ebc0: 20 7b 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 {} {. foreach
ebd0: 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c f [glob -nocompl
ebe0: 61 69 6e 20 73 76 5f 74 65 73 74 2e 64 62 2a 5d ain sv_test.db*]
ebf0: 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 { forcedelete $
ec00: 66 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 66 20 f }. foreach f
ec10: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 [glob -nocomplai
ec20: 6e 20 74 65 73 74 2e 64 62 2a 5d 20 7b 0a 20 20 n test.db*] {.
ec30: 20 20 73 65 74 20 66 32 20 22 73 76 5f 24 66 22 set f2 "sv_$f"
ec40: 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 24 . forcecopy $
ec50: 66 20 24 66 32 0a 20 20 7d 0a 7d 0a 70 72 6f 63 f $f2. }.}.proc
ec60: 20 64 62 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f db_save_and_clo
ec70: 73 65 20 7b 7d 20 7b 0a 20 20 64 62 5f 73 61 76 se {} {. db_sav
ec80: 65 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 e. catch { db c
ec90: 6c 6f 73 65 20 7d 0a 20 20 72 65 74 75 72 6e 20 lose }. return
eca0: 22 22 0a 7d 0a 70 72 6f 63 20 64 62 5f 72 65 73 "".}.proc db_res
ecb0: 74 6f 72 65 20 7b 7d 20 7b 0a 20 20 66 6f 72 65 tore {} {. fore
ecc0: 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63 ach f [glob -noc
ecd0: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 62 2a omplain test.db*
ece0: 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20 ] { forcedelete
ecf0: 24 66 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 66 $f }. foreach f
ed00: 32 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 2 [glob -nocompl
ed10: 61 69 6e 20 73 76 5f 74 65 73 74 2e 64 62 2a 5d ain sv_test.db*]
ed20: 20 7b 0a 20 20 20 20 73 65 74 20 66 20 5b 73 74 {. set f [st
ed30: 72 69 6e 67 20 72 61 6e 67 65 20 24 66 32 20 33 ring range $f2 3
ed40: 20 65 6e 64 5d 0a 20 20 20 20 66 6f 72 63 65 63 end]. forcec
ed50: 6f 70 79 20 24 66 32 20 24 66 0a 20 20 7d 0a 7d opy $f2 $f. }.}
ed60: 0a 70 72 6f 63 20 64 62 5f 72 65 73 74 6f 72 65 .proc db_restore
ed70: 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 7b 7b 64 62 _and_reopen {{db
ed80: 66 69 6c 65 20 74 65 73 74 2e 64 62 7d 7d 20 7b file test.db}} {
ed90: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c . catch { db cl
eda0: 6f 73 65 20 7d 0a 20 20 64 62 5f 72 65 73 74 6f ose }. db_resto
edb0: 72 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 re. sqlite3 db
edc0: 24 64 62 66 69 6c 65 0a 7d 0a 70 72 6f 63 20 64 $dbfile.}.proc d
edd0: 62 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f b_delete_and_reo
ede0: 70 65 6e 20 7b 7b 66 69 6c 65 20 74 65 73 74 2e pen {{file test.
edf0: 64 62 7d 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b db}} {. catch {
ee00: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f db close }. fo
ee10: 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e reach f [glob -n
ee20: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 2e 64 ocomplain test.d
ee30: 62 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 b*] { forcedelet
ee40: 65 20 24 66 20 7d 0a 20 20 73 71 6c 69 74 65 33 e $f }. sqlite3
ee50: 20 64 62 20 24 66 69 6c 65 0a 7d 0a 0a 23 20 43 db $file.}..# C
ee60: 6c 6f 73 65 20 61 6e 79 20 63 6f 6e 6e 65 63 74 lose any connect
ee70: 69 6f 6e 73 20 6e 61 6d 65 64 20 5b 64 62 5d 2c ions named [db],
ee80: 20 5b 64 62 32 5d 20 6f 72 20 5b 64 62 33 5d 2e [db2] or [db3].
ee90: 20 54 68 65 6e 20 75 73 65 20 73 71 6c 69 74 65 Then use sqlite
eea0: 33 5f 63 6f 6e 66 69 67 0a 23 20 74 6f 20 63 6f 3_config.# to co
eeb0: 6e 66 69 67 75 72 65 20 74 68 65 20 73 69 7a 65 nfigure the size
eec0: 20 6f 66 20 74 68 65 20 50 41 47 45 43 41 43 48 of the PAGECACH
eed0: 45 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 75 73 69 E allocation usi
eee0: 6e 67 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 ng the parameter
eef0: 73 0a 23 20 70 72 6f 76 69 64 65 64 20 74 6f 20 s.# provided to
ef00: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 2e 20 53 61 this command. Sa
ef10: 76 65 20 74 68 65 20 6f 6c 64 20 50 41 47 45 43 ve the old PAGEC
ef20: 41 43 48 45 20 70 61 72 61 6d 65 74 65 72 73 20 ACHE parameters
ef30: 69 6e 20 61 20 67 6c 6f 62 61 6c 20 0a 23 20 76 in a global .# v
ef40: 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 ariable so that
ef50: 5b 74 65 73 74 5f 72 65 73 74 6f 72 65 5f 63 6f [test_restore_co
ef60: 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65 5d 20 nfig_pagecache]
ef70: 63 61 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 can restore the
ef80: 70 72 65 76 69 6f 75 73 0a 23 20 63 6f 6e 66 69 previous.# confi
ef90: 67 75 72 61 74 69 6f 6e 2e 0a 23 0a 23 20 42 65 guration..#.# Be
efa0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 fore returning,
efb0: 72 65 6f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f reopen connectio
efc0: 6e 20 5b 64 62 5d 20 6f 6e 20 66 69 6c 65 20 74 n [db] on file t
efd0: 65 73 74 2e 64 62 2e 0a 23 0a 70 72 6f 63 20 74 est.db..#.proc t
efe0: 65 73 74 5f 73 65 74 5f 63 6f 6e 66 69 67 5f 70 est_set_config_p
eff0: 61 67 65 63 61 63 68 65 20 7b 73 7a 20 6e 50 67 agecache {sz nPg
f000: 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 } {. catch {db
f010: 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b close}. catch {
f020: 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 db2 close}. cat
f030: 63 68 20 7b 64 62 33 20 63 6c 6f 73 65 7d 0a 0a ch {db3 close}..
f040: 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f sqlite3_shutdo
f050: 77 6e 0a 20 20 73 65 74 20 3a 3a 6f 6c 64 5f 70 wn. set ::old_p
f060: 61 67 65 63 61 63 68 65 5f 63 6f 6e 66 69 67 20 agecache_config
f070: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f [sqlite3_config_
f080: 70 61 67 65 63 61 63 68 65 20 24 73 7a 20 24 6e pagecache $sz $n
f090: 50 67 5d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e Pg]. sqlite3_in
f0a0: 69 74 69 61 6c 69 7a 65 0a 20 20 61 75 74 6f 69 itialize. autoi
f0b0: 6e 73 74 61 6c 6c 5f 74 65 73 74 5f 66 75 6e 63 nstall_test_func
f0c0: 74 69 6f 6e 73 0a 20 20 72 65 73 65 74 5f 64 62 tions. reset_db
f0d0: 0a 7d 0a 0a 23 20 43 6c 6f 73 65 20 61 6e 79 20 .}..# Close any
f0e0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6e 61 6d 65 connections name
f0f0: 64 20 5b 64 62 5d 2c 20 5b 64 62 32 5d 20 6f 72 d [db], [db2] or
f100: 20 5b 64 62 33 5d 2e 20 54 68 65 6e 20 75 73 65 [db3]. Then use
f110: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 0a sqlite3_config.
f120: 23 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 74 # to configure t
f130: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 50 he size of the P
f140: 41 47 45 43 41 43 48 45 20 61 6c 6c 6f 63 61 74 AGECACHE allocat
f150: 69 6f 6e 20 74 6f 20 74 68 65 20 73 69 7a 65 20 ion to the size
f160: 73 61 76 65 64 20 69 6e 0a 23 20 74 68 65 20 67 saved in.# the g
f170: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 62 lobal variable b
f180: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c y an earlier cal
f190: 6c 20 74 6f 20 5b 74 65 73 74 5f 73 65 74 5f 63 l to [test_set_c
f1a0: 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65 5d onfig_pagecache]
f1b0: 2e 0a 23 0a 23 20 42 65 66 6f 72 65 20 72 65 74 ..#.# Before ret
f1c0: 75 72 6e 69 6e 67 2c 20 72 65 6f 70 65 6e 20 63 urning, reopen c
f1d0: 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 20 6f onnection [db] o
f1e0: 6e 20 66 69 6c 65 20 74 65 73 74 2e 64 62 2e 0a n file test.db..
f1f0: 23 0a 70 72 6f 63 20 74 65 73 74 5f 72 65 73 74 #.proc test_rest
f200: 6f 72 65 5f 63 6f 6e 66 69 67 5f 70 61 67 65 63 ore_config_pagec
f210: 61 63 68 65 20 7b 7d 20 7b 0a 20 20 63 61 74 63 ache {} {. catc
f220: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 63 h {db close}. c
f230: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d atch {db2 close}
f240: 0a 20 20 63 61 74 63 68 20 7b 64 62 33 20 63 6c . catch {db3 cl
f250: 6f 73 65 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f ose}.. sqlite3_
f260: 73 68 75 74 64 6f 77 6e 0a 20 20 65 76 61 6c 20 shutdown. eval
f270: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 70 sqlite3_config_p
f280: 61 67 65 63 61 63 68 65 20 24 3a 3a 6f 6c 64 5f agecache $::old_
f290: 70 61 67 65 63 61 63 68 65 5f 63 6f 6e 66 69 67 pagecache_config
f2a0: 0a 20 20 75 6e 73 65 74 20 3a 3a 6f 6c 64 5f 70 . unset ::old_p
f2b0: 61 67 65 63 61 63 68 65 5f 63 6f 6e 66 69 67 20 agecache_config
f2c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 . sqlite3_initi
f2d0: 61 6c 69 7a 65 0a 20 20 61 75 74 6f 69 6e 73 74 alize. autoinst
f2e0: 61 6c 6c 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f all_test_functio
f2f0: 6e 73 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 ns. sqlite3 db
f300: 74 65 73 74 2e 64 62 0a 7d 0a 0a 23 20 49 66 20 test.db.}..# If
f310: 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 the library is c
f320: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 ompiled with the
f330: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f SQLITE_DEFAULT_
f340: 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f AUTOVACUUM macro
f350: 20 73 65 74 0a 23 20 74 6f 20 6e 6f 6e 2d 7a 65 set.# to non-ze
f360: 72 6f 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 ro, then set the
f370: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 global variable
f380: 20 24 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 $AUTOVACUUM to
f390: 31 2e 0a 73 65 74 20 41 55 54 4f 56 41 43 55 55 1..set AUTOVACUU
f3a0: 4d 20 24 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e M $sqlite_option
f3b0: 73 28 64 65 66 61 75 6c 74 5f 61 75 74 6f 76 61 s(default_autova
f3c0: 63 75 75 6d 29 0a 0a 23 20 4d 61 6b 65 20 73 75 cuum)..# Make su
f3d0: 72 65 20 74 68 65 20 46 54 53 20 65 6e 68 61 6e re the FTS enhan
f3e0: 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 ced query syntax
f3f0: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 73 65 is disabled..se
f400: 74 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e t sqlite_fts3_en
f410: 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 able_parentheses
f420: 20 30 0a 0a 23 20 44 75 72 69 6e 67 20 74 65 73 0..# During tes
f430: 74 69 6e 67 2c 20 61 73 73 75 6d 65 20 74 68 61 ting, assume tha
f440: 74 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 t all database f
f450: 69 6c 65 73 20 61 72 65 20 77 65 6c 6c 2d 66 6f iles are well-fo
f460: 72 6d 65 64 2e 20 20 54 68 65 0a 23 20 66 65 77 rmed. The.# few
f470: 20 74 65 73 74 20 63 61 73 65 73 20 74 68 61 74 test cases that
f480: 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 63 6f deliberately co
f490: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 rrupt database f
f4a0: 69 6c 65 73 20 73 68 6f 75 6c 64 20 72 65 73 63 iles should resc
f4b0: 69 6e 64 20 0a 23 20 74 68 69 73 20 73 65 74 74 ind .# this sett
f4c0: 69 6e 67 20 62 79 20 69 6e 76 6f 6b 69 6e 67 20 ing by invoking
f4d0: 22 64 61 74 61 62 61 73 65 5f 63 61 6e 5f 62 65 "database_can_be
f4e0: 5f 63 6f 72 72 75 70 74 22 0a 23 0a 64 61 74 61 _corrupt".#.data
f4f0: 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 base_never_corru
f500: 70 74 0a 0a 73 6f 75 72 63 65 20 24 74 65 73 74 pt..source $test
f510: 64 69 72 2f 74 68 72 65 61 64 5f 63 6f 6d 6d 6f dir/thread_commo
f520: 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 n.tcl.source $te
f530: 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d stdir/malloc_com
f540: 6d 6f 6e 2e 74 63 6c 0a mon.tcl.