/ Hex Artifact Content
Login

Artifact 94778872ed9f6158ba1b8534264d3413ae7e27f8:


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: 7d 0a 66 6f 72 65 61 63 68 20 6b 20 5b 6c 73 6f  }.foreach k [lso
1930: 72 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20  rt [array names 
1940: 3a 3a 69 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 5d  ::incompatible]]
1950: 20 7b 0a 20 20 70 75 74 73 20 22 45 52 52 4f 52   {.  puts "ERROR
1960: 3a 20 44 65 74 65 63 74 65 64 20 6a 6f 75 72 6e  : Detected journ
1970: 61 6c 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  al incompatibili
1980: 74 79 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ty with version 
1990: 24 6b 22 0a 7d 0a 75 6e 73 65 74 20 3a 3a 69 6e  $k".}.unset ::in
19a0: 63 6f 6d 70 61 74 69 62 6c 65 0a 0a 0a 23 2d 2d  compatible...#--
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
1a00: 68 61 74 20 57 41 4c 20 61 6e 64 20 77 61 6c 2d  hat WAL and wal-
1a10: 69 6e 64 65 78 20 66 69 6c 65 73 20 6d 61 79 20  index files may 
1a20: 62 65 20 73 68 61 72 65 64 20 62 65 74 77 65 65  be shared betwee
1a30: 6e 20 64 69 66 66 65 72 65 6e 74 20 0a 23 20 53  n different .# S
1a40: 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 73 2e 0a  QLite versions..
1a50: 23 0a 64 6f 5f 61 6c 6c 62 61 63 6b 63 6f 6d 70  #.do_allbackcomp
1a60: 61 74 5f 74 65 73 74 20 7b 0a 20 20 69 66 20 7b  at_test {.  if {
1a70: 5b 63 6f 64 65 31 20 7b 73 71 6c 69 74 65 33 20  [code1 {sqlite3 
1a80: 2d 76 65 72 73 69 6f 6e 7d 5d 20 3e 3d 20 22 33  -version}] >= "3
1a90: 2e 37 2e 30 22 0a 20 20 20 26 26 20 5b 63 6f 64  .7.0".   && [cod
1aa0: 65 32 20 7b 73 71 6c 69 74 65 33 20 2d 76 65 72  e2 {sqlite3 -ver
1ab0: 73 69 6f 6e 7d 5d 20 3e 3d 20 22 33 2e 37 2e 30  sion}] >= "3.7.0
1ac0: 22 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 64 6f 5f  ".  } {..    do_
1ad0: 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d  test backcompat-
1ae0: 32 2e 31 2e 31 20 7b 20 73 71 6c 31 20 7b 0a 20  2.1.1 { sql1 {. 
1af0: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
1b00: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
1b10: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
1b20: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
1b30: 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  KEY, b UNIQUE);.
1b40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1b50: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c  O t1 VALUES('I',
1b60: 20 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   1);.      INSER
1b70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1b80: 28 27 49 49 27 2c 20 32 29 3b 0a 20 20 20 20 20  ('II', 2);.     
1b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1ba0: 56 41 4c 55 45 53 28 27 49 49 49 27 2c 20 33 29  VALUES('III', 3)
1bb0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1bc0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20   FROM t1;.    } 
1bd0: 7d 20 7b 77 61 6c 20 49 20 31 20 49 49 20 32 20  } {wal I 1 II 2 
1be0: 49 49 49 20 33 7d 0a 20 20 20 20 64 6f 5f 74 65  III 3}.    do_te
1bf0: 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 32 2e  st backcompat-2.
1c00: 31 2e 32 20 7b 20 73 71 6c 32 20 7b 0a 20 20 20  1.2 { sql2 {.   
1c10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1c20: 20 74 31 3b 0a 20 20 20 20 7d 20 7d 20 7b 49 20   t1;.    } } {I 
1c30: 31 20 49 49 20 32 20 49 49 49 20 33 7d 0a 0a 20  1 II 2 III 3}.. 
1c40: 20 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61     set data [rea
1c50: 64 5f 66 69 6c 65 5f 73 79 73 74 65 6d 5d 0a 20  d_file_system]. 
1c60: 20 20 20 63 6f 64 65 31 20 7b 64 62 20 63 6c 6f     code1 {db clo
1c70: 73 65 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 64  se}.    code2 {d
1c80: 62 20 63 6c 6f 73 65 7d 0a 20 20 20 20 77 72 69  b close}.    wri
1c90: 74 65 5f 66 69 6c 65 5f 73 79 73 74 65 6d 20 24  te_file_system $
1ca0: 64 61 74 61 0a 20 20 20 20 63 6f 64 65 31 20 7b  data.    code1 {
1cb0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
1cc0: 64 62 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b 73  db}.    code2 {s
1cd0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1ce0: 62 7d 0a 0a 20 20 20 20 23 20 54 68 65 20 57 41  b}..    # The WA
1cf0: 4c 20 66 69 6c 65 20 6e 6f 77 20 69 6e 20 74 68  L file now in th
1d00: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 61  e file-system wa
1d10: 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
1d20: 20 5b 63 6f 64 65 31 5d 0a 20 20 20 20 23 20 70   [code1].    # p
1d30: 72 6f 63 65 73 73 2e 20 43 68 65 63 6b 20 74 68  rocess. Check th
1d40: 61 74 20 74 68 65 20 5b 63 6f 64 65 32 5d 20 70  at the [code2] p
1d50: 72 6f 63 65 73 73 20 63 61 6e 20 72 65 63 6f 76  rocess can recov
1d60: 65 72 20 74 68 65 20 6c 6f 67 2e 0a 20 20 20 20  er the log..    
1d70: 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61  #.    do_test ba
1d80: 63 6b 63 6f 6d 70 61 74 2d 32 2e 31 2e 33 20 7b  ckcompat-2.1.3 {
1d90: 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 53 45   sql2 {.      SE
1da0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
1db0: 20 20 20 20 7d 20 7d 20 7b 49 20 31 20 49 49 20      } } {I 1 II 
1dc0: 32 20 49 49 49 20 33 7d 0a 20 20 20 20 64 6f 5f  2 III 3}.    do_
1dd0: 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d  test backcompat-
1de0: 32 2e 31 2e 34 20 7b 20 73 71 6c 31 20 7b 0a 20  2.1.4 { sql1 {. 
1df0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1e00: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20 7d 20 7b  OM t1;.    } } {
1e10: 49 20 31 20 49 49 20 32 20 49 49 49 20 33 7d 0a  I 1 II 2 III 3}.
1e20: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e70: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 46 54  -.# Test that FT
1e80: 53 33 20 74 61 62 6c 65 73 20 6d 61 79 20 62 65  S3 tables may be
1e90: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 62 79   read/written by
1ea0: 20 64 69 66 66 65 72 65 6e 74 20 76 65 72 73 69   different versi
1eb0: 6f 6e 73 20 6f 66 20 0a 23 20 53 51 4c 69 74 65  ons of .# SQLite
1ec0: 2e 20 0a 23 0a 73 65 74 20 63 6f 6e 74 65 6e 74  . .#.set content
1ed0: 73 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  s {.  CREATE VIR
1ee0: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53  TUAL TABLE t1 US
1ef0: 49 4e 47 20 66 74 73 33 28 61 2c 20 62 29 3b 0a  ING fts3(a, b);.
1f00: 7d 0a 66 6f 72 65 61 63 68 20 7b 6e 75 6d 20 64  }.foreach {num d
1f10: 6f 63 7d 20 7b 0a 20 20 6f 6e 65 20 22 6a 6b 20  oc} {.  one "jk 
1f20: 7a 6d 20 6a 6b 20 65 63 7a 6b 6a 62 6c 75 20 75  zm jk eczkjblu u
1f30: 72 76 79 73 62 6e 79 6b 6b 20 73 6b 20 67 6e 6c  rvysbnykk sk gnl
1f40: 20 6a 6b 20 74 74 76 67 66 20 68 6d 6a 66 22 0a   jk ttvgf hmjf".
1f50: 20 20 74 77 6f 20 22 6a 6b 20 62 6e 68 63 20 6a    two "jk bnhc j
1f60: 6a 72 78 70 6a 6b 62 20 6d 6a 70 61 76 6a 75 68  jrxpjkb mjpavjuh
1f70: 77 20 66 69 62 6f 6b 64 72 79 20 69 67 6a 75 20  w fibokdry igju 
1f80: 6a 6b 20 7a 6d 20 7a 6d 20 78 68 22 0a 20 20 74  jk zm zm xh".  t
1f90: 68 72 65 65 20 22 77 78 65 20 6f 67 74 74 62 79  hree "wxe ogttby
1fa0: 6b 76 74 20 75 68 7a 71 20 78 72 20 69 61 66 20  kvt uhzq xr iaf 
1fb0: 7a 66 20 75 72 76 79 73 62 6e 79 6b 6b 20 61 61  zf urvysbnykk aa
1fc0: 79 78 70 6d 76 65 20 6f 61 63 61 78 67 6a 6f 6f  yxpmve oacaxgjoo
1fd0: 20 6d 6a 70 61 76 6a 75 68 77 22 0a 20 20 66 6f   mjpavjuhw".  fo
1fe0: 75 72 20 22 67 61 7a 72 74 20 6a 6b 20 65 70 68  ur "gazrt jk eph
1ff0: 6b 6e 6f 6e 71 20 6d 79 6a 70 20 75 65 6e 76 62  knonq myjp uenvb
2000: 6d 20 77 75 76 61 6a 68 77 71 7a 20 6a 6b 20 7a  m wuvajhwqz jk z
2010: 6d 20 78 6e 78 68 66 20 6e 76 66 61 73 66 68 22  m xnxhf nvfasfh"
2020: 0a 20 20 66 69 76 65 20 22 7a 6d 20 61 61 79 78  .  five "zm aayx
2030: 70 6d 76 65 20 63 73 6a 71 78 68 67 6a 20 78 6e  pmve csjqxhgj xn
2040: 78 68 66 20 78 72 20 6a 6b 20 61 61 79 78 70 6d  xhf xr jk aayxpm
2050: 76 65 20 78 6e 78 68 66 20 7a 6d 20 7a 6d 22 0a  ve xnxhf zm zm".
2060: 20 20 73 69 78 20 22 73 6f 6b 63 79 66 20 7a 6d    six "sokcyf zm
2070: 20 6f 67 79 61 76 6a 76 76 20 6a 6b 20 7a 6d 20   ogyavjvv jk zm 
2080: 66 69 62 6f 6b 64 72 79 20 7a 6d 20 6a 6b 20 69  fibokdry zm jk i
2090: 67 6a 75 20 69 67 6a 75 22 0a 20 20 73 65 76 65  gju igju".  seve
20a0: 6e 20 22 76 67 73 6c 64 20 62 76 67 69 6d 6a 69  n "vgsld bvgimji
20b0: 6b 20 78 75 70 72 74 6c 79 6c 65 20 6a 6b 20 61  k xuprtlyle jk a
20c0: 6b 6d 69 6b 72 71 79 74 20 6a 6b 20 61 61 79 78  kmikrqyt jk aayx
20d0: 70 6d 76 65 20 68 6b 66 6f 75 64 7a 66 74 71 20  pmve hkfoudzftq 
20e0: 64 64 6a 6a 22 0a 20 20 65 69 67 68 74 20 22 7a  ddjj".  eight "z
20f0: 6d 20 75 68 7a 71 20 6f 76 6b 79 65 76 6c 67 76  m uhzq ovkyevlgv
2100: 20 7a 6b 20 75 65 6e 76 62 6d 20 63 73 6a 71 78   zk uenvbm csjqx
2110: 68 67 6a 20 6a 6b 20 76 67 73 6c 64 20 70 67 79  hgj jk vgsld pgy
2120: 62 73 20 6a 6b 22 0a 20 20 6e 69 6e 65 20 20 22  bs jk".  nine  "
2130: 7a 6d 20 61 67 6d 63 6b 75 69 75 20 7a 65 78 68  zm agmckuiu zexh
2140: 20 66 69 62 6f 6b 64 72 79 20 6a 6b 20 75 68 7a   fibokdry jk uhz
2150: 71 20 62 75 20 74 75 67 66 6c 69 78 6f 65 78 20  q bu tugflixoex 
2160: 78 6e 78 68 66 20 73 6b 22 0a 7d 20 7b 0a 20 20  xnxhf sk".} {.  
2170: 61 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 73 20  append contents 
2180: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  "INSERT INTO t1 
2190: 56 41 4c 55 45 53 28 27 24 6e 75 6d 27 2c 20 27  VALUES('$num', '
21a0: 24 64 6f 63 27 29 3b 22 0a 7d 0a 64 6f 5f 61 6c  $doc');".}.do_al
21b0: 6c 62 61 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74  lbackcompat_test
21c0: 20 7b 0a 20 20 69 66 20 7b 5b 63 6f 64 65 31 20   {.  if {[code1 
21d0: 7b 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70  {set ::sqlite_op
21e0: 74 69 6f 6e 73 28 66 74 73 33 29 7d 5d 0a 20 20  tions(fts3)}].  
21f0: 20 26 26 20 5b 63 6f 64 65 32 20 7b 73 65 74 20   && [code2 {set 
2200: 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73  ::sqlite_options
2210: 28 66 74 73 33 29 7d 5d 0a 20 20 7d 20 7b 0a 0a  (fts3)}].  } {..
2220: 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b      do_test back
2230: 63 6f 6d 70 61 74 2d 33 2e 31 20 7b 20 73 71 6c  compat-3.1 { sql
2240: 31 20 24 63 6f 6e 74 65 6e 74 73 20 7d 20 7b 7d  1 $contents } {}
2250: 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6e  ..    foreach {n
2260: 20 71 7d 20 7b 0a 20 20 20 20 20 20 31 20 20 20   q} {.      1   
2270: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2280: 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62  t1 ORDER BY a, b
2290: 22 0a 20 20 20 20 20 20 32 20 20 20 20 22 53 45  ".      2    "SE
22a0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
22b0: 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43 48  t1 WHERE a MATCH
22c0: 20 27 66 69 76 65 27 22 0a 20 20 20 20 20 20 33   'five'".      3
22d0: 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52      "SELECT * FR
22e0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41  OM t1 WHERE a MA
22f0: 54 43 48 20 27 66 69 76 65 27 22 0a 20 20 20 20  TCH 'five'".    
2300: 20 20 34 20 20 20 20 22 53 45 4c 45 43 54 20 6f    4    "SELECT o
2310: 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20  ffsets(t1) FROM 
2320: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
2330: 48 20 27 6a 6b 27 22 0a 20 20 20 20 20 20 35 20  H 'jk'".      5 
2340: 20 20 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65     "SELECT offse
2350: 74 73 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57  ts(t1) FROM t1 W
2360: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 74  HERE t1 MATCH 't
2370: 75 67 2a 20 4f 52 20 65 69 67 68 74 27 22 0a 20  ug* OR eight'". 
2380: 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f     } {.      do_
2390: 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d  test backcompat-
23a0: 33 2e 32 20 5b 6c 69 73 74 20 73 71 6c 31 20 24  3.2 [list sql1 $
23b0: 71 5d 20 5b 73 71 6c 32 20 24 71 5d 0a 20 20 20  q] [sql2 $q].   
23c0: 20 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   }..    do_test 
23d0: 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 33 20 7b  backcompat-3.3 {
23e0: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 49 4e   sql1 {.      IN
23f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2400: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
2410: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2420: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
2430: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
2440: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2450: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
2460: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2470: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
2480: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
2490: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
24a0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
24b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
24c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
24d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
24e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
24f0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
2500: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2510: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
2520: 20 20 20 20 7d 20 7d 20 7b 7d 0a 0a 20 20 20 20      } } {}..    
2530: 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20 7b 0a  foreach {n q} {.
2540: 20 20 20 20 20 20 31 20 20 20 20 22 53 45 4c 45        1    "SELE
2550: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT * FROM t1 ORD
2560: 45 52 20 42 59 20 61 2c 20 62 22 0a 20 20 20 20  ER BY a, b".    
2570: 20 20 32 20 20 20 20 22 53 45 4c 45 43 54 20 72    2    "SELECT r
2580: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  owid FROM t1 WHE
2590: 52 45 20 61 20 4d 41 54 43 48 20 27 66 69 76 65  RE a MATCH 'five
25a0: 27 22 0a 20 20 20 20 20 20 33 20 20 20 20 22 53  '".      3    "S
25b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
25c0: 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 66  WHERE a MATCH 'f
25d0: 69 76 65 27 22 0a 20 20 20 20 20 20 34 20 20 20  ive'".      4   
25e0: 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73   "SELECT offsets
25f0: 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45  (t1) FROM t1 WHE
2600: 52 45 20 74 31 20 4d 41 54 43 48 20 27 6a 6b 27  RE t1 MATCH 'jk'
2610: 22 0a 20 20 20 20 20 20 35 20 20 20 20 22 53 45  ".      5    "SE
2620: 4c 45 43 54 20 6f 66 66 73 65 74 73 28 74 31 29  LECT offsets(t1)
2630: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
2640: 31 20 4d 41 54 43 48 20 27 74 75 67 2a 20 4f 52  1 MATCH 'tug* OR
2650: 20 65 69 67 68 74 27 22 0a 20 20 20 20 7d 20 7b   eight'".    } {
2660: 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62  .      do_test b
2670: 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 34 20 5b 6c  ackcompat-3.4 [l
2680: 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73 71  ist sql1 $q] [sq
2690: 6c 32 20 24 71 5d 0a 20 20 20 20 7d 0a 0a 20 20  l2 $q].    }..  
26a0: 20 20 73 65 74 20 61 6c 70 68 61 62 65 74 20 22    set alphabet "
26b0: 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68 20  a b c d e f g h 
26c0: 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20 70 20  i j k l m n o p 
26d0: 71 20 72 20 73 20 74 20 75 20 76 20 77 20 78 20  q r s t u v w x 
26e0: 79 20 7a 20 31 20 32 20 33 20 34 22 0a 20 20 20  y z 1 2 3 4".   
26f0: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
2700: 24 69 20 3c 20 39 30 30 7d 20 7b 69 6e 63 72 20  $i < 900} {incr 
2710: 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74  i} {.      set t
2720: 65 72 6d 20 22 5b 6c 69 6e 64 65 78 20 24 61 6c  erm "[lindex $al
2730: 70 68 61 62 65 74 20 5b 65 78 70 72 20 24 69 2f  phabet [expr $i/
2740: 33 30 5d 5d 5b 6c 69 6e 64 65 78 20 24 61 6c 70  30]][lindex $alp
2750: 68 61 62 65 74 20 5b 65 78 70 72 20 24 69 25 33  habet [expr $i%3
2760: 30 5d 5d 20 22 0a 20 20 20 20 20 20 73 71 6c 31  0]] ".      sql1
2770: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   "INSERT INTO t1
2780: 20 56 41 4c 55 45 53 28 24 69 2c 20 27 5b 73 74   VALUES($i, '[st
2790: 72 69 6e 67 20 72 65 70 65 61 74 20 24 74 65 72  ring repeat $ter
27a0: 6d 20 31 34 5d 27 29 22 0a 20 20 20 20 7d 0a 0a  m 14]')".    }..
27b0: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71      foreach {n q
27c0: 7d 20 7b 0a 20 20 20 20 20 20 31 20 20 20 20 22  } {.      1    "
27d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
27e0: 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62 22 0a   ORDER BY a, b".
27f0: 20 20 20 20 20 20 32 20 20 20 20 22 53 45 4c 45        2    "SELE
2800: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  CT rowid FROM t1
2810: 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27   WHERE a MATCH '
2820: 66 69 76 65 27 22 0a 20 20 20 20 20 20 33 20 20  five'".      3  
2830: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
2840: 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43   t1 WHERE a MATC
2850: 48 20 27 66 69 76 65 27 22 0a 20 20 20 20 20 20  H 'five'".      
2860: 34 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66 66  4    "SELECT off
2870: 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74 31  sets(t1) FROM t1
2880: 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
2890: 27 6a 6b 27 22 0a 20 20 20 20 20 20 35 20 20 20  'jk'".      5   
28a0: 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73   "SELECT offsets
28b0: 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45  (t1) FROM t1 WHE
28c0: 52 45 20 74 31 20 4d 41 54 43 48 20 27 74 75 67  RE t1 MATCH 'tug
28d0: 2a 20 4f 52 20 65 69 67 68 74 27 22 0a 0a 20 20  * OR eight'"..  
28e0: 20 20 20 20 36 20 20 20 20 22 53 45 4c 45 43 54      6    "SELECT
28f0: 20 6f 66 66 73 65 74 73 28 74 31 29 20 46 52 4f   offsets(t1) FRO
2900: 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
2910: 54 43 48 20 27 61 61 27 22 0a 20 20 20 20 20 20  TCH 'aa'".      
2920: 37 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66 66  7    "SELECT off
2930: 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74 31  sets(t1) FROM t1
2940: 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
2950: 27 34 34 27 22 0a 20 20 20 20 20 20 38 20 20 20  '44'".      8   
2960: 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73   "SELECT offsets
2970: 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45  (t1) FROM t1 WHE
2980: 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 2a 27  RE t1 MATCH 'a*'
2990: 22 0a 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20  ".    } {.      
29a0: 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70  do_test backcomp
29b0: 61 74 2d 33 2e 35 20 5b 6c 69 73 74 20 73 71 6c  at-3.5 [list sql
29c0: 31 20 24 71 5d 20 5b 73 71 6c 32 20 24 71 5d 0a  1 $q] [sql2 $q].
29d0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 5f 74 65      }..    do_te
29e0: 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e  st backcompat-3.
29f0: 36 20 7b 20 0a 20 20 20 20 20 20 73 71 6c 31 20  6 { .      sql1 
2a00: 22 53 45 4c 45 43 54 20 6f 70 74 69 6d 69 7a 65  "SELECT optimize
2a10: 28 74 31 29 20 46 52 4f 4d 20 74 31 20 4c 49 4d  (t1) FROM t1 LIM
2a20: 49 54 20 31 22 20 0a 20 20 20 20 7d 20 7b 7b 49  IT 1" .    } {{I
2a30: 6e 64 65 78 20 6f 70 74 69 6d 69 7a 65 64 7d 7d  ndex optimized}}
2a40: 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6e  ..    foreach {n
2a50: 20 71 7d 20 7b 0a 20 20 20 20 20 20 31 20 20 20   q} {.      1   
2a60: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2a70: 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62  t1 ORDER BY a, b
2a80: 22 0a 20 20 20 20 20 20 32 20 20 20 20 22 53 45  ".      2    "SE
2a90: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
2aa0: 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43 48  t1 WHERE a MATCH
2ab0: 20 27 66 69 76 65 27 22 0a 20 20 20 20 20 20 33   'five'".      3
2ac0: 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52      "SELECT * FR
2ad0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41  OM t1 WHERE a MA
2ae0: 54 43 48 20 27 66 69 76 65 27 22 0a 20 20 20 20  TCH 'five'".    
2af0: 20 20 34 20 20 20 20 22 53 45 4c 45 43 54 20 6f    4    "SELECT o
2b00: 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20  ffsets(t1) FROM 
2b10: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
2b20: 48 20 27 6a 6b 27 22 0a 20 20 20 20 20 20 35 20  H 'jk'".      5 
2b30: 20 20 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65     "SELECT offse
2b40: 74 73 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57  ts(t1) FROM t1 W
2b50: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 74  HERE t1 MATCH 't
2b60: 75 67 2a 20 4f 52 20 65 69 67 68 74 27 22 0a 0a  ug* OR eight'"..
2b70: 20 20 20 20 20 20 36 20 20 20 20 22 53 45 4c 45        6    "SELE
2b80: 43 54 20 6f 66 66 73 65 74 73 28 74 31 29 20 46  CT offsets(t1) F
2b90: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
2ba0: 4d 41 54 43 48 20 27 61 61 27 22 0a 20 20 20 20  MATCH 'aa'".    
2bb0: 20 20 37 20 20 20 20 22 53 45 4c 45 43 54 20 6f    7    "SELECT o
2bc0: 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20  ffsets(t1) FROM 
2bd0: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
2be0: 48 20 27 34 34 27 22 0a 20 20 20 20 20 20 38 20  H '44'".      8 
2bf0: 20 20 20 22 53 45 4c 45 43 54 20 6f 66 66 73 65     "SELECT offse
2c00: 74 73 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57  ts(t1) FROM t1 W
2c10: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61  HERE t1 MATCH 'a
2c20: 2a 27 22 0a 20 20 20 20 7d 20 7b 0a 20 20 20 20  *'".    } {.    
2c30: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f    do_test backco
2c40: 6d 70 61 74 2d 33 2e 37 20 5b 6c 69 73 74 20 73  mpat-3.7 [list s
2c50: 71 6c 31 20 24 71 5d 20 5b 73 71 6c 32 20 24 71  ql1 $q] [sql2 $q
2c60: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ].    }.  }.}..#
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2cc0: 20 74 68 61 74 20 52 74 72 65 65 20 74 61 62 6c   that Rtree tabl
2cd0: 65 73 20 6d 61 79 20 62 65 20 72 65 61 64 2f 77  es may be read/w
2ce0: 72 69 74 74 65 6e 20 62 79 20 64 69 66 66 65 72  ritten by differ
2cf0: 65 6e 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ent versions of 
2d00: 0a 23 20 53 51 4c 69 74 65 2e 20 0a 23 0a 73 65  .# SQLite. .#.se
2d10: 74 20 63 6f 6e 74 65 6e 74 73 20 7b 0a 20 20 43  t contents {.  C
2d20: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
2d30: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72  BLE t1 USING rtr
2d40: 65 65 28 69 64 2c 20 78 31 2c 20 78 32 2c 20 79  ee(id, x1, x2, y
2d50: 31 2c 20 79 32 29 3b 0a 7d 0a 66 6f 72 65 61 63  1, y2);.}.foreac
2d60: 68 20 7b 69 64 20 78 31 20 78 32 20 79 31 20 79  h {id x1 x2 y1 y
2d70: 32 7d 20 7b 0a 20 20 31 20 20 20 20 2d 34 37 2e  2} {.  1    -47.
2d80: 36 34 20 34 33 2e 38 37 20 20 20 20 33 33 2e 38  64 43.87    33.8
2d90: 36 20 33 34 2e 34 32 20 20 20 20 20 20 20 20 32  6 34.42        2
2da0: 20 20 20 20 2d 32 31 2e 35 31 20 31 37 2e 33 32      -21.51 17.32
2db0: 20 20 20 20 32 2e 30 35 20 33 31 2e 30 34 0a 20      2.05 31.04. 
2dc0: 20 33 20 20 20 20 2d 34 33 2e 36 37 20 2d 33 38   3    -43.67 -38
2dd0: 2e 33 33 20 20 20 20 2d 31 39 2e 37 39 20 33 2e  .33    -19.79 3.
2de0: 34 33 20 20 20 20 20 20 20 34 20 20 20 20 33 32  43       4    32
2df0: 2e 34 31 20 33 35 2e 31 36 20 20 20 20 39 2e 31  .41 35.16    9.1
2e00: 32 20 31 39 2e 38 32 0a 20 20 35 20 20 20 20 33  2 19.82.  5    3
2e10: 33 2e 32 38 20 33 34 2e 38 37 20 20 20 20 31 34  3.28 34.87    14
2e20: 2e 37 38 20 32 38 2e 32 36 20 20 20 20 20 20 20  .78 28.26       
2e30: 20 20 36 20 20 20 20 34 39 2e 33 31 20 31 31 36    6    49.31 116
2e40: 2e 35 39 20 20 20 20 2d 39 2e 38 37 20 37 35 2e  .59    -9.87 75.
2e50: 30 39 0a 20 20 37 20 20 20 20 2d 31 34 2e 39 33  09.  7    -14.93
2e60: 20 33 34 2e 35 31 20 20 20 20 2d 31 37 2e 36 34   34.51    -17.64
2e70: 20 36 34 2e 30 39 20 20 20 20 20 20 20 38 20 20   64.09       8  
2e80: 20 20 2d 34 33 2e 30 35 20 32 33 2e 34 33 20 20    -43.05 23.43  
2e90: 20 20 2d 31 2e 31 39 20 36 39 2e 34 34 0a 20 20    -1.19 69.44.  
2ea0: 39 20 20 20 20 34 34 2e 37 39 20 31 33 33 2e 35  9    44.79 133.5
2eb0: 36 20 20 20 20 32 38 2e 30 39 20 38 30 2e 33 30  6    28.09 80.30
2ec0: 20 20 20 20 20 20 20 20 31 30 20 20 20 20 2d 32          10    -2
2ed0: 2e 36 36 20 38 31 2e 34 37 20 20 20 20 2d 34 31  .66 81.47    -41
2ee0: 2e 33 38 20 2d 31 30 2e 34 36 0a 20 20 31 31 20  .38 -10.46.  11 
2ef0: 20 20 20 2d 34 32 2e 38 39 20 2d 33 2e 35 34 20     -42.89 -3.54 
2f00: 20 20 20 31 35 2e 37 36 20 37 31 2e 36 33 20 20     15.76 71.63  
2f10: 20 20 20 20 20 31 32 20 20 20 20 2d 33 2e 35 30       12    -3.50
2f20: 20 38 34 2e 39 36 20 20 20 20 2d 31 31 2e 36 34   84.96    -11.64
2f30: 20 36 34 2e 39 35 0a 20 20 31 33 20 20 20 20 2d   64.95.  13    -
2f40: 34 35 2e 36 39 20 32 36 2e 32 35 20 20 20 20 31  45.69 26.25    1
2f50: 31 2e 31 34 20 35 35 2e 30 36 20 20 20 20 20 20  1.14 55.06      
2f60: 20 31 34 20 20 20 20 2d 34 34 2e 30 39 20 31 31   14    -44.09 11
2f70: 2e 32 33 20 20 20 20 31 37 2e 35 32 20 34 34 2e  .23    17.52 44.
2f80: 34 35 0a 20 20 31 35 20 20 20 20 33 36 2e 32 33  45.  15    36.23
2f90: 20 31 33 33 2e 34 39 20 20 20 20 2d 31 39 2e 33   133.49    -19.3
2fa0: 38 20 35 33 2e 36 37 20 20 20 20 20 20 31 36 20  8 53.67      16 
2fb0: 20 20 20 2d 31 37 2e 38 39 20 38 31 2e 35 34 20     -17.89 81.54 
2fc0: 20 20 20 31 34 2e 36 34 20 35 30 2e 36 31 0a 20     14.64 50.61. 
2fd0: 20 31 37 20 20 20 20 2d 34 31 2e 39 37 20 2d 32   17    -41.97 -2
2fe0: 34 2e 30 34 20 20 20 20 2d 33 39 2e 34 33 20 32  4.04    -39.43 2
2ff0: 38 2e 39 35 20 20 20 20 20 31 38 20 20 20 20 2d  8.95     18    -
3000: 35 2e 38 35 20 37 2e 37 36 20 20 20 20 2d 36 2e  5.85 7.76    -6.
3010: 33 38 20 34 37 2e 30 32 0a 20 20 31 39 20 20 20  38 47.02.  19   
3020: 20 31 38 2e 38 32 20 32 37 2e 31 30 20 20 20 20   18.82 27.10    
3030: 34 32 2e 38 32 20 31 30 30 2e 30 39 20 20 20 20  42.82 100.09    
3040: 20 20 20 32 30 20 20 20 20 33 39 2e 31 37 20 31     20    39.17 1
3050: 31 33 2e 34 35 20 20 20 20 32 36 2e 31 34 20 37  13.45    26.14 7
3060: 33 2e 34 37 0a 20 20 32 31 20 20 20 20 32 32 2e  3.47.  21    22.
3070: 33 31 20 31 30 33 2e 31 37 20 20 20 20 34 39 2e  31 103.17    49.
3080: 39 32 20 31 30 36 2e 30 35 20 20 20 20 20 20 32  92 106.05      2
3090: 32 20 20 20 20 2d 34 33 2e 30 36 20 34 30 2e 33  2    -43.06 40.3
30a0: 38 20 20 20 20 2d 31 2e 37 35 20 37 36 2e 30 38  8    -1.75 76.08
30b0: 0a 20 20 32 33 20 20 20 20 32 2e 34 33 20 35 37  .  23    2.43 57
30c0: 2e 32 37 20 20 20 20 2d 31 34 2e 31 39 20 2d 33  .27    -14.19 -3
30d0: 2e 38 33 20 20 20 20 20 20 20 20 32 34 20 20 20  .83        24   
30e0: 20 2d 34 37 2e 35 37 20 2d 34 2e 33 35 20 20 20   -47.57 -4.35   
30f0: 20 38 2e 39 33 20 31 30 30 2e 30 36 0a 20 20 32   8.93 100.06.  2
3100: 35 20 20 20 20 2d 33 37 2e 34 37 20 34 39 2e 31  5    -37.47 49.1
3110: 34 20 20 20 20 2d 32 39 2e 31 31 20 38 2e 38 31  4    -29.11 8.81
3120: 20 20 20 20 20 20 20 32 36 20 20 20 20 2d 37 2e         26    -7.
3130: 38 36 20 37 35 2e 37 32 20 20 20 20 34 39 2e 33  86 75.72    49.3
3140: 34 20 31 30 37 2e 34 32 0a 20 20 32 37 20 20 20  4 107.42.  27   
3150: 20 31 2e 35 33 20 34 35 2e 34 39 20 20 20 20 32   1.53 45.49    2
3160: 30 2e 33 36 20 34 39 2e 37 34 20 20 20 20 20 20  0.36 49.74      
3170: 20 20 20 32 38 20 20 20 20 2d 34 38 2e 34 38 20     28    -48.48 
3180: 33 32 2e 35 34 20 20 20 20 32 38 2e 38 31 20 35  32.54    28.81 5
3190: 34 2e 34 35 0a 20 20 32 39 20 20 20 20 32 2e 36  4.45.  29    2.6
31a0: 37 20 33 39 2e 37 37 20 20 20 20 2d 34 2e 30 35  7 39.77    -4.05
31b0: 20 31 33 2e 36 37 20 20 20 20 20 20 20 20 20 33   13.67         3
31c0: 30 20 20 20 20 34 2e 31 31 20 36 32 2e 38 38 20  0    4.11 62.88 
31d0: 20 20 20 2d 34 37 2e 34 34 20 2d 35 2e 37 32 0a     -47.44 -5.72.
31e0: 20 20 33 31 20 20 20 20 2d 32 31 2e 34 37 20 35    31    -21.47 5
31f0: 31 2e 37 35 20 20 20 20 33 37 2e 32 35 20 31 31  1.75    37.25 11
3200: 36 2e 30 39 20 20 20 20 20 20 33 32 20 20 20 20  6.09      32    
3210: 34 35 2e 35 39 20 31 31 31 2e 33 37 20 20 20 20  45.59 111.37    
3220: 2d 36 2e 34 33 20 34 33 2e 36 34 0a 20 20 33 33  -6.43 43.64.  33
3230: 20 20 20 20 33 35 2e 32 33 20 34 38 2e 32 39 20      35.23 48.29 
3240: 20 20 20 32 33 2e 35 34 20 31 31 33 2e 33 33 20     23.54 113.33 
3250: 20 20 20 20 20 20 33 34 20 20 20 20 31 36 2e 36        34    16.6
3260: 31 20 36 38 2e 33 35 20 20 20 20 2d 31 34 2e 36  1 68.35    -14.6
3270: 39 20 36 35 2e 39 37 0a 20 20 33 35 20 20 20 20  9 65.97.  35    
3280: 31 33 2e 39 38 20 31 36 2e 36 30 20 20 20 20 34  13.98 16.60    4
3290: 38 2e 36 36 20 31 30 32 2e 38 37 20 20 20 20 20  8.66 102.87     
32a0: 20 20 33 36 20 20 20 20 31 39 2e 37 34 20 32 33    36    19.74 23
32b0: 2e 38 34 20 20 20 20 33 31 2e 31 35 20 37 37 2e  .84    31.15 77.
32c0: 32 37 0a 20 20 33 37 20 20 20 20 2d 32 37 2e 36  27.  37    -27.6
32d0: 31 20 32 34 2e 34 33 20 20 20 20 37 2e 39 36 20  1 24.43    7.96 
32e0: 39 34 2e 39 31 20 20 20 20 20 20 20 20 33 38 20  94.91        38 
32f0: 20 20 20 2d 33 34 2e 37 37 20 31 32 2e 30 35 20     -34.77 12.05 
3300: 20 20 20 2d 32 32 2e 36 30 20 2d 36 2e 32 39 0a     -22.60 -6.29.
3310: 20 20 33 39 20 20 20 20 2d 32 35 2e 38 33 20 38    39    -25.83 8
3320: 2e 37 31 20 20 20 20 2d 31 33 2e 34 38 20 2d 31  .71    -13.48 -1
3330: 32 2e 35 33 20 20 20 20 20 20 34 30 20 20 20 20  2.53      40    
3340: 2d 31 37 2e 31 31 20 2d 31 2e 30 31 20 20 20 20  -17.11 -1.01    
3350: 31 38 2e 30 36 20 36 37 2e 38 39 0a 20 20 34 31  18.06 67.89.  41
3360: 20 20 20 20 31 34 2e 31 33 20 37 31 2e 37 32 20      14.13 71.72 
3370: 20 20 20 2d 33 2e 37 38 20 33 39 2e 32 35 20 20     -3.78 39.25  
3380: 20 20 20 20 20 20 34 32 20 20 20 20 32 33 2e 37        42    23.7
3390: 35 20 37 36 2e 30 30 20 20 20 20 2d 31 36 2e 33  5 76.00    -16.3
33a0: 30 20 38 2e 32 33 0a 20 20 34 33 20 20 20 20 2d  0 8.23.  43    -
33b0: 33 39 2e 31 35 20 32 38 2e 36 33 20 20 20 20 33  39.15 28.63    3
33c0: 38 2e 31 32 20 31 32 35 2e 38 38 20 20 20 20 20  8.12 125.88     
33d0: 20 34 34 20 20 20 20 34 38 2e 36 32 20 38 36 2e   44    48.62 86.
33e0: 30 39 20 20 20 20 33 36 2e 34 39 20 31 30 32 2e  09    36.49 102.
33f0: 39 35 0a 20 20 34 35 20 20 20 20 2d 33 31 2e 33  95.  45    -31.3
3400: 39 20 2d 32 31 2e 39 38 20 20 20 20 32 2e 35 32  9 -21.98    2.52
3410: 20 38 39 2e 37 38 20 20 20 20 20 20 20 34 36 20   89.78       46 
3420: 20 20 20 35 2e 36 35 20 35 36 2e 30 34 20 20 20     5.65 56.04   
3430: 20 31 35 2e 39 34 20 38 39 2e 31 30 0a 20 20 34   15.94 89.10.  4
3440: 37 20 20 20 20 31 38 2e 32 38 20 39 35 2e 38 31  7    18.28 95.81
3450: 20 20 20 20 34 36 2e 34 36 20 31 34 33 2e 30 38      46.46 143.08
3460: 20 20 20 20 20 20 20 34 38 20 20 20 20 33 30 2e         48    30.
3470: 39 33 20 31 30 32 2e 38 32 20 20 20 20 2d 32 30  93 102.82    -20
3480: 2e 30 38 20 33 37 2e 33 36 0a 20 20 34 39 20 20  .08 37.36.  49  
3490: 20 20 2d 32 30 2e 37 38 20 2d 33 2e 34 38 20 20    -20.78 -3.48  
34a0: 20 20 2d 35 2e 35 38 20 33 35 2e 34 36 20 20 20    -5.58 35.46   
34b0: 20 20 20 20 35 30 20 20 20 20 34 39 2e 38 35 20      50    49.85 
34c0: 39 30 2e 35 38 20 20 20 20 2d 32 34 2e 34 38 20  90.58    -24.48 
34d0: 34 36 2e 32 39 0a 7d 20 7b 0a 69 66 20 7b 24 78  46.29.} {.if {$x
34e0: 31 20 3e 3d 20 24 78 32 20 7c 7c 20 24 79 31 20  1 >= $x2 || $y1 
34f0: 3e 3d 20 24 79 32 7d 20 7b 20 65 72 72 6f 72 20  >= $y2} { error 
3500: 22 24 78 31 20 24 78 32 20 24 79 31 20 24 79 32  "$x1 $x2 $y1 $y2
3510: 22 20 7d 0a 20 20 61 70 70 65 6e 64 20 63 6f 6e  " }.  append con
3520: 74 65 6e 74 73 20 22 49 4e 53 45 52 54 20 49 4e  tents "INSERT IN
3530: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 64  TO t1 VALUES($id
3540: 2c 20 24 78 31 2c 20 24 78 32 2c 20 24 79 31 2c  , $x1, $x2, $y1,
3550: 20 24 79 32 29 3b 22 0a 7d 0a 73 65 74 20 71 75   $y2);".}.set qu
3560: 65 72 69 65 73 20 7b 0a 20 20 31 20 20 20 20 22  eries {.  1    "
3570: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74  SELECT id FROM t
3580: 31 20 57 48 45 52 45 20 78 31 3e 31 30 20 41 4e  1 WHERE x1>10 AN
3590: 44 20 78 32 3c 34 34 22 0a 20 20 32 20 20 20 20  D x2<44".  2    
35a0: 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  "SELECT id FROM 
35b0: 74 31 20 57 48 45 52 45 20 79 31 3c 31 30 30 22  t1 WHERE y1<100"
35c0: 0a 20 20 33 20 20 20 20 22 53 45 4c 45 43 54 20  .  3    "SELECT 
35d0: 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  id FROM t1 WHERE
35e0: 20 79 31 3c 31 30 30 20 41 4e 44 20 78 31 3e 30   y1<100 AND x1>0
35f0: 22 0a 20 20 34 20 20 20 20 22 53 45 4c 45 43 54  ".  4    "SELECT
3600: 20 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52   id FROM t1 WHER
3610: 45 20 79 31 3e 31 30 20 41 4e 44 20 78 31 3e 30  E y1>10 AND x1>0
3620: 20 41 4e 44 20 78 32 3c 35 30 20 41 4e 44 20 79   AND x2<50 AND y
3630: 32 3c 35 35 30 22 0a 7d 0a 64 6f 5f 61 6c 6c 62  2<550".}.do_allb
3640: 61 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b  ackcompat_test {
3650: 0a 20 20 69 66 20 7b 5b 63 6f 64 65 31 20 7b 73  .  if {[code1 {s
3660: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69  et ::sqlite_opti
3670: 6f 6e 73 28 66 74 73 33 29 7d 5d 0a 20 20 20 26  ons(fts3)}].   &
3680: 26 20 5b 63 6f 64 65 32 20 7b 73 65 74 20 3a 3a  & [code2 {set ::
3690: 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 66  sqlite_options(f
36a0: 74 73 33 29 7d 5d 0a 20 20 7d 20 7b 0a 0a 20 20  ts3)}].  } {..  
36b0: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f    do_test backco
36c0: 6d 70 61 74 2d 34 2e 31 20 7b 20 73 71 6c 31 20  mpat-4.1 { sql1 
36d0: 24 63 6f 6e 74 65 6e 74 73 20 7d 20 7b 7d 0a 0a  $contents } {}..
36e0: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71      foreach {n q
36f0: 7d 20 24 3a 3a 71 75 65 72 69 65 73 20 7b 0a 20  } $::queries {. 
3700: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63       do_test bac
3710: 6b 63 6f 6d 70 61 74 2d 34 2e 32 2e 24 6e 20 5b  kcompat-4.2.$n [
3720: 6c 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73  list sql1 $q] [s
3730: 71 6c 32 20 24 71 5d 0a 20 20 20 20 7d 0a 0a 20  ql2 $q].    }.. 
3740: 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63     do_test backc
3750: 6f 6d 70 61 74 2d 34 2e 33 20 7b 20 73 71 6c 31  ompat-4.3 { sql1
3760: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
3770: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 69  INTO t1 SELECT i
3780: 64 2b 31 30 30 2c 20 78 31 2b 31 30 2e 30 2c 20  d+100, x1+10.0, 
3790: 78 32 2b 31 30 2e 30 2c 20 79 31 2d 31 30 2e 30  x2+10.0, y1-10.0
37a0: 2c 20 79 32 2d 31 30 2e 30 20 46 52 4f 4d 20 74  , y2-10.0 FROM t
37b0: 31 3b 0a 20 20 20 20 7d 20 7d 20 7b 7d 0a 0a 20  1;.    } } {}.. 
37c0: 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d     foreach {n q}
37d0: 20 24 3a 3a 71 75 65 72 69 65 73 20 7b 0a 20 20   $::queries {.  
37e0: 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b      do_test back
37f0: 63 6f 6d 70 61 74 2d 34 2e 34 2e 24 6e 20 5b 6c  compat-4.4.$n [l
3800: 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73 71  ist sql1 $q] [sq
3810: 6c 32 20 24 71 5d 0a 20 20 20 20 7d 0a 0a 20 20  l2 $q].    }..  
3820: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f    do_test backco
3830: 6d 70 61 74 2d 34 2e 35 20 7b 20 73 71 6c 32 20  mpat-4.5 { sql2 
3840: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
3850: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 69 64  NTO t1 SELECT id
3860: 2b 32 30 30 2c 20 78 31 2b 32 30 2e 30 2c 20 78  +200, x1+20.0, x
3870: 32 2b 32 30 2e 30 2c 20 79 31 2d 32 30 2e 30 2c  2+20.0, y1-20.0,
3880: 20 79 32 2d 32 30 2e 30 20 46 52 4f 4d 20 74 31   y2-20.0 FROM t1
3890: 3b 0a 20 20 20 20 7d 20 7d 20 7b 7d 0a 0a 20 20  ;.    } } {}..  
38a0: 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20    foreach {n q} 
38b0: 24 3a 3a 71 75 65 72 69 65 73 20 7b 0a 20 20 20  $::queries {.   
38c0: 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63     do_test backc
38d0: 6f 6d 70 61 74 2d 34 2e 36 2e 24 6e 20 5b 6c 69  ompat-4.6.$n [li
38e0: 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73 71 6c  st sql1 $q] [sql
38f0: 32 20 24 71 5d 0a 20 20 20 20 7d 0a 0a 20 20 7d  2 $q].    }..  }
3900: 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  .}..finish_test.