/ Hex Artifact Content
Login

Artifact 5f8ad58b3eaebc78cd2c66c65476a42e6f32b2ad:


0000: 23 20 32 30 31 30 20 41 75 67 75 73 74 20 31 39  # 2010 August 19
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 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 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20  y.  The.# focus 
01b0: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20  of this file is 
01c0: 74 65 73 74 69 6e 67 20 74 68 61 74 20 74 68 65  testing that the
01d0: 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e   current version
01e0: 20 6f 66 20 53 51 4c 69 74 65 0a 23 20 69 73 20   of SQLite.# is 
01f0: 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
0200: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 64  ng and writing d
0210: 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65 64  atabases created
0220: 20 62 79 20 70 72 65 76 69 6f 75 73 0a 23 20 76   by previous.# v
0230: 65 72 73 69 6f 6e 73 2c 20 61 6e 64 20 76 69 63  ersions, and vic
0240: 65 2d 76 65 72 73 61 2e 0a 23 0a 23 20 54 6f 20  e-versa..#.# To 
0250: 75 73 65 20 74 68 69 73 20 74 65 73 74 2c 20 6f  use this test, o
0260: 6c 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ld versions of t
0270: 68 65 20 74 65 73 74 66 69 78 74 75 72 65 20 70  he testfixture p
0280: 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 62 65  rocess should be
0290: 0a 23 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  .# copied into t
02a0: 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  he working direc
02b0: 74 6f 72 79 20 61 6c 6f 6e 67 73 69 64 65 20 74  tory alongside t
02c0: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 2e 20  he new version. 
02d0: 54 68 65 20 6f 6c 64 0a 23 20 76 65 72 73 69 6f  The old.# versio
02e0: 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 6e 61 6d  ns should be nam
02f0: 65 64 20 22 74 65 73 74 66 69 78 74 75 72 65 58  ed "testfixtureX
0300: 58 58 22 20 28 6f 72 20 74 65 73 74 66 69 78 74  XX" (or testfixt
0310: 75 72 65 58 58 58 2e 65 78 65 20 6f 6e 0a 23 20  ureXXX.exe on.# 
0320: 77 69 6e 64 6f 77 73 29 2c 20 77 68 65 72 65 20  windows), where 
0330: 58 58 58 20 63 61 6e 20 62 65 20 61 6e 79 20 73  XXX can be any s
0340: 74 72 69 6e 67 2e 0a 23 0a 23 20 54 68 69 73 20  tring..#.# This 
0350: 74 65 73 74 20 66 69 6c 65 20 75 73 65 73 20 74  test file uses t
0360: 68 65 20 74 63 6c 20 63 6f 64 65 20 66 6f 72 20  he tcl code for 
0370: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 61 20 73 65  controlling a se
0380: 63 6f 6e 64 20 74 65 73 74 66 69 78 74 75 72 65  cond testfixture
0390: 0a 23 20 70 72 6f 63 65 73 73 20 6c 6f 63 61 74  .# process locat
03a0: 65 64 20 69 6e 20 6c 6f 63 6b 5f 63 6f 6d 6d 6f  ed in lock_commo
03b0: 6e 2e 74 63 6c 2e 20 53 65 65 20 74 68 65 20 63  n.tcl. See the c
03c0: 6f 6d 6d 6d 65 6e 74 73 20 69 6e 20 6c 6f 63 6b  ommments in lock
03d0: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 20 0a 23 20 66  _common.tcl .# f
03e0: 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  or documentation
03f0: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
0400: 65 20 63 6f 6d 6d 61 6e 64 73 2e 0a 23 0a 0a 73  e commands..#..s
0410: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
0420: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0430: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0440: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0450: 63 65 20 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b  ce $testdir/lock
0460: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72  _common.tcl.sour
0470: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0480: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f  oc_common.tcl.so
0490: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 62 63  urce $testdir/bc
04a0: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 64 62 20 63  _common.tcl.db c
04b0: 6c 6f 73 65 0a 0a 69 66 20 7b 22 22 20 3d 3d 20  lose..if {"" == 
04c0: 5b 62 63 5f 66 69 6e 64 5f 62 69 6e 61 72 69 65  [bc_find_binarie
04d0: 73 20 62 61 63 6b 63 6f 6d 70 61 74 2e 74 65 73  s backcompat.tes
04e0: 74 5d 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74  t]} {.  finish_t
04f0: 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  est.  return.}..
0500: 70 72 6f 63 20 64 6f 5f 62 61 63 6b 63 6f 6d 70  proc do_backcomp
0510: 61 74 5f 74 65 73 74 20 7b 72 76 20 62 69 6e 31  at_test {rv bin1
0520: 20 62 69 6e 32 20 73 63 72 69 70 74 7d 20 7b 0a   bin2 script} {.
0530: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
0540: 65 73 74 2e 64 62 0a 0a 20 20 69 66 20 7b 24 62  est.db..  if {$b
0550: 69 6e 31 20 21 3d 20 22 22 7d 20 7b 20 73 65 74  in1 != ""} { set
0560: 20 3a 3a 62 63 5f 63 68 61 6e 31 20 5b 6c 61 75   ::bc_chan1 [lau
0570: 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72 65 20  nch_testfixture 
0580: 24 62 69 6e 31 5d 20 7d 0a 20 20 73 65 74 20 3a  $bin1] }.  set :
0590: 3a 62 63 5f 63 68 61 6e 32 20 5b 6c 61 75 6e 63  :bc_chan2 [launc
05a0: 68 5f 74 65 73 74 66 69 78 74 75 72 65 20 24 62  h_testfixture $b
05b0: 69 6e 32 5d 0a 0a 20 20 69 66 20 7b 20 24 72 76  in2]..  if { $rv
05c0: 20 7d 20 7b 0a 20 20 20 20 70 72 6f 63 20 63 6f   } {.    proc co
05d0: 64 65 32 20 7b 74 63 6c 7d 20 7b 20 75 70 6c 65  de2 {tcl} { uple
05e0: 76 65 6c 20 23 30 20 24 74 63 6c 20 7d 0a 20 20  vel #0 $tcl }.  
05f0: 20 20 69 66 20 7b 24 62 69 6e 31 20 21 3d 20 22    if {$bin1 != "
0600: 22 7d 20 7b 20 70 72 6f 63 20 63 6f 64 65 32 20  "} { proc code2 
0610: 7b 74 63 6c 7d 20 7b 20 74 65 73 74 66 69 78 74  {tcl} { testfixt
0620: 75 72 65 20 24 3a 3a 62 63 5f 63 68 61 6e 31 20  ure $::bc_chan1 
0630: 24 74 63 6c 20 7d 20 7d 0a 20 20 20 20 70 72 6f  $tcl } }.    pro
0640: 63 20 63 6f 64 65 31 20 7b 74 63 6c 7d 20 7b 20  c code1 {tcl} { 
0650: 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a 62  testfixture $::b
0660: 63 5f 63 68 61 6e 32 20 24 74 63 6c 20 7d 0a 20  c_chan2 $tcl }. 
0670: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 72   } else {.    pr
0680: 6f 63 20 63 6f 64 65 31 20 7b 74 63 6c 7d 20 7b  oc code1 {tcl} {
0690: 20 75 70 6c 65 76 65 6c 20 23 30 20 24 74 63 6c   uplevel #0 $tcl
06a0: 20 7d 0a 20 20 20 20 69 66 20 7b 24 62 69 6e 31   }.    if {$bin1
06b0: 20 21 3d 20 22 22 7d 20 7b 20 70 72 6f 63 20 63   != ""} { proc c
06c0: 6f 64 65 31 20 7b 74 63 6c 7d 20 7b 20 74 65 73  ode1 {tcl} { tes
06d0: 74 66 69 78 74 75 72 65 20 24 3a 3a 62 63 5f 63  tfixture $::bc_c
06e0: 68 61 6e 31 20 24 74 63 6c 20 7d 20 7d 0a 20 20  han1 $tcl } }.  
06f0: 20 20 70 72 6f 63 20 63 6f 64 65 32 20 7b 74 63    proc code2 {tc
0700: 6c 7d 20 7b 20 74 65 73 74 66 69 78 74 75 72 65  l} { testfixture
0710: 20 24 3a 3a 62 63 5f 63 68 61 6e 32 20 24 74 63   $::bc_chan2 $tc
0720: 6c 20 7d 0a 20 20 7d 0a 0a 20 20 70 72 6f 63 20  l }.  }..  proc 
0730: 73 71 6c 31 20 73 71 6c 20 7b 20 63 6f 64 65 31  sql1 sql { code1
0740: 20 5b 6c 69 73 74 20 64 62 20 65 76 61 6c 20 24   [list db eval $
0750: 73 71 6c 5d 20 7d 0a 20 20 70 72 6f 63 20 73 71  sql] }.  proc sq
0760: 6c 32 20 73 71 6c 20 7b 20 63 6f 64 65 32 20 5b  l2 sql { code2 [
0770: 6c 69 73 74 20 64 62 20 65 76 61 6c 20 24 73 71  list db eval $sq
0780: 6c 5d 20 7d 0a 0a 20 20 63 6f 64 65 31 20 7b 20  l] }..  code1 { 
0790: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
07a0: 64 62 20 7d 0a 20 20 63 6f 64 65 32 20 7b 20 73  db }.  code2 { s
07b0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
07c0: 62 20 7d 0a 0a 20 20 75 70 6c 65 76 65 6c 20 24  b }..  uplevel $
07d0: 73 63 72 69 70 74 0a 0a 20 20 63 61 74 63 68 20  script..  catch 
07e0: 7b 20 63 6f 64 65 31 20 7b 20 64 62 20 63 6c 6f  { code1 { db clo
07f0: 73 65 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b  se } }.  catch {
0800: 20 63 6f 64 65 32 20 7b 20 64 62 20 63 6c 6f 73   code2 { db clos
0810: 65 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  e } }.  catch { 
0820: 63 6c 6f 73 65 20 24 3a 3a 62 63 5f 63 68 61 6e  close $::bc_chan
0830: 32 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c  2 }.  catch { cl
0840: 6f 73 65 20 24 3a 3a 62 63 5f 63 68 61 6e 31 20  ose $::bc_chan1 
0850: 7d 0a 7d 0a 0a 61 72 72 61 79 20 73 65 74 20 3a  }.}..array set :
0860: 3a 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 5b 6c  :incompatible [l
0870: 69 73 74 5d 0a 70 72 6f 63 20 64 6f 5f 61 6c 6c  ist].proc do_all
0880: 62 61 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74 20  backcompat_test 
0890: 7b 73 63 72 69 70 74 7d 20 7b 0a 0a 20 20 66 6f  {script} {..  fo
08a0: 72 65 61 63 68 20 62 69 6e 20 24 3a 3a 42 43 28  reach bin $::BC(
08b0: 62 69 6e 61 72 69 65 73 29 20 7b 0a 20 20 20 20  binaries) {.    
08c0: 73 65 74 20 6e 45 72 72 20 5b 73 65 74 5f 74 65  set nErr [set_te
08d0: 73 74 5f 63 6f 75 6e 74 65 72 20 65 72 72 6f 72  st_counter error
08e0: 73 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 64  s].    foreach d
08f0: 69 72 20 7b 30 20 31 7d 20 7b 0a 0a 20 20 20 20  ir {0 1} {..    
0900: 20 20 73 65 74 20 62 69 6e 74 61 67 20 5b 73 74    set bintag [st
0910: 72 69 6e 67 20 6d 61 70 20 7b 74 65 73 74 66 69  ring map {testfi
0920: 78 74 75 72 65 20 7b 7d 7d 20 24 62 69 6e 5d 0a  xture {}} $bin].
0930: 20 20 20 20 20 20 73 65 74 20 62 69 6e 74 61 67        set bintag
0940: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 5c 2e   [string map {\.
0950: 65 78 65 20 7b 7d 7d 20 24 62 69 6e 74 61 67 5d  exe {}} $bintag]
0960: 0a 20 20 20 20 20 20 69 66 20 7b 24 62 69 6e 74  .      if {$bint
0970: 61 67 20 3d 3d 20 22 22 7d 20 7b 73 65 74 20 62  ag == ""} {set b
0980: 69 6e 74 61 67 20 73 65 6c 66 7d 0a 20 20 20 20  intag self}.    
0990: 20 20 73 65 74 20 3a 3a 62 63 6e 61 6d 65 20 22    set ::bcname "
09a0: 2e 24 62 69 6e 74 61 67 2e 24 64 69 72 2e 22 0a  .$bintag.$dir.".
09b0: 0a 20 20 20 20 20 20 72 65 6e 61 6d 65 20 64 6f  .      rename do
09c0: 5f 74 65 73 74 20 5f 64 6f 5f 74 65 73 74 0a 20  _test _do_test. 
09d0: 20 20 20 20 20 70 72 6f 63 20 64 6f 5f 74 65 73       proc do_tes
09e0: 74 20 7b 6e 6d 20 73 71 6c 20 72 65 73 7d 20 7b  t {nm sql res} {
09f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6d 20  .        set nm 
0a00: 5b 72 65 67 73 75 62 20 7b 5c 2e 7d 20 24 6e 6d  [regsub {\.} $nm
0a10: 20 24 3a 3a 62 63 6e 61 6d 65 5d 0a 20 20 20 20   $::bcname].    
0a20: 20 20 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73      uplevel [lis
0a30: 74 20 5f 64 6f 5f 74 65 73 74 20 24 6e 6d 20 24  t _do_test $nm $
0a40: 73 71 6c 20 24 72 65 73 5d 0a 20 20 20 20 20 20  sql $res].      
0a50: 7d 0a 0a 20 20 20 20 20 20 64 6f 5f 62 61 63 6b  }..      do_back
0a60: 63 6f 6d 70 61 74 5f 74 65 73 74 20 24 64 69 72  compat_test $dir
0a70: 20 7b 7d 20 24 62 69 6e 20 24 73 63 72 69 70 74   {} $bin $script
0a80: 0a 0a 20 20 20 20 20 20 72 65 6e 61 6d 65 20 64  ..      rename d
0a90: 6f 5f 74 65 73 74 20 7b 7d 0a 20 20 20 20 20 20  o_test {}.      
0aa0: 72 65 6e 61 6d 65 20 5f 64 6f 5f 74 65 73 74 20  rename _do_test 
0ab0: 64 6f 5f 74 65 73 74 0a 20 20 20 20 7d 0a 20 20  do_test.    }.  
0ac0: 20 20 69 66 20 7b 20 24 6e 45 72 72 20 3c 20 5b    if { $nErr < [
0ad0: 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72  set_test_counter
0ae0: 20 65 72 72 6f 72 73 5d 20 7d 20 7b 0a 20 20 20   errors] } {.   
0af0: 20 20 20 73 65 74 20 3a 3a 69 6e 63 6f 6d 70 61     set ::incompa
0b00: 74 69 62 6c 65 28 5b 67 65 74 5f 76 65 72 73 69  tible([get_versi
0b10: 6f 6e 20 24 62 69 6e 5d 29 20 31 0a 20 20 20 20  on $bin]) 1.    
0b20: 7d 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 72 65  }.  }.}..proc re
0b30: 61 64 5f 66 69 6c 65 20 7b 7a 46 69 6c 65 7d 20  ad_file {zFile} 
0b40: 7b 0a 20 20 73 65 74 20 7a 44 61 74 61 20 7b 7d  {.  set zData {}
0b50: 0a 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69  .  if {[file exi
0b60: 73 74 73 20 24 7a 46 69 6c 65 5d 7d 20 7b 0a 20  sts $zFile]} {. 
0b70: 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20     set fd [open 
0b80: 24 7a 46 69 6c 65 5d 0a 20 20 20 20 66 63 6f 6e  $zFile].    fcon
0b90: 66 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e  figure $fd -tran
0ba0: 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d  slation binary -
0bb0: 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a  encoding binary.
0bc0: 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 73  .    if {[file s
0bd0: 69 7a 65 20 24 7a 46 69 6c 65 5d 3c 3d 24 3a 3a  ize $zFile]<=$::
0be0: 73 71 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f 62  sqlite_pending_b
0bf0: 79 74 65 20 7c 7c 20 24 7a 46 69 6c 65 20 21 3d  yte || $zFile !=
0c00: 20 22 74 65 73 74 2e 64 62 22 7d 20 7b 0a 20 20   "test.db"} {.  
0c10: 20 20 20 20 73 65 74 20 7a 44 61 74 61 20 5b 72      set zData [r
0c20: 65 61 64 20 24 66 64 5d 0a 20 20 20 20 7d 20 65  ead $fd].    } e
0c30: 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20  lse {.      set 
0c40: 7a 44 61 74 61 20 5b 72 65 61 64 20 24 66 64 20  zData [read $fd 
0c50: 24 3a 3a 73 71 6c 69 74 65 5f 70 65 6e 64 69 6e  $::sqlite_pendin
0c60: 67 5f 62 79 74 65 5d 0a 20 20 20 20 20 20 61 70  g_byte].      ap
0c70: 70 65 6e 64 20 7a 44 61 74 61 20 5b 73 74 72 69  pend zData [stri
0c80: 6e 67 20 72 65 70 65 61 74 20 78 20 35 31 32 5d  ng repeat x 512]
0c90: 0a 20 20 20 20 20 20 73 65 65 6b 20 24 66 64 20  .      seek $fd 
0ca0: 5b 65 78 70 72 20 24 3a 3a 73 71 6c 69 74 65 5f  [expr $::sqlite_
0cb0: 70 65 6e 64 69 6e 67 5f 62 79 74 65 2b 35 31 32  pending_byte+512
0cc0: 5d 20 73 74 61 72 74 0a 20 20 20 20 20 20 61 70  ] start.      ap
0cd0: 70 65 6e 64 20 7a 44 61 74 61 20 5b 72 65 61 64  pend zData [read
0ce0: 20 24 66 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20   $fd].    }..   
0cf0: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 7d 0a 20   close $fd.  }. 
0d00: 20 72 65 74 75 72 6e 20 24 7a 44 61 74 61 0a 7d   return $zData.}
0d10: 0a 70 72 6f 63 20 77 72 69 74 65 5f 66 69 6c 65  .proc write_file
0d20: 20 7b 7a 46 69 6c 65 20 7a 44 61 74 61 7d 20 7b   {zFile zData} {
0d30: 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  .  set fd [open 
0d40: 24 7a 46 69 6c 65 20 77 5d 0a 20 20 66 63 6f 6e  $zFile w].  fcon
0d50: 66 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e  figure $fd -tran
0d60: 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d  slation binary -
0d70: 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a  encoding binary.
0d80: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
0d90: 65 20 24 66 64 20 24 7a 44 61 74 61 0a 20 20 63  e $fd $zData.  c
0da0: 6c 6f 73 65 20 24 66 64 0a 7d 0a 70 72 6f 63 20  lose $fd.}.proc 
0db0: 72 65 61 64 5f 66 69 6c 65 5f 73 79 73 74 65 6d  read_file_system
0dc0: 20 7b 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20   {} {.  set ret 
0dd0: 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68  [list].  foreach
0de0: 20 66 20 7b 74 65 73 74 2e 64 62 20 74 65 73 74   f {test.db test
0df0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  .db-journal test
0e00: 2e 64 62 2d 77 61 6c 7d 20 7b 20 6c 61 70 70 65  .db-wal} { lappe
0e10: 6e 64 20 72 65 74 20 5b 72 65 61 64 5f 66 69 6c  nd ret [read_fil
0e20: 65 20 24 66 5d 20 7d 0a 20 20 73 65 74 20 72 65  e $f] }.  set re
0e30: 74 0a 7d 0a 70 72 6f 63 20 77 72 69 74 65 5f 66  t.}.proc write_f
0e40: 69 6c 65 5f 73 79 73 74 65 6d 20 7b 64 61 74 61  ile_system {data
0e50: 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 66 20  } {.  foreach f 
0e60: 7b 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62  {test.db test.db
0e70: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
0e80: 2d 77 61 6c 7d 20 64 20 24 64 61 74 61 20 7b 20  -wal} d $data { 
0e90: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
0ea0: 20 6c 65 6e 67 74 68 20 24 64 5d 20 3d 3d 20 30   length $d] == 0
0eb0: 7d 20 7b 0a 20 20 20 20 20 20 66 6f 72 63 65 64  } {.      forced
0ec0: 65 6c 65 74 65 20 24 66 0a 20 20 20 20 7d 20 65  elete $f.    } e
0ed0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 77 72 69 74  lse {.      writ
0ee0: 65 5f 66 69 6c 65 20 24 66 20 24 64 0a 20 20 20  e_file $f $d.   
0ef0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d   }.  }.}..#-----
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 0a 23 20 41 63 74 75 61 6c 20 74 65  ----.# Actual te
0f50: 73 74 73 20 62 65 67 69 6e 20 68 65 72 65 2e 0a  sts begin here..
0f60: 23 0a 23 20 54 68 69 73 20 66 69 72 73 74 20 62  #.# This first b
0f70: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 63 68  lock of tests ch
0f80: 65 63 6b 73 20 74 6f 20 73 65 65 20 74 68 61 74  ecks to see that
0f90: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
0fa0: 73 65 20 61 6e 64 20 0a 23 20 6a 6f 75 72 6e 61  se and .# journa
0fb0: 6c 20 66 69 6c 65 73 20 63 61 6e 20 62 65 20 75  l files can be u
0fc0: 73 65 64 20 62 79 20 6f 6c 64 20 61 6e 64 20 6e  sed by old and n
0fd0: 65 77 20 76 65 72 73 69 6f 6e 73 2e 20 57 41 4c  ew versions. WAL
0fe0: 20 61 6e 64 20 77 61 6c 2d 69 6e 64 65 78 0a 23   and wal-index.#
0ff0: 20 66 69 6c 65 73 20 61 72 65 20 74 65 73 74 65   files are teste
1000: 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 6c  d separately bel
1010: 6f 77 2e 0a 23 0a 64 6f 5f 61 6c 6c 62 61 63 6b  ow..#.do_allback
1020: 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b 0a 0a 20  compat_test {.. 
1030: 20 23 20 54 65 73 74 20 74 68 61 74 20 64 61 74   # Test that dat
1040: 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
1050: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1060: 69 62 6c 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  ible..  #.  do_t
1070: 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 31  est backcompat-1
1080: 2e 31 2e 31 20 7b 20 73 71 6c 31 20 7b 20 0a 20  .1.1 { sql1 { . 
1090: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10a0: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
10b0: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
10c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10d0: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 64  VALUES('abc', 'd
10e0: 65 66 27 29 3b 0a 20 20 7d 20 7d 20 7b 7d 0a 20  ef');.  } } {}. 
10f0: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
1100: 70 61 74 2d 31 2e 31 2e 32 20 7b 20 73 71 6c 32  pat-1.1.2 { sql2
1110: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1120: 20 74 31 3b 20 7d 20 7d 20 7b 61 62 63 20 64 65   t1; } } {abc de
1130: 66 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  f}.  do_test bac
1140: 6b 63 6f 6d 70 61 74 2d 31 2e 31 2e 33 20 7b 20  kcompat-1.1.3 { 
1150: 73 71 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e  sql2 { INSERT IN
1160: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 67 68  TO t1 VALUES('gh
1170: 69 27 2c 20 27 6a 6b 6c 27 29 3b 20 7d 20 7d 20  i', 'jkl'); } } 
1180: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  {}.  do_test bac
1190: 6b 63 6f 6d 70 61 74 2d 31 2e 31 2e 34 20 7b 20  kcompat-1.1.4 { 
11a0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
11b0: 46 52 4f 4d 20 74 31 3b 20 7d 20 7d 20 7b 61 62  FROM t1; } } {ab
11c0: 63 20 64 65 66 20 67 68 69 20 6a 6b 6c 7d 0a 20  c def ghi jkl}. 
11d0: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
11e0: 70 61 74 2d 31 2e 31 2e 35 20 7b 20 73 71 6c 31  pat-1.1.5 { sql1
11f0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
1200: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f  ity_check } } {o
1210: 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  k}.  do_test bac
1220: 6b 63 6f 6d 70 61 74 2d 31 2e 31 2e 36 20 7b 20  kcompat-1.1.6 { 
1230: 73 71 6c 32 20 7b 20 50 52 41 47 4d 41 20 69 6e  sql2 { PRAGMA in
1240: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
1250: 7d 20 7b 6f 6b 7d 0a 0a 20 20 23 20 54 65 73 74  } {ok}..  # Test
1260: 20 74 68 61 74 20 6f 6e 65 20 76 65 72 73 69 6f   that one versio
1270: 6e 20 63 61 6e 20 72 6f 6c 6c 20 62 61 63 6b 20  n can roll back 
1280: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
1290: 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 20  le left in the. 
12a0: 20 23 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 62   # file-system b
12b0: 79 20 74 68 65 20 6f 74 68 65 72 20 76 65 72 73  y the other vers
12c0: 69 6f 6e 2e 0a 20 20 23 0a 20 20 23 20 45 61 63  ion..  #.  # Eac
12d0: 68 20 74 65 73 74 20 63 61 73 65 20 69 73 20 6e  h test case is n
12e0: 61 6d 65 64 20 22 62 61 63 6b 63 6f 6d 70 61 74  amed "backcompat
12f0: 2d 31 2e 58 2e 2e 2e 22 2c 20 77 68 65 72 65 20  -1.X...", where 
1300: 58 20 69 73 20 65 69 74 68 65 72 20 30 20 6f 72  X is either 0 or
1310: 0a 20 20 23 20 31 2e 20 49 66 20 69 74 20 69 73  .  # 1. If it is
1320: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72   0, then the cur
1330: 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 63 72 65  rent version cre
1340: 61 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ates a journal f
1350: 69 6c 65 20 74 68 61 74 0a 20 20 23 20 74 68 65  ile that.  # the
1360: 20 6f 6c 64 20 76 65 72 73 69 6f 6e 73 20 74 72   old versions tr
1370: 79 20 74 6f 20 72 65 61 64 2e 20 4f 74 68 65 72  y to read. Other
1380: 77 69 73 65 2c 20 69 66 20 58 20 69 73 20 31 2c  wise, if X is 1,
1390: 20 74 68 65 6e 20 74 68 65 20 6f 6c 64 20 76 65   then the old ve
13a0: 72 73 69 6f 6e 0a 20 20 23 20 63 72 65 61 74 65  rsion.  # create
13b0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
13c0: 6c 65 20 61 6e 64 20 77 65 20 74 72 79 20 74 6f  le and we try to
13d0: 20 72 65 61 64 20 69 74 20 77 69 74 68 20 74 68   read it with th
13e0: 65 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f  e current versio
13f0: 6e 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  n..  #.  do_test
1400: 20 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e   backcompat-1.2.
1410: 31 20 7b 20 73 71 6c 31 20 7b 0a 20 20 20 20 50  1 { sql1 {.    P
1420: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1430: 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e   = 10;.    BEGIN
1440: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1450: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
1460: 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 2c 20 72  ndomblob(400), r
1470: 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b  andomblob(400));
1480: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1490: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
14a0: 64 6f 6d 62 6c 6f 62 28 34 30 30 29 2c 20 72 61  domblob(400), ra
14b0: 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 20 46 52  ndomblob(400) FR
14c0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
14d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
14e0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30  CT randomblob(40
14f0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 34  0), randomblob(4
1500: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
1510: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1520: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
1530: 6c 6f 62 28 34 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(400), random
1540: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1550: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
1560: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
1570: 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 2c 20  andomblob(400), 
1580: 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 20  randomblob(400) 
1590: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d  FROM t1;.    COM
15a0: 4d 49 54 3b 0a 20 20 7d 20 7d 20 7b 7d 0a 20 20  MIT;.  } } {}.  
15b0: 73 65 74 20 63 6b 73 75 6d 31 20 5b 73 71 6c 31  set cksum1 [sql1
15c0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
15d0: 61 29 2c 20 6d 64 35 73 75 6d 28 62 29 20 46 52  a), md5sum(b) FR
15e0: 4f 4d 20 74 31 7d 5d 0a 20 20 73 65 74 20 63 6b  OM t1}].  set ck
15f0: 73 75 6d 32 20 5b 73 71 6c 32 20 7b 53 45 4c 45  sum2 [sql2 {SELE
1600: 43 54 20 6d 64 35 73 75 6d 28 61 29 2c 20 6d 64  CT md5sum(a), md
1610: 35 73 75 6d 28 62 29 20 46 52 4f 4d 20 74 31 7d  5sum(b) FROM t1}
1620: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b  ].  do_test back
1630: 63 6f 6d 70 61 74 2d 31 2e 32 2e 32 20 5b 6c 69  compat-1.2.2 [li
1640: 73 74 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  st string compar
1650: 65 20 24 63 6b 73 75 6d 31 20 24 63 6b 73 75 6d  e $cksum1 $cksum
1660: 32 5d 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20  2] 0..  do_test 
1670: 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 33  backcompat-1.2.3
1680: 20 7b 20 73 71 6c 31 20 7b 0a 20 20 20 20 42 45   { sql1 {.    BE
1690: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
16a0: 45 20 74 31 20 53 45 54 20 61 20 3d 20 72 61 6e  E t1 SET a = ran
16b0: 64 6f 6d 62 6c 6f 62 28 35 30 30 29 3b 0a 20 20  domblob(500);.  
16c0: 7d 20 7d 20 7b 7d 0a 20 20 73 65 74 20 64 61 74  } } {}.  set dat
16d0: 61 20 5b 72 65 61 64 5f 66 69 6c 65 5f 73 79 73  a [read_file_sys
16e0: 74 65 6d 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  tem]..  do_test 
16f0: 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 34  backcompat-1.2.4
1700: 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54   { sql1 { COMMIT
1710: 20 7d 20 7d 20 7b 7d 0a 0a 20 20 73 65 74 20 73   } } {}..  set s
1720: 61 6d 65 20 5b 65 78 70 72 20 7b 5b 73 71 6c 32  ame [expr {[sql2
1730: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
1740: 61 29 2c 20 6d 64 35 73 75 6d 28 62 29 20 46 52  a), md5sum(b) FR
1750: 4f 4d 20 74 31 7d 5d 20 3d 3d 20 24 63 6b 73 75  OM t1}] == $cksu
1760: 6d 32 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 62  m2}].  do_test b
1770: 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 35 20  ackcompat-1.2.5 
1780: 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 73 61  [list set {} $sa
1790: 6d 65 5d 20 30 0a 0a 20 20 63 6f 64 65 31 20 7b  me] 0..  code1 {
17a0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 63 6f   db close }.  co
17b0: 64 65 32 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  de2 { db close }
17c0: 0a 20 20 77 72 69 74 65 5f 66 69 6c 65 5f 73 79  .  write_file_sy
17d0: 73 74 65 6d 20 24 64 61 74 61 0a 20 20 63 6f 64  stem $data.  cod
17e0: 65 31 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20  e1 { sqlite3 db 
17f0: 74 65 73 74 2e 64 62 20 7d 0a 20 20 63 6f 64 65  test.db }.  code
1800: 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74  2 { sqlite3 db t
1810: 65 73 74 2e 64 62 20 7d 0a 0a 20 20 73 65 74 20  est.db }..  set 
1820: 73 61 6d 65 20 5b 65 78 70 72 20 7b 5b 73 71 6c  same [expr {[sql
1830: 32 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  2 {SELECT md5sum
1840: 28 61 29 2c 20 6d 64 35 73 75 6d 28 62 29 20 46  (a), md5sum(b) F
1850: 52 4f 4d 20 74 31 7d 5d 20 3d 3d 20 24 63 6b 73  ROM t1}] == $cks
1860: 75 6d 32 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20  um2}].  do_test 
1870: 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 36  backcompat-1.2.6
1880: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 73   [list set {} $s
1890: 61 6d 65 5d 20 31 0a 0a 20 20 64 6f 5f 74 65 73  ame] 1..  do_tes
18a0: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32  t backcompat-1.2
18b0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47  .7 { sql1 { PRAG
18c0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
18d0: 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 64 6f  ck } } {ok}.  do
18e0: 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74  _test backcompat
18f0: 2d 31 2e 32 2e 38 20 7b 20 73 71 6c 32 20 7b 20  -1.2.8 { sql2 { 
1900: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
1910: 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a  _check } } {ok}.
1920: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63  .  do_test backc
1930: 6f 6d 70 61 74 2d 32 2e 31 20 7b 0a 20 20 20 20  ompat-2.1 {.    
1940: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 43 52 45  sql1 {.      CRE
1950: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 55  ATE TABLE t2(a U
1960: 4e 49 51 55 45 2c 20 62 20 50 52 49 4d 41 52 59  NIQUE, b PRIMARY
1970: 20 4b 45 59 2c 20 63 20 55 4e 49 51 55 45 29 3b   KEY, c UNIQUE);
1980: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1990: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 39  TO t2 VALUES(1,9
19a0: 2c 35 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ,5);.      INSER
19b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
19c0: 28 35 2c 35 2c 31 29 3b 0a 20 20 20 20 20 20 49  (5,5,1);.      I
19d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
19e0: 4c 55 45 53 28 39 2c 31 2c 39 29 3b 0a 20 20 20  LUES(9,1,9);.   
19f0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1a00: 20 74 32 20 4f 52 44 45 52 20 42 59 20 61 3b 0a   t2 ORDER BY a;.
1a10: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 39 20 35      }.  } {1 9 5
1a20: 20 35 20 35 20 31 20 39 20 31 20 39 7d 0a 20 20   5 5 1 9 1 9}.  
1a30: 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70  do_test backcomp
1a40: 61 74 2d 32 2e 32 20 7b 0a 20 20 20 20 73 71 6c  at-2.2 {.    sql
1a50: 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2 {.      SELECT
1a60: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
1a70: 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f 74  aster WHERE root
1a80: 70 61 67 65 3d 2d 31 3b 0a 20 20 20 20 20 20 53  page=-1;.      S
1a90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1aa0: 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 20 20  ORDER BY a;.    
1ab0: 7d 0a 20 20 7d 20 7b 31 20 39 20 35 20 35 20 35  }.  } {1 9 5 5 5
1ac0: 20 31 20 39 20 31 20 39 7d 0a 20 20 64 6f 5f 74   1 9 1 9}.  do_t
1ad0: 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 32  est backcompat-2
1ae0: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a  .3 {.    sql1 {.
1af0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1b00: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1b10: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 20  b;.    }.  } {9 
1b20: 31 20 39 20 35 20 35 20 31 20 31 20 39 20 35 7d  1 9 5 5 1 1 9 5}
1b30: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63  .  do_test backc
1b40: 6f 6d 70 61 74 2d 32 2e 34 20 7b 0a 20 20 20 20  ompat-2.4 {.    
1b50: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c  sql2 {.      SEL
1b60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52  ECT * FROM t2 OR
1b70: 44 45 52 20 42 59 20 62 3b 0a 20 20 20 20 7d 0a  DER BY b;.    }.
1b80: 20 20 7d 20 7b 39 20 31 20 39 20 35 20 35 20 31    } {9 1 9 5 5 1
1b90: 20 31 20 39 20 35 7d 0a 20 20 64 6f 5f 74 65 73   1 9 5}.  do_tes
1ba0: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 32 2e 35  t backcompat-2.5
1bb0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
1bc0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1bd0: 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 63 3b  M t2 ORDER BY c;
1be0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 35 20 35 20  .    }.  } {5 5 
1bf0: 31 20 31 20 39 20 35 20 39 20 31 20 39 7d 0a 20  1 1 9 5 9 1 9}. 
1c00: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
1c10: 70 61 74 2d 32 2e 36 20 7b 0a 20 20 20 20 73 71  pat-2.6 {.    sq
1c20: 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  l2 {.      SELEC
1c30: 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  T * FROM t2 ORDE
1c40: 52 20 42 59 20 63 3b 0a 20 20 20 20 7d 0a 20 20  R BY c;.    }.  
1c50: 7d 20 7b 35 20 35 20 31 20 31 20 39 20 35 20 39  } {5 5 1 1 9 5 9
1c60: 20 31 20 39 7d 0a 7d 0a 66 6f 72 65 61 63 68 20   1 9}.}.foreach 
1c70: 6b 20 5b 6c 73 6f 72 74 20 5b 61 72 72 61 79 20  k [lsort [array 
1c80: 6e 61 6d 65 73 20 3a 3a 69 6e 63 6f 6d 70 61 74  names ::incompat
1c90: 69 62 6c 65 5d 5d 20 7b 0a 20 20 70 75 74 73 20  ible]] {.  puts 
1ca0: 22 45 52 52 4f 52 3a 20 44 65 74 65 63 74 65 64  "ERROR: Detected
1cb0: 20 6a 6f 75 72 6e 61 6c 20 69 6e 63 6f 6d 70 61   journal incompa
1cc0: 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 76 65  tibility with ve
1cd0: 72 73 69 6f 6e 20 24 6b 22 0a 7d 0a 75 6e 73 65  rsion $k".}.unse
1ce0: 74 20 3a 3a 69 6e 63 6f 6d 70 61 74 69 62 6c 65  t ::incompatible
1cf0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
1d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1d40: 54 65 73 74 20 74 68 61 74 20 57 41 4c 20 61 6e  Test that WAL an
1d50: 64 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  d wal-index file
1d60: 73 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  s may be shared 
1d70: 62 65 74 77 65 65 6e 20 64 69 66 66 65 72 65 6e  between differen
1d80: 74 20 0a 23 20 53 51 4c 69 74 65 20 76 65 72 73  t .# SQLite vers
1d90: 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 61 6c 6c 62 61  ions..#.do_allba
1da0: 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b 0a  ckcompat_test {.
1db0: 20 20 69 66 20 7b 5b 63 6f 64 65 31 20 7b 73 71    if {[code1 {sq
1dc0: 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e 7d 5d  lite3 -version}]
1dd0: 20 3e 3d 20 22 33 2e 37 2e 30 22 0a 20 20 20 26   >= "3.7.0".   &
1de0: 26 20 5b 63 6f 64 65 31 20 7b 73 65 74 20 3a 3a  & [code1 {set ::
1df0: 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 77  sqlite_options(w
1e00: 61 6c 29 7d 5d 0a 20 20 20 26 26 20 5b 63 6f 64  al)}].   && [cod
1e10: 65 32 20 7b 73 71 6c 69 74 65 33 20 2d 76 65 72  e2 {sqlite3 -ver
1e20: 73 69 6f 6e 7d 5d 20 3e 3d 20 22 33 2e 37 2e 30  sion}] >= "3.7.0
1e30: 22 0a 20 20 20 26 26 20 5b 63 6f 64 65 32 20 7b  ".   && [code2 {
1e40: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74  set ::sqlite_opt
1e50: 69 6f 6e 73 28 77 61 6c 29 7d 5d 0a 20 20 7d 20  ions(wal)}].  } 
1e60: 7b 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62  {..    do_test b
1e70: 61 63 6b 63 6f 6d 70 61 74 2d 32 2e 31 2e 31 20  ackcompat-2.1.1 
1e80: 7b 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50  { sql1 {.      P
1e90: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
1ea0: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
1eb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1ec0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
1ed0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20   UNIQUE);.      
1ee0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1ef0: 41 4c 55 45 53 28 27 49 27 2c 20 31 29 3b 0a 20  ALUES('I', 1);. 
1f00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1f10: 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c   t1 VALUES('II',
1f20: 20 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   2);.      INSER
1f30: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1f40: 28 27 49 49 49 27 2c 20 33 29 3b 0a 20 20 20 20  ('III', 3);.    
1f50: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1f60: 74 31 3b 0a 20 20 20 20 7d 20 7d 20 7b 77 61 6c  t1;.    } } {wal
1f70: 20 49 20 31 20 49 49 20 32 20 49 49 49 20 33 7d   I 1 II 2 III 3}
1f80: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63  .    do_test bac
1f90: 6b 63 6f 6d 70 61 74 2d 32 2e 31 2e 32 20 7b 20  kcompat-2.1.2 { 
1fa0: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c  sql2 {.      SEL
1fb0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
1fc0: 20 20 20 7d 20 7d 20 7b 49 20 31 20 49 49 20 32     } } {I 1 II 2
1fd0: 20 49 49 49 20 33 7d 0a 0a 20 20 20 20 73 65 74   III 3}..    set
1fe0: 20 64 61 74 61 20 5b 72 65 61 64 5f 66 69 6c 65   data [read_file
1ff0: 5f 73 79 73 74 65 6d 5d 0a 20 20 20 20 63 6f 64  _system].    cod
2000: 65 31 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  e1 {db close}.  
2010: 20 20 63 6f 64 65 32 20 7b 64 62 20 63 6c 6f 73    code2 {db clos
2020: 65 7d 0a 20 20 20 20 77 72 69 74 65 5f 66 69 6c  e}.    write_fil
2030: 65 5f 73 79 73 74 65 6d 20 24 64 61 74 61 0a 20  e_system $data. 
2040: 20 20 20 63 6f 64 65 31 20 7b 73 71 6c 69 74 65     code1 {sqlite
2050: 33 20 64 62 20 74 65 73 74 2e 64 62 7d 0a 20 20  3 db test.db}.  
2060: 20 20 63 6f 64 65 32 20 7b 73 71 6c 69 74 65 33    code2 {sqlite3
2070: 20 64 62 20 74 65 73 74 2e 64 62 7d 0a 0a 20 20   db test.db}..  
2080: 20 20 23 20 54 68 65 20 57 41 4c 20 66 69 6c 65    # The WAL file
2090: 20 6e 6f 77 20 69 6e 20 74 68 65 20 66 69 6c 65   now in the file
20a0: 2d 73 79 73 74 65 6d 20 77 61 73 20 63 72 65 61  -system was crea
20b0: 74 65 64 20 62 79 20 74 68 65 20 5b 63 6f 64 65  ted by the [code
20c0: 31 5d 0a 20 20 20 20 23 20 70 72 6f 63 65 73 73  1].    # process
20d0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  . Check that the
20e0: 20 5b 63 6f 64 65 32 5d 20 70 72 6f 63 65 73 73   [code2] process
20f0: 20 63 61 6e 20 72 65 63 6f 76 65 72 20 74 68 65   can recover the
2100: 20 6c 6f 67 2e 0a 20 20 20 20 23 0a 20 20 20 20   log..    #.    
2110: 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70  do_test backcomp
2120: 61 74 2d 32 2e 31 2e 33 20 7b 20 73 71 6c 32 20  at-2.1.3 { sql2 
2130: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
2140: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20   FROM t1;.    } 
2150: 7d 20 7b 49 20 31 20 49 49 20 32 20 49 49 49 20  } {I 1 II 2 III 
2160: 33 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62  3}.    do_test b
2170: 61 63 6b 63 6f 6d 70 61 74 2d 32 2e 31 2e 34 20  ackcompat-2.1.4 
2180: 7b 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 53  { sql1 {.      S
2190: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
21a0: 0a 20 20 20 20 7d 20 7d 20 7b 49 20 31 20 49 49  .    } } {I 1 II
21b0: 20 32 20 49 49 49 20 33 7d 0a 20 20 7d 0a 7d 0a   2 III 3}.  }.}.
21c0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
2210: 73 74 20 74 68 61 74 20 46 54 53 33 20 74 61 62  st that FTS3 tab
2220: 6c 65 73 20 6d 61 79 20 62 65 20 72 65 61 64 2f  les may be read/
2230: 77 72 69 74 74 65 6e 20 62 79 20 64 69 66 66 65  written by diffe
2240: 72 65 6e 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  rent versions of
2250: 20 0a 23 20 53 51 4c 69 74 65 2e 20 0a 23 0a 69   .# SQLite. .#.i
2260: 66 63 61 70 61 62 6c 65 20 66 74 73 33 20 7b 0a  fcapable fts3 {.
2270: 20 20 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 7b    set contents {
2280: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
2290: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
22a0: 4e 47 20 66 74 73 33 28 61 2c 20 62 29 3b 0a 20  NG fts3(a, b);. 
22b0: 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 75   }.  foreach {nu
22c0: 6d 20 64 6f 63 7d 20 7b 0a 20 20 20 20 6f 6e 65  m doc} {.    one
22d0: 20 22 6a 6b 20 7a 6d 20 6a 6b 20 65 63 7a 6b 6a   "jk zm jk eczkj
22e0: 62 6c 75 20 75 72 76 79 73 62 6e 79 6b 6b 20 73  blu urvysbnykk s
22f0: 6b 20 67 6e 6c 20 6a 6b 20 74 74 76 67 66 20 68  k gnl jk ttvgf h
2300: 6d 6a 66 22 0a 20 20 20 20 74 77 6f 20 22 6a 6b  mjf".    two "jk
2310: 20 62 6e 68 63 20 6a 6a 72 78 70 6a 6b 62 20 6d   bnhc jjrxpjkb m
2320: 6a 70 61 76 6a 75 68 77 20 66 69 62 6f 6b 64 72  jpavjuhw fibokdr
2330: 79 20 69 67 6a 75 20 6a 6b 20 7a 6d 20 7a 6d 20  y igju jk zm zm 
2340: 78 68 22 0a 20 20 20 20 74 68 72 65 65 20 22 77  xh".    three "w
2350: 78 65 20 6f 67 74 74 62 79 6b 76 74 20 75 68 7a  xe ogttbykvt uhz
2360: 71 20 78 72 20 69 61 66 20 7a 66 20 75 72 76 79  q xr iaf zf urvy
2370: 73 62 6e 79 6b 6b 20 61 61 79 78 70 6d 76 65 20  sbnykk aayxpmve 
2380: 6f 61 63 61 78 67 6a 6f 6f 20 6d 6a 70 61 76 6a  oacaxgjoo mjpavj
2390: 75 68 77 22 0a 20 20 20 20 66 6f 75 72 20 22 67  uhw".    four "g
23a0: 61 7a 72 74 20 6a 6b 20 65 70 68 6b 6e 6f 6e 71  azrt jk ephknonq
23b0: 20 6d 79 6a 70 20 75 65 6e 76 62 6d 20 77 75 76   myjp uenvbm wuv
23c0: 61 6a 68 77 71 7a 20 6a 6b 20 7a 6d 20 78 6e 78  ajhwqz jk zm xnx
23d0: 68 66 20 6e 76 66 61 73 66 68 22 0a 20 20 20 20  hf nvfasfh".    
23e0: 66 69 76 65 20 22 7a 6d 20 61 61 79 78 70 6d 76  five "zm aayxpmv
23f0: 65 20 63 73 6a 71 78 68 67 6a 20 78 6e 78 68 66  e csjqxhgj xnxhf
2400: 20 78 72 20 6a 6b 20 61 61 79 78 70 6d 76 65 20   xr jk aayxpmve 
2410: 78 6e 78 68 66 20 7a 6d 20 7a 6d 22 0a 20 20 20  xnxhf zm zm".   
2420: 20 73 69 78 20 22 73 6f 6b 63 79 66 20 7a 6d 20   six "sokcyf zm 
2430: 6f 67 79 61 76 6a 76 76 20 6a 6b 20 7a 6d 20 66  ogyavjvv jk zm f
2440: 69 62 6f 6b 64 72 79 20 7a 6d 20 6a 6b 20 69 67  ibokdry zm jk ig
2450: 6a 75 20 69 67 6a 75 22 0a 20 20 20 20 73 65 76  ju igju".    sev
2460: 65 6e 20 22 76 67 73 6c 64 20 62 76 67 69 6d 6a  en "vgsld bvgimj
2470: 69 6b 20 78 75 70 72 74 6c 79 6c 65 20 6a 6b 20  ik xuprtlyle jk 
2480: 61 6b 6d 69 6b 72 71 79 74 20 6a 6b 20 61 61 79  akmikrqyt jk aay
2490: 78 70 6d 76 65 20 68 6b 66 6f 75 64 7a 66 74 71  xpmve hkfoudzftq
24a0: 20 64 64 6a 6a 22 0a 20 20 20 20 65 69 67 68 74   ddjj".    eight
24b0: 20 22 7a 6d 20 75 68 7a 71 20 6f 76 6b 79 65 76   "zm uhzq ovkyev
24c0: 6c 67 76 20 7a 6b 20 75 65 6e 76 62 6d 20 63 73  lgv zk uenvbm cs
24d0: 6a 71 78 68 67 6a 20 6a 6b 20 76 67 73 6c 64 20  jqxhgj jk vgsld 
24e0: 70 67 79 62 73 20 6a 6b 22 0a 20 20 20 20 6e 69  pgybs jk".    ni
24f0: 6e 65 20 20 22 7a 6d 20 61 67 6d 63 6b 75 69 75  ne  "zm agmckuiu
2500: 20 7a 65 78 68 20 66 69 62 6f 6b 64 72 79 20 6a   zexh fibokdry j
2510: 6b 20 75 68 7a 71 20 62 75 20 74 75 67 66 6c 69  k uhzq bu tugfli
2520: 78 6f 65 78 20 78 6e 78 68 66 20 73 6b 22 0a 20  xoex xnxhf sk". 
2530: 20 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20   } {.    append 
2540: 63 6f 6e 74 65 6e 74 73 20 22 49 4e 53 45 52 54  contents "INSERT
2550: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2560: 27 24 6e 75 6d 27 2c 20 27 24 64 6f 63 27 29 3b  '$num', '$doc');
2570: 22 0a 20 20 7d 0a 20 20 64 6f 5f 61 6c 6c 62 61  ".  }.  do_allba
2580: 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b 0a  ckcompat_test {.
2590: 20 20 20 20 69 66 20 7b 5b 63 6f 64 65 31 20 7b      if {[code1 {
25a0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74  set ::sqlite_opt
25b0: 69 6f 6e 73 28 66 74 73 33 29 7d 5d 0a 20 20 20  ions(fts3)}].   
25c0: 20 20 26 26 20 5b 63 6f 64 65 32 20 7b 73 65 74    && [code2 {set
25d0: 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e   ::sqlite_option
25e0: 73 28 66 74 73 33 29 7d 5d 0a 20 20 20 20 7d 20  s(fts3)}].    } 
25f0: 7b 0a 20 20 0a 20 20 20 20 20 20 64 6f 5f 74 65  {.  .      do_te
2600: 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e  st backcompat-3.
2610: 31 20 7b 20 73 71 6c 31 20 24 63 6f 6e 74 65 6e  1 { sql1 $conten
2620: 74 73 20 7d 20 7b 7d 0a 20 20 0a 20 20 20 20 20  ts } {}.  .     
2630: 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20 7b   foreach {n q} {
2640: 0a 20 20 20 20 20 20 20 20 31 20 20 20 20 22 53  .        1    "S
2650: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2660: 4f 52 44 45 52 20 42 59 20 61 2c 20 62 22 0a 20  ORDER BY a, b". 
2670: 20 20 20 20 20 20 20 32 20 20 20 20 22 53 45 4c         2    "SEL
2680: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
2690: 31 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20  1 WHERE a MATCH 
26a0: 27 66 69 76 65 27 22 0a 20 20 20 20 20 20 20 20  'five'".        
26b0: 33 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46  3    "SELECT * F
26c0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d  ROM t1 WHERE a M
26d0: 41 54 43 48 20 27 66 69 76 65 27 22 0a 20 20 20  ATCH 'five'".   
26e0: 20 20 20 20 20 34 20 20 20 20 22 53 45 4c 45 43       4    "SELEC
26f0: 54 20 6f 66 66 73 65 74 73 28 74 31 29 20 46 52  T offsets(t1) FR
2700: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
2710: 41 54 43 48 20 27 6a 6b 27 22 0a 20 20 20 20 20  ATCH 'jk'".     
2720: 20 20 20 35 20 20 20 20 22 53 45 4c 45 43 54 20     5    "SELECT 
2730: 6f 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d  offsets(t1) FROM
2740: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
2750: 43 48 20 27 74 75 67 2a 20 4f 52 20 65 69 67 68  CH 'tug* OR eigh
2760: 74 27 22 0a 20 20 20 20 20 20 7d 20 7b 0a 20 20  t'".      } {.  
2770: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61        do_test ba
2780: 63 6b 63 6f 6d 70 61 74 2d 33 2e 32 20 5b 6c 69  ckcompat-3.2 [li
2790: 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73 71 6c  st sql1 $q] [sql
27a0: 32 20 24 71 5d 0a 20 20 20 20 20 20 7d 0a 20 20  2 $q].      }.  
27b0: 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62  .      do_test b
27c0: 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 33 20 7b 20  ackcompat-3.3 { 
27d0: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 20 20 49  sql1 {.        I
27e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
27f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
2800: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2810: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
2820: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
2830: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2840: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2850: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
2860: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2870: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
2880: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2890: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
28a0: 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  t1;.        INSE
28b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
28c0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
28d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
28e0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
28f0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e  M t1;.        IN
2900: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2910: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
2920: 20 20 20 20 20 7d 20 7d 20 7b 7d 0a 20 20 0a 20       } } {}.  . 
2930: 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 20       foreach {n 
2940: 71 7d 20 7b 0a 20 20 20 20 20 20 20 20 31 20 20  q} {.        1  
2950: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
2960: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
2970: 62 22 0a 20 20 20 20 20 20 20 20 32 20 20 20 20  b".        2    
2980: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  "SELECT rowid FR
2990: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41  OM t1 WHERE a MA
29a0: 54 43 48 20 27 66 69 76 65 27 22 0a 20 20 20 20  TCH 'five'".    
29b0: 20 20 20 20 33 20 20 20 20 22 53 45 4c 45 43 54      3    "SELECT
29c0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
29d0: 20 61 20 4d 41 54 43 48 20 27 66 69 76 65 27 22   a MATCH 'five'"
29e0: 0a 20 20 20 20 20 20 20 20 34 20 20 20 20 22 53  .        4    "S
29f0: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 74 31  ELECT offsets(t1
2a00: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
2a10: 74 31 20 4d 41 54 43 48 20 27 6a 6b 27 22 0a 20  t1 MATCH 'jk'". 
2a20: 20 20 20 20 20 20 20 35 20 20 20 20 22 53 45 4c         5    "SEL
2a30: 45 43 54 20 6f 66 66 73 65 74 73 28 74 31 29 20  ECT offsets(t1) 
2a40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
2a50: 20 4d 41 54 43 48 20 27 74 75 67 2a 20 4f 52 20   MATCH 'tug* OR 
2a60: 65 69 67 68 74 27 22 0a 20 20 20 20 20 20 7d 20  eight'".      } 
2a70: 7b 0a 20 20 20 20 20 20 20 20 64 6f 5f 74 65 73  {.        do_tes
2a80: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 34  t backcompat-3.4
2a90: 20 5b 6c 69 73 74 20 73 71 6c 31 20 24 71 5d 20   [list sql1 $q] 
2aa0: 5b 73 71 6c 32 20 24 71 5d 0a 20 20 20 20 20 20  [sql2 $q].      
2ab0: 7d 0a 20 20 0a 20 20 20 20 20 20 73 65 74 20 61  }.  .      set a
2ac0: 6c 70 68 61 62 65 74 20 22 61 20 62 20 63 20 64  lphabet "a b c d
2ad0: 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c   e f g h i j k l
2ae0: 20 6d 20 6e 20 6f 20 70 20 71 20 72 20 73 20 74   m n o p q r s t
2af0: 20 75 20 76 20 77 20 78 20 79 20 7a 20 31 20 32   u v w x y z 1 2
2b00: 20 33 20 34 22 0a 20 20 20 20 20 20 66 6f 72 20   3 4".      for 
2b10: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
2b20: 39 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  900} {incr i} {.
2b30: 20 20 20 20 20 20 20 20 73 65 74 20 74 65 72 6d          set term
2b40: 20 22 5b 6c 69 6e 64 65 78 20 24 61 6c 70 68 61   "[lindex $alpha
2b50: 62 65 74 20 5b 65 78 70 72 20 24 69 2f 33 30 5d  bet [expr $i/30]
2b60: 5d 5b 6c 69 6e 64 65 78 20 24 61 6c 70 68 61 62  ][lindex $alphab
2b70: 65 74 20 5b 65 78 70 72 20 24 69 25 33 30 5d 5d  et [expr $i%30]]
2b80: 20 22 0a 20 20 20 20 20 20 20 20 73 71 6c 31 20   ".        sql1 
2b90: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  "INSERT INTO t1 
2ba0: 56 41 4c 55 45 53 28 24 69 2c 20 27 5b 73 74 72  VALUES($i, '[str
2bb0: 69 6e 67 20 72 65 70 65 61 74 20 24 74 65 72 6d  ing repeat $term
2bc0: 20 31 34 5d 27 29 22 0a 20 20 20 20 20 20 7d 0a   14]')".      }.
2bd0: 20 20 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68    .      foreach
2be0: 20 7b 6e 20 71 7d 20 7b 0a 20 20 20 20 20 20 20   {n q} {.       
2bf0: 20 31 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20   1    "SELECT * 
2c00: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
2c10: 20 61 2c 20 62 22 0a 20 20 20 20 20 20 20 20 32   a, b".        2
2c20: 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69      "SELECT rowi
2c30: 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  d FROM t1 WHERE 
2c40: 61 20 4d 41 54 43 48 20 27 66 69 76 65 27 22 0a  a MATCH 'five'".
2c50: 20 20 20 20 20 20 20 20 33 20 20 20 20 22 53 45          3    "SE
2c60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
2c70: 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 66 69  HERE a MATCH 'fi
2c80: 76 65 27 22 0a 20 20 20 20 20 20 20 20 34 20 20  ve'".        4  
2c90: 20 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74    "SELECT offset
2ca0: 73 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48  s(t1) FROM t1 WH
2cb0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 6a 6b  ERE t1 MATCH 'jk
2cc0: 27 22 0a 20 20 20 20 20 20 20 20 35 20 20 20 20  '".        5    
2cd0: 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28  "SELECT offsets(
2ce0: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
2cf0: 45 20 74 31 20 4d 41 54 43 48 20 27 74 75 67 2a  E t1 MATCH 'tug*
2d00: 20 4f 52 20 65 69 67 68 74 27 22 0a 20 20 0a 20   OR eight'".  . 
2d10: 20 20 20 20 20 20 20 36 20 20 20 20 22 53 45 4c         6    "SEL
2d20: 45 43 54 20 6f 66 66 73 65 74 73 28 74 31 29 20  ECT offsets(t1) 
2d30: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
2d40: 20 4d 41 54 43 48 20 27 61 61 27 22 0a 20 20 20   MATCH 'aa'".   
2d50: 20 20 20 20 20 37 20 20 20 20 22 53 45 4c 45 43       7    "SELEC
2d60: 54 20 6f 66 66 73 65 74 73 28 74 31 29 20 46 52  T offsets(t1) FR
2d70: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
2d80: 41 54 43 48 20 27 34 34 27 22 0a 20 20 20 20 20  ATCH '44'".     
2d90: 20 20 20 38 20 20 20 20 22 53 45 4c 45 43 54 20     8    "SELECT 
2da0: 6f 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d  offsets(t1) FROM
2db0: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
2dc0: 43 48 20 27 61 2a 27 22 0a 20 20 20 20 20 20 7d  CH 'a*'".      }
2dd0: 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 5f 74 65   {.        do_te
2de0: 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e  st backcompat-3.
2df0: 35 20 5b 6c 69 73 74 20 73 71 6c 31 20 24 71 5d  5 [list sql1 $q]
2e00: 20 5b 73 71 6c 32 20 24 71 5d 0a 20 20 20 20 20   [sql2 $q].     
2e10: 20 7d 0a 20 20 0a 20 20 20 20 20 20 64 6f 5f 74   }.  .      do_t
2e20: 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33  est backcompat-3
2e30: 2e 36 20 7b 20 0a 20 20 20 20 20 20 20 20 73 71  .6 { .        sq
2e40: 6c 31 20 22 53 45 4c 45 43 54 20 6f 70 74 69 6d  l1 "SELECT optim
2e50: 69 7a 65 28 74 31 29 20 46 52 4f 4d 20 74 31 20  ize(t1) FROM t1 
2e60: 4c 49 4d 49 54 20 31 22 20 0a 20 20 20 20 20 20  LIMIT 1" .      
2e70: 7d 20 7b 7b 49 6e 64 65 78 20 6f 70 74 69 6d 69  } {{Index optimi
2e80: 7a 65 64 7d 7d 0a 20 20 0a 20 20 20 20 20 20 66  zed}}.  .      f
2e90: 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20 7b 0a 20  oreach {n q} {. 
2ea0: 20 20 20 20 20 20 20 31 20 20 20 20 22 53 45 4c         1    "SEL
2eb0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52  ECT * FROM t1 OR
2ec0: 44 45 52 20 42 59 20 61 2c 20 62 22 0a 20 20 20  DER BY a, b".   
2ed0: 20 20 20 20 20 32 20 20 20 20 22 53 45 4c 45 43       2    "SELEC
2ee0: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  T rowid FROM t1 
2ef0: 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 66  WHERE a MATCH 'f
2f00: 69 76 65 27 22 0a 20 20 20 20 20 20 20 20 33 20  ive'".        3 
2f10: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
2f20: 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54  M t1 WHERE a MAT
2f30: 43 48 20 27 66 69 76 65 27 22 0a 20 20 20 20 20  CH 'five'".     
2f40: 20 20 20 34 20 20 20 20 22 53 45 4c 45 43 54 20     4    "SELECT 
2f50: 6f 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d  offsets(t1) FROM
2f60: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
2f70: 43 48 20 27 6a 6b 27 22 0a 20 20 20 20 20 20 20  CH 'jk'".       
2f80: 20 35 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66   5    "SELECT of
2f90: 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74  fsets(t1) FROM t
2fa0: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
2fb0: 20 27 74 75 67 2a 20 4f 52 20 65 69 67 68 74 27   'tug* OR eight'
2fc0: 22 0a 20 20 0a 20 20 20 20 20 20 20 20 36 20 20  ".  .        6  
2fd0: 20 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74    "SELECT offset
2fe0: 73 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48  s(t1) FROM t1 WH
2ff0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 61  ERE t1 MATCH 'aa
3000: 27 22 0a 20 20 20 20 20 20 20 20 37 20 20 20 20  '".        7    
3010: 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28  "SELECT offsets(
3020: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
3030: 45 20 74 31 20 4d 41 54 43 48 20 27 34 34 27 22  E t1 MATCH '44'"
3040: 0a 20 20 20 20 20 20 20 20 38 20 20 20 20 22 53  .        8    "S
3050: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 74 31  ELECT offsets(t1
3060: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
3070: 74 31 20 4d 41 54 43 48 20 27 61 2a 27 22 0a 20  t1 MATCH 'a*'". 
3080: 20 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 20       } {.       
3090: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
30a0: 70 61 74 2d 33 2e 37 20 5b 6c 69 73 74 20 73 71  pat-3.7 [list sq
30b0: 6c 31 20 24 71 5d 20 5b 73 71 6c 32 20 24 71 5d  l1 $q] [sql2 $q]
30c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30d0: 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 0a 23 20 54 65 73 74 20 74 68 61 74 20 52 74 72  .# Test that Rtr
3130: 65 65 20 74 61 62 6c 65 73 20 6d 61 79 20 62 65  ee tables may be
3140: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 62 79   read/written by
3150: 20 64 69 66 66 65 72 65 6e 74 20 76 65 72 73 69   different versi
3160: 6f 6e 73 20 6f 66 20 0a 23 20 53 51 4c 69 74 65  ons of .# SQLite
3170: 2e 20 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 72  . .#.ifcapable r
3180: 74 72 65 65 20 7b 0a 20 20 73 65 74 20 63 6f 6e  tree {.  set con
3190: 74 65 6e 74 73 20 7b 0a 20 20 20 20 43 52 45 41  tents {.    CREA
31a0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
31b0: 20 74 31 20 55 53 49 4e 47 20 72 74 72 65 65 28   t1 USING rtree(
31c0: 69 64 2c 20 78 31 2c 20 78 32 2c 20 79 31 2c 20  id, x1, x2, y1, 
31d0: 79 32 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 65 61  y2);.  }.  forea
31e0: 63 68 20 7b 69 64 20 78 31 20 78 32 20 79 31 20  ch {id x1 x2 y1 
31f0: 79 32 7d 20 7b 0a 20 20 20 20 31 20 20 20 20 2d  y2} {.    1    -
3200: 34 37 2e 36 34 20 34 33 2e 38 37 20 20 20 20 33  47.64 43.87    3
3210: 33 2e 38 36 20 33 34 2e 34 32 20 20 20 20 20 20  3.86 34.42      
3220: 20 20 32 20 20 20 20 2d 32 31 2e 35 31 20 31 37    2    -21.51 17
3230: 2e 33 32 20 20 20 20 32 2e 30 35 20 33 31 2e 30  .32    2.05 31.0
3240: 34 0a 20 20 20 20 33 20 20 20 20 2d 34 33 2e 36  4.    3    -43.6
3250: 37 20 2d 33 38 2e 33 33 20 20 20 20 2d 31 39 2e  7 -38.33    -19.
3260: 37 39 20 33 2e 34 33 20 20 20 20 20 20 20 34 20  79 3.43       4 
3270: 20 20 20 33 32 2e 34 31 20 33 35 2e 31 36 20 20     32.41 35.16  
3280: 20 20 39 2e 31 32 20 31 39 2e 38 32 0a 20 20 20    9.12 19.82.   
3290: 20 35 20 20 20 20 33 33 2e 32 38 20 33 34 2e 38   5    33.28 34.8
32a0: 37 20 20 20 20 31 34 2e 37 38 20 32 38 2e 32 36  7    14.78 28.26
32b0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 34 39           6    49
32c0: 2e 33 31 20 31 31 36 2e 35 39 20 20 20 20 2d 39  .31 116.59    -9
32d0: 2e 38 37 20 37 35 2e 30 39 0a 20 20 20 20 37 20  .87 75.09.    7 
32e0: 20 20 20 2d 31 34 2e 39 33 20 33 34 2e 35 31 20     -14.93 34.51 
32f0: 20 20 20 2d 31 37 2e 36 34 20 36 34 2e 30 39 20     -17.64 64.09 
3300: 20 20 20 20 20 20 38 20 20 20 20 2d 34 33 2e 30        8    -43.0
3310: 35 20 32 33 2e 34 33 20 20 20 20 2d 31 2e 31 39  5 23.43    -1.19
3320: 20 36 39 2e 34 34 0a 20 20 20 20 39 20 20 20 20   69.44.    9    
3330: 34 34 2e 37 39 20 31 33 33 2e 35 36 20 20 20 20  44.79 133.56    
3340: 32 38 2e 30 39 20 38 30 2e 33 30 20 20 20 20 20  28.09 80.30     
3350: 20 20 20 31 30 20 20 20 20 2d 32 2e 36 36 20 38     10    -2.66 8
3360: 31 2e 34 37 20 20 20 20 2d 34 31 2e 33 38 20 2d  1.47    -41.38 -
3370: 31 30 2e 34 36 0a 20 20 20 20 31 31 20 20 20 20  10.46.    11    
3380: 2d 34 32 2e 38 39 20 2d 33 2e 35 34 20 20 20 20  -42.89 -3.54    
3390: 31 35 2e 37 36 20 37 31 2e 36 33 20 20 20 20 20  15.76 71.63     
33a0: 20 20 31 32 20 20 20 20 2d 33 2e 35 30 20 38 34    12    -3.50 84
33b0: 2e 39 36 20 20 20 20 2d 31 31 2e 36 34 20 36 34  .96    -11.64 64
33c0: 2e 39 35 0a 20 20 20 20 31 33 20 20 20 20 2d 34  .95.    13    -4
33d0: 35 2e 36 39 20 32 36 2e 32 35 20 20 20 20 31 31  5.69 26.25    11
33e0: 2e 31 34 20 35 35 2e 30 36 20 20 20 20 20 20 20  .14 55.06       
33f0: 31 34 20 20 20 20 2d 34 34 2e 30 39 20 31 31 2e  14    -44.09 11.
3400: 32 33 20 20 20 20 31 37 2e 35 32 20 34 34 2e 34  23    17.52 44.4
3410: 35 0a 20 20 20 20 31 35 20 20 20 20 33 36 2e 32  5.    15    36.2
3420: 33 20 31 33 33 2e 34 39 20 20 20 20 2d 31 39 2e  3 133.49    -19.
3430: 33 38 20 35 33 2e 36 37 20 20 20 20 20 20 31 36  38 53.67      16
3440: 20 20 20 20 2d 31 37 2e 38 39 20 38 31 2e 35 34      -17.89 81.54
3450: 20 20 20 20 31 34 2e 36 34 20 35 30 2e 36 31 0a      14.64 50.61.
3460: 20 20 20 20 31 37 20 20 20 20 2d 34 31 2e 39 37      17    -41.97
3470: 20 2d 32 34 2e 30 34 20 20 20 20 2d 33 39 2e 34   -24.04    -39.4
3480: 33 20 32 38 2e 39 35 20 20 20 20 20 31 38 20 20  3 28.95     18  
3490: 20 20 2d 35 2e 38 35 20 37 2e 37 36 20 20 20 20    -5.85 7.76    
34a0: 2d 36 2e 33 38 20 34 37 2e 30 32 0a 20 20 20 20  -6.38 47.02.    
34b0: 31 39 20 20 20 20 31 38 2e 38 32 20 32 37 2e 31  19    18.82 27.1
34c0: 30 20 20 20 20 34 32 2e 38 32 20 31 30 30 2e 30  0    42.82 100.0
34d0: 39 20 20 20 20 20 20 20 32 30 20 20 20 20 33 39  9       20    39
34e0: 2e 31 37 20 31 31 33 2e 34 35 20 20 20 20 32 36  .17 113.45    26
34f0: 2e 31 34 20 37 33 2e 34 37 0a 20 20 20 20 32 31  .14 73.47.    21
3500: 20 20 20 20 32 32 2e 33 31 20 31 30 33 2e 31 37      22.31 103.17
3510: 20 20 20 20 34 39 2e 39 32 20 31 30 36 2e 30 35      49.92 106.05
3520: 20 20 20 20 20 20 32 32 20 20 20 20 2d 34 33 2e        22    -43.
3530: 30 36 20 34 30 2e 33 38 20 20 20 20 2d 31 2e 37  06 40.38    -1.7
3540: 35 20 37 36 2e 30 38 0a 20 20 20 20 32 33 20 20  5 76.08.    23  
3550: 20 20 32 2e 34 33 20 35 37 2e 32 37 20 20 20 20    2.43 57.27    
3560: 2d 31 34 2e 31 39 20 2d 33 2e 38 33 20 20 20 20  -14.19 -3.83    
3570: 20 20 20 20 32 34 20 20 20 20 2d 34 37 2e 35 37      24    -47.57
3580: 20 2d 34 2e 33 35 20 20 20 20 38 2e 39 33 20 31   -4.35    8.93 1
3590: 30 30 2e 30 36 0a 20 20 20 20 32 35 20 20 20 20  00.06.    25    
35a0: 2d 33 37 2e 34 37 20 34 39 2e 31 34 20 20 20 20  -37.47 49.14    
35b0: 2d 32 39 2e 31 31 20 38 2e 38 31 20 20 20 20 20  -29.11 8.81     
35c0: 20 20 32 36 20 20 20 20 2d 37 2e 38 36 20 37 35    26    -7.86 75
35d0: 2e 37 32 20 20 20 20 34 39 2e 33 34 20 31 30 37  .72    49.34 107
35e0: 2e 34 32 0a 20 20 20 20 32 37 20 20 20 20 31 2e  .42.    27    1.
35f0: 35 33 20 34 35 2e 34 39 20 20 20 20 32 30 2e 33  53 45.49    20.3
3600: 36 20 34 39 2e 37 34 20 20 20 20 20 20 20 20 20  6 49.74         
3610: 32 38 20 20 20 20 2d 34 38 2e 34 38 20 33 32 2e  28    -48.48 32.
3620: 35 34 20 20 20 20 32 38 2e 38 31 20 35 34 2e 34  54    28.81 54.4
3630: 35 0a 20 20 20 20 32 39 20 20 20 20 32 2e 36 37  5.    29    2.67
3640: 20 33 39 2e 37 37 20 20 20 20 2d 34 2e 30 35 20   39.77    -4.05 
3650: 31 33 2e 36 37 20 20 20 20 20 20 20 20 20 33 30  13.67         30
3660: 20 20 20 20 34 2e 31 31 20 36 32 2e 38 38 20 20      4.11 62.88  
3670: 20 20 2d 34 37 2e 34 34 20 2d 35 2e 37 32 0a 20    -47.44 -5.72. 
3680: 20 20 20 33 31 20 20 20 20 2d 32 31 2e 34 37 20     31    -21.47 
3690: 35 31 2e 37 35 20 20 20 20 33 37 2e 32 35 20 31  51.75    37.25 1
36a0: 31 36 2e 30 39 20 20 20 20 20 20 33 32 20 20 20  16.09      32   
36b0: 20 34 35 2e 35 39 20 31 31 31 2e 33 37 20 20 20   45.59 111.37   
36c0: 20 2d 36 2e 34 33 20 34 33 2e 36 34 0a 20 20 20   -6.43 43.64.   
36d0: 20 33 33 20 20 20 20 33 35 2e 32 33 20 34 38 2e   33    35.23 48.
36e0: 32 39 20 20 20 20 32 33 2e 35 34 20 31 31 33 2e  29    23.54 113.
36f0: 33 33 20 20 20 20 20 20 20 33 34 20 20 20 20 31  33       34    1
3700: 36 2e 36 31 20 36 38 2e 33 35 20 20 20 20 2d 31  6.61 68.35    -1
3710: 34 2e 36 39 20 36 35 2e 39 37 0a 20 20 20 20 33  4.69 65.97.    3
3720: 35 20 20 20 20 31 33 2e 39 38 20 31 36 2e 36 30  5    13.98 16.60
3730: 20 20 20 20 34 38 2e 36 36 20 31 30 32 2e 38 37      48.66 102.87
3740: 20 20 20 20 20 20 20 33 36 20 20 20 20 31 39 2e         36    19.
3750: 37 34 20 32 33 2e 38 34 20 20 20 20 33 31 2e 31  74 23.84    31.1
3760: 35 20 37 37 2e 32 37 0a 20 20 20 20 33 37 20 20  5 77.27.    37  
3770: 20 20 2d 32 37 2e 36 31 20 32 34 2e 34 33 20 20    -27.61 24.43  
3780: 20 20 37 2e 39 36 20 39 34 2e 39 31 20 20 20 20    7.96 94.91    
3790: 20 20 20 20 33 38 20 20 20 20 2d 33 34 2e 37 37      38    -34.77
37a0: 20 31 32 2e 30 35 20 20 20 20 2d 32 32 2e 36 30   12.05    -22.60
37b0: 20 2d 36 2e 32 39 0a 20 20 20 20 33 39 20 20 20   -6.29.    39   
37c0: 20 2d 32 35 2e 38 33 20 38 2e 37 31 20 20 20 20   -25.83 8.71    
37d0: 2d 31 33 2e 34 38 20 2d 31 32 2e 35 33 20 20 20  -13.48 -12.53   
37e0: 20 20 20 34 30 20 20 20 20 2d 31 37 2e 31 31 20     40    -17.11 
37f0: 2d 31 2e 30 31 20 20 20 20 31 38 2e 30 36 20 36  -1.01    18.06 6
3800: 37 2e 38 39 0a 20 20 20 20 34 31 20 20 20 20 31  7.89.    41    1
3810: 34 2e 31 33 20 37 31 2e 37 32 20 20 20 20 2d 33  4.13 71.72    -3
3820: 2e 37 38 20 33 39 2e 32 35 20 20 20 20 20 20 20  .78 39.25       
3830: 20 34 32 20 20 20 20 32 33 2e 37 35 20 37 36 2e   42    23.75 76.
3840: 30 30 20 20 20 20 2d 31 36 2e 33 30 20 38 2e 32  00    -16.30 8.2
3850: 33 0a 20 20 20 20 34 33 20 20 20 20 2d 33 39 2e  3.    43    -39.
3860: 31 35 20 32 38 2e 36 33 20 20 20 20 33 38 2e 31  15 28.63    38.1
3870: 32 20 31 32 35 2e 38 38 20 20 20 20 20 20 34 34  2 125.88      44
3880: 20 20 20 20 34 38 2e 36 32 20 38 36 2e 30 39 20      48.62 86.09 
3890: 20 20 20 33 36 2e 34 39 20 31 30 32 2e 39 35 0a     36.49 102.95.
38a0: 20 20 20 20 34 35 20 20 20 20 2d 33 31 2e 33 39      45    -31.39
38b0: 20 2d 32 31 2e 39 38 20 20 20 20 32 2e 35 32 20   -21.98    2.52 
38c0: 38 39 2e 37 38 20 20 20 20 20 20 20 34 36 20 20  89.78       46  
38d0: 20 20 35 2e 36 35 20 35 36 2e 30 34 20 20 20 20    5.65 56.04    
38e0: 31 35 2e 39 34 20 38 39 2e 31 30 0a 20 20 20 20  15.94 89.10.    
38f0: 34 37 20 20 20 20 31 38 2e 32 38 20 39 35 2e 38  47    18.28 95.8
3900: 31 20 20 20 20 34 36 2e 34 36 20 31 34 33 2e 30  1    46.46 143.0
3910: 38 20 20 20 20 20 20 20 34 38 20 20 20 20 33 30  8       48    30
3920: 2e 39 33 20 31 30 32 2e 38 32 20 20 20 20 2d 32  .93 102.82    -2
3930: 30 2e 30 38 20 33 37 2e 33 36 0a 20 20 20 20 34  0.08 37.36.    4
3940: 39 20 20 20 20 2d 32 30 2e 37 38 20 2d 33 2e 34  9    -20.78 -3.4
3950: 38 20 20 20 20 2d 35 2e 35 38 20 33 35 2e 34 36  8    -5.58 35.46
3960: 20 20 20 20 20 20 20 35 30 20 20 20 20 34 39 2e         50    49.
3970: 38 35 20 39 30 2e 35 38 20 20 20 20 2d 32 34 2e  85 90.58    -24.
3980: 34 38 20 34 36 2e 32 39 0a 20 20 7d 20 7b 0a 20  48 46.29.  } {. 
3990: 20 69 66 20 7b 24 78 31 20 3e 3d 20 24 78 32 20   if {$x1 >= $x2 
39a0: 7c 7c 20 24 79 31 20 3e 3d 20 24 79 32 7d 20 7b  || $y1 >= $y2} {
39b0: 20 65 72 72 6f 72 20 22 24 78 31 20 24 78 32 20   error "$x1 $x2 
39c0: 24 79 31 20 24 79 32 22 20 7d 0a 20 20 20 20 61  $y1 $y2" }.    a
39d0: 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 73 20 22  ppend contents "
39e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
39f0: 41 4c 55 45 53 28 24 69 64 2c 20 24 78 31 2c 20  ALUES($id, $x1, 
3a00: 24 78 32 2c 20 24 79 31 2c 20 24 79 32 29 3b 22  $x2, $y1, $y2);"
3a10: 0a 20 20 7d 0a 20 20 73 65 74 20 71 75 65 72 69  .  }.  set queri
3a20: 65 73 20 7b 0a 20 20 20 20 31 20 20 20 20 22 53  es {.    1    "S
3a30: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 31  ELECT id FROM t1
3a40: 20 57 48 45 52 45 20 78 31 3e 31 30 20 41 4e 44   WHERE x1>10 AND
3a50: 20 78 32 3c 34 34 22 0a 20 20 20 20 32 20 20 20   x2<44".    2   
3a60: 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d   "SELECT id FROM
3a70: 20 74 31 20 57 48 45 52 45 20 79 31 3c 31 30 30   t1 WHERE y1<100
3a80: 22 0a 20 20 20 20 33 20 20 20 20 22 53 45 4c 45  ".    3    "SELE
3a90: 43 54 20 69 64 20 46 52 4f 4d 20 74 31 20 57 48  CT id FROM t1 WH
3aa0: 45 52 45 20 79 31 3c 31 30 30 20 41 4e 44 20 78  ERE y1<100 AND x
3ab0: 31 3e 30 22 0a 20 20 20 20 34 20 20 20 20 22 53  1>0".    4    "S
3ac0: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 31  ELECT id FROM t1
3ad0: 20 57 48 45 52 45 20 79 31 3e 31 30 20 41 4e 44   WHERE y1>10 AND
3ae0: 20 78 31 3e 30 20 41 4e 44 20 78 32 3c 35 30 20   x1>0 AND x2<50 
3af0: 41 4e 44 20 79 32 3c 35 35 30 22 0a 20 20 7d 0a  AND y2<550".  }.
3b00: 20 20 64 6f 5f 61 6c 6c 62 61 63 6b 63 6f 6d 70    do_allbackcomp
3b10: 61 74 5f 74 65 73 74 20 7b 0a 20 20 20 20 69 66  at_test {.    if
3b20: 20 7b 5b 63 6f 64 65 31 20 7b 73 65 74 20 3a 3a   {[code1 {set ::
3b30: 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 66  sqlite_options(f
3b40: 74 73 33 29 7d 5d 0a 20 20 20 20 20 26 26 20 5b  ts3)}].     && [
3b50: 63 6f 64 65 32 20 7b 73 65 74 20 3a 3a 73 71 6c  code2 {set ::sql
3b60: 69 74 65 5f 6f 70 74 69 6f 6e 73 28 66 74 73 33  ite_options(fts3
3b70: 29 7d 5d 0a 20 20 20 20 7d 20 7b 0a 20 20 0a 20  )}].    } {.  . 
3b80: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63       do_test bac
3b90: 6b 63 6f 6d 70 61 74 2d 34 2e 31 20 7b 20 73 71  kcompat-4.1 { sq
3ba0: 6c 31 20 24 63 6f 6e 74 65 6e 74 73 20 7d 20 7b  l1 $contents } {
3bb0: 7d 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 65 61  }.  .      forea
3bc0: 63 68 20 7b 6e 20 71 7d 20 24 3a 3a 71 75 65 72  ch {n q} $::quer
3bd0: 69 65 73 20 7b 0a 20 20 20 20 20 20 20 20 64 6f  ies {.        do
3be0: 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74  _test backcompat
3bf0: 2d 34 2e 32 2e 24 6e 20 5b 6c 69 73 74 20 73 71  -4.2.$n [list sq
3c00: 6c 31 20 24 71 5d 20 5b 73 71 6c 32 20 24 71 5d  l1 $q] [sql2 $q]
3c10: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
3c20: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f    do_test backco
3c30: 6d 70 61 74 2d 34 2e 33 20 7b 20 73 71 6c 31 20  mpat-4.3 { sql1 
3c40: 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  {.        INSERT
3c50: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3c60: 69 64 2b 31 30 30 2c 20 78 31 2b 31 30 2e 30 2c  id+100, x1+10.0,
3c70: 20 78 32 2b 31 30 2e 30 2c 20 79 31 2d 31 30 2e   x2+10.0, y1-10.
3c80: 30 2c 20 79 32 2d 31 30 2e 30 20 46 52 4f 4d 20  0, y2-10.0 FROM 
3c90: 74 31 3b 0a 20 20 20 20 20 20 7d 20 7d 20 7b 7d  t1;.      } } {}
3ca0: 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 65 61 63  .  .      foreac
3cb0: 68 20 7b 6e 20 71 7d 20 24 3a 3a 71 75 65 72 69  h {n q} $::queri
3cc0: 65 73 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 5f  es {.        do_
3cd0: 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d  test backcompat-
3ce0: 34 2e 34 2e 24 6e 20 5b 6c 69 73 74 20 73 71 6c  4.4.$n [list sql
3cf0: 31 20 24 71 5d 20 5b 73 71 6c 32 20 24 71 5d 0a  1 $q] [sql2 $q].
3d00: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
3d10: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
3d20: 70 61 74 2d 34 2e 35 20 7b 20 73 71 6c 32 20 7b  pat-4.5 { sql2 {
3d30: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
3d40: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 69  INTO t1 SELECT i
3d50: 64 2b 32 30 30 2c 20 78 31 2b 32 30 2e 30 2c 20  d+200, x1+20.0, 
3d60: 78 32 2b 32 30 2e 30 2c 20 79 31 2d 32 30 2e 30  x2+20.0, y1-20.0
3d70: 2c 20 79 32 2d 32 30 2e 30 20 46 52 4f 4d 20 74  , y2-20.0 FROM t
3d80: 31 3b 0a 20 20 20 20 20 20 7d 20 7d 20 7b 7d 0a  1;.      } } {}.
3d90: 20 20 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68    .      foreach
3da0: 20 7b 6e 20 71 7d 20 24 3a 3a 71 75 65 72 69 65   {n q} $::querie
3db0: 73 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 5f 74  s {.        do_t
3dc0: 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 34  est backcompat-4
3dd0: 2e 36 2e 24 6e 20 5b 6c 69 73 74 20 73 71 6c 31  .6.$n [list sql1
3de0: 20 24 71 5d 20 5b 73 71 6c 32 20 24 71 5d 0a 20   $q] [sql2 $q]. 
3df0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 7d 0a       }.  .    }.
3e00: 20 20 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65    }.}..finish_te
3e10: 73 74 0a                                         st.