/ Hex Artifact Content
Login

Artifact 19a1f337c68419b020a7481dd272a472c4ad8ef4:


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 66 6f 72 65 61 63 68 20 63  b }..  foreach c
07d0: 20 7b 63 6f 64 65 31 20 63 6f 64 65 32 7d 20 7b   {code1 code2} {
07e0: 0a 20 20 20 20 24 63 20 7b 0a 20 20 20 20 20 20  .    $c {.      
07f0: 73 65 74 20 76 20 5b 73 70 6c 69 74 20 5b 64 62  set v [split [db
0800: 20 76 65 72 73 69 6f 6e 5d 20 2e 5d 0a 20 20 20   version] .].   
0810: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
0820: 24 76 5d 3d 3d 33 7d 20 7b 6c 61 70 70 65 6e 64  $v]==3} {lappend
0830: 20 76 20 30 7d 0a 20 20 20 20 20 20 73 65 74 20   v 0}.      set 
0840: 3a 3a 73 71 6c 69 74 65 5f 6c 69 62 76 65 72 73  ::sqlite_libvers
0850: 69 6f 6e 20 5b 66 6f 72 6d 61 74 20 5c 0a 20 20  ion [format \.  
0860: 20 20 20 20 20 20 22 25 64 25 2e 32 64 25 2e 32        "%d%.2d%.2
0870: 64 25 32 64 22 20 5b 6c 69 6e 64 65 78 20 24 76  d%2d" [lindex $v
0880: 20 30 5d 20 5b 6c 69 6e 64 65 78 20 24 76 20 31   0] [lindex $v 1
0890: 5d 20 5b 6c 69 6e 64 65 78 20 24 76 20 32 5d 20  ] [lindex $v 2] 
08a0: 5b 6c 69 6e 64 65 78 20 24 76 20 33 5d 0a 20 20  [lindex $v 3].  
08b0: 20 20 20 20 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a      ].    }.  }.
08c0: 0a 20 20 75 70 6c 65 76 65 6c 20 24 73 63 72 69  .  uplevel $scri
08d0: 70 74 0a 0a 20 20 63 61 74 63 68 20 7b 20 63 6f  pt..  catch { co
08e0: 64 65 31 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  de1 { db close }
08f0: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f 64   }.  catch { cod
0900: 65 32 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 20  e2 { db close } 
0910: 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c 6f 73  }.  catch { clos
0920: 65 20 24 3a 3a 62 63 5f 63 68 61 6e 32 20 7d 0a  e $::bc_chan2 }.
0930: 20 20 63 61 74 63 68 20 7b 20 63 6c 6f 73 65 20    catch { close 
0940: 24 3a 3a 62 63 5f 63 68 61 6e 31 20 7d 0a 0a 0a  $::bc_chan1 }...
0950: 7d 0a 0a 61 72 72 61 79 20 73 65 74 20 3a 3a 69  }..array set ::i
0960: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 5b 6c 69 73  ncompatible [lis
0970: 74 5d 0a 70 72 6f 63 20 64 6f 5f 61 6c 6c 62 61  t].proc do_allba
0980: 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b 73  ckcompat_test {s
0990: 63 72 69 70 74 7d 20 7b 0a 0a 20 20 66 6f 72 65  cript} {..  fore
09a0: 61 63 68 20 62 69 6e 20 24 3a 3a 42 43 28 62 69  ach bin $::BC(bi
09b0: 6e 61 72 69 65 73 29 20 7b 0a 20 20 20 20 73 65  naries) {.    se
09c0: 74 20 6e 45 72 72 20 5b 73 65 74 5f 74 65 73 74  t nErr [set_test
09d0: 5f 63 6f 75 6e 74 65 72 20 65 72 72 6f 72 73 5d  _counter errors]
09e0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72  .    foreach dir
09f0: 20 7b 30 20 31 7d 20 7b 0a 0a 20 20 20 20 20 20   {0 1} {..      
0a00: 73 65 74 20 62 69 6e 74 61 67 20 5b 73 74 72 69  set bintag [stri
0a10: 6e 67 20 6d 61 70 20 7b 74 65 73 74 66 69 78 74  ng map {testfixt
0a20: 75 72 65 20 7b 7d 7d 20 24 62 69 6e 5d 0a 20 20  ure {}} $bin].  
0a30: 20 20 20 20 73 65 74 20 62 69 6e 74 61 67 20 5b      set bintag [
0a40: 73 74 72 69 6e 67 20 6d 61 70 20 7b 5c 2e 65 78  string map {\.ex
0a50: 65 20 7b 7d 7d 20 24 62 69 6e 74 61 67 5d 0a 20  e {}} $bintag]. 
0a60: 20 20 20 20 20 69 66 20 7b 24 62 69 6e 74 61 67       if {$bintag
0a70: 20 3d 3d 20 22 22 7d 20 7b 73 65 74 20 62 69 6e   == ""} {set bin
0a80: 74 61 67 20 73 65 6c 66 7d 0a 20 20 20 20 20 20  tag self}.      
0a90: 73 65 74 20 3a 3a 62 63 6e 61 6d 65 20 22 2e 24  set ::bcname ".$
0aa0: 62 69 6e 74 61 67 2e 24 64 69 72 2e 22 0a 0a 20  bintag.$dir.".. 
0ab0: 20 20 20 20 20 72 65 6e 61 6d 65 20 64 6f 5f 74       rename do_t
0ac0: 65 73 74 20 5f 64 6f 5f 74 65 73 74 0a 20 20 20  est _do_test.   
0ad0: 20 20 20 70 72 6f 63 20 64 6f 5f 74 65 73 74 20     proc do_test 
0ae0: 7b 6e 6d 20 73 71 6c 20 72 65 73 7d 20 7b 0a 20  {nm sql res} {. 
0af0: 20 20 20 20 20 20 20 73 65 74 20 6e 6d 20 5b 72         set nm [r
0b00: 65 67 73 75 62 20 7b 5c 2e 7d 20 24 6e 6d 20 24  egsub {\.} $nm $
0b10: 3a 3a 62 63 6e 61 6d 65 5d 0a 20 20 20 20 20 20  ::bcname].      
0b20: 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20    uplevel [list 
0b30: 5f 64 6f 5f 74 65 73 74 20 24 6e 6d 20 24 73 71  _do_test $nm $sq
0b40: 6c 20 24 72 65 73 5d 0a 20 20 20 20 20 20 7d 0a  l $res].      }.
0b50: 0a 20 20 20 20 20 20 64 6f 5f 62 61 63 6b 63 6f  .      do_backco
0b60: 6d 70 61 74 5f 74 65 73 74 20 24 64 69 72 20 7b  mpat_test $dir {
0b70: 7d 20 24 62 69 6e 20 24 73 63 72 69 70 74 0a 0a  } $bin $script..
0b80: 20 20 20 20 20 20 72 65 6e 61 6d 65 20 64 6f 5f        rename do_
0b90: 74 65 73 74 20 7b 7d 0a 20 20 20 20 20 20 72 65  test {}.      re
0ba0: 6e 61 6d 65 20 5f 64 6f 5f 74 65 73 74 20 64 6f  name _do_test do
0bb0: 5f 74 65 73 74 0a 20 20 20 20 7d 0a 20 20 20 20  _test.    }.    
0bc0: 69 66 20 7b 20 24 6e 45 72 72 20 3c 20 5b 73 65  if { $nErr < [se
0bd0: 74 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 65  t_test_counter e
0be0: 72 72 6f 72 73 5d 20 7d 20 7b 0a 20 20 20 20 20  rrors] } {.     
0bf0: 20 73 65 74 20 3a 3a 69 6e 63 6f 6d 70 61 74 69   set ::incompati
0c00: 62 6c 65 28 5b 67 65 74 5f 76 65 72 73 69 6f 6e  ble([get_version
0c10: 20 24 62 69 6e 5d 29 20 31 0a 20 20 20 20 7d 0a   $bin]) 1.    }.
0c20: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 72 65 61 64    }.}..proc read
0c30: 5f 66 69 6c 65 20 7b 7a 46 69 6c 65 7d 20 7b 0a  _file {zFile} {.
0c40: 20 20 73 65 74 20 7a 44 61 74 61 20 7b 7d 0a 20    set zData {}. 
0c50: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
0c60: 73 20 24 7a 46 69 6c 65 5d 7d 20 7b 0a 20 20 20  s $zFile]} {.   
0c70: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 7a   set fd [open $z
0c80: 46 69 6c 65 5d 0a 20 20 20 20 66 63 6f 6e 66 69  File].    fconfi
0c90: 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73 6c  gure $fd -transl
0ca0: 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65 6e  ation binary -en
0cb0: 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 0a 20  coding binary.. 
0cc0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 73 69 7a     if {[file siz
0cd0: 65 20 24 7a 46 69 6c 65 5d 3c 3d 24 3a 3a 73 71  e $zFile]<=$::sq
0ce0: 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f 62 79 74  lite_pending_byt
0cf0: 65 20 7c 7c 20 24 7a 46 69 6c 65 20 21 3d 20 22  e || $zFile != "
0d00: 74 65 73 74 2e 64 62 22 7d 20 7b 0a 20 20 20 20  test.db"} {.    
0d10: 20 20 73 65 74 20 7a 44 61 74 61 20 5b 72 65 61    set zData [rea
0d20: 64 20 24 66 64 5d 0a 20 20 20 20 7d 20 65 6c 73  d $fd].    } els
0d30: 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 7a 44  e {.      set zD
0d40: 61 74 61 20 5b 72 65 61 64 20 24 66 64 20 24 3a  ata [read $fd $:
0d50: 3a 73 71 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f  :sqlite_pending_
0d60: 62 79 74 65 5d 0a 20 20 20 20 20 20 61 70 70 65  byte].      appe
0d70: 6e 64 20 7a 44 61 74 61 20 5b 73 74 72 69 6e 67  nd zData [string
0d80: 20 72 65 70 65 61 74 20 78 20 35 31 32 5d 0a 20   repeat x 512]. 
0d90: 20 20 20 20 20 73 65 65 6b 20 24 66 64 20 5b 65       seek $fd [e
0da0: 78 70 72 20 24 3a 3a 73 71 6c 69 74 65 5f 70 65  xpr $::sqlite_pe
0db0: 6e 64 69 6e 67 5f 62 79 74 65 2b 35 31 32 5d 20  nding_byte+512] 
0dc0: 73 74 61 72 74 0a 20 20 20 20 20 20 61 70 70 65  start.      appe
0dd0: 6e 64 20 7a 44 61 74 61 20 5b 72 65 61 64 20 24  nd zData [read $
0de0: 66 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  fd].    }..    c
0df0: 6c 6f 73 65 20 24 66 64 0a 20 20 7d 0a 20 20 72  lose $fd.  }.  r
0e00: 65 74 75 72 6e 20 24 7a 44 61 74 61 0a 7d 0a 70  eturn $zData.}.p
0e10: 72 6f 63 20 77 72 69 74 65 5f 66 69 6c 65 20 7b  roc write_file {
0e20: 7a 46 69 6c 65 20 7a 44 61 74 61 7d 20 7b 0a 20  zFile zData} {. 
0e30: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 7a   set fd [open $z
0e40: 46 69 6c 65 20 77 5d 0a 20 20 66 63 6f 6e 66 69  File w].  fconfi
0e50: 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73 6c  gure $fd -transl
0e60: 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65 6e  ation binary -en
0e70: 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 20 20  coding binary.  
0e80: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
0e90: 24 66 64 20 24 7a 44 61 74 61 0a 20 20 63 6c 6f  $fd $zData.  clo
0ea0: 73 65 20 24 66 64 0a 7d 0a 70 72 6f 63 20 72 65  se $fd.}.proc re
0eb0: 61 64 5f 66 69 6c 65 5f 73 79 73 74 65 6d 20 7b  ad_file_system {
0ec0: 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20 5b 6c  } {.  set ret [l
0ed0: 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 66  ist].  foreach f
0ee0: 20 7b 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64   {test.db test.d
0ef0: 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  b-journal test.d
0f00: 62 2d 77 61 6c 7d 20 7b 20 6c 61 70 70 65 6e 64  b-wal} { lappend
0f10: 20 72 65 74 20 5b 72 65 61 64 5f 66 69 6c 65 20   ret [read_file 
0f20: 24 66 5d 20 7d 0a 20 20 73 65 74 20 72 65 74 0a  $f] }.  set ret.
0f30: 7d 0a 70 72 6f 63 20 77 72 69 74 65 5f 66 69 6c  }.proc write_fil
0f40: 65 5f 73 79 73 74 65 6d 20 7b 64 61 74 61 7d 20  e_system {data} 
0f50: 7b 0a 20 20 66 6f 72 65 61 63 68 20 66 20 7b 74  {.  foreach f {t
0f60: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a  est.db test.db-j
0f70: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 2d 77  ournal test.db-w
0f80: 61 6c 7d 20 64 20 24 64 61 74 61 20 7b 20 0a 20  al} d $data { . 
0f90: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
0fa0: 65 6e 67 74 68 20 24 64 5d 20 3d 3d 20 30 7d 20  ength $d] == 0} 
0fb0: 7b 0a 20 20 20 20 20 20 66 6f 72 63 65 64 65 6c  {.      forcedel
0fc0: 65 74 65 20 24 66 0a 20 20 20 20 7d 20 65 6c 73  ete $f.    } els
0fd0: 65 20 7b 0a 20 20 20 20 20 20 77 72 69 74 65 5f  e {.      write_
0fe0: 66 69 6c 65 20 24 66 20 24 64 0a 20 20 20 20 7d  file $f $d.    }
0ff0: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 0a 23 20 41 63 74 75 61 6c 20 74 65 73 74  --.# Actual test
1050: 73 20 62 65 67 69 6e 20 68 65 72 65 2e 0a 23 0a  s begin here..#.
1060: 23 20 54 68 69 73 20 66 69 72 73 74 20 62 6c 6f  # This first blo
1070: 63 6b 20 6f 66 20 74 65 73 74 73 20 63 68 65 63  ck of tests chec
1080: 6b 73 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ks to see that t
1090: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10a0: 20 61 6e 64 20 0a 23 20 6a 6f 75 72 6e 61 6c 20   and .# journal 
10b0: 66 69 6c 65 73 20 63 61 6e 20 62 65 20 75 73 65  files can be use
10c0: 64 20 62 79 20 6f 6c 64 20 61 6e 64 20 6e 65 77  d by old and new
10d0: 20 76 65 72 73 69 6f 6e 73 2e 20 57 41 4c 20 61   versions. WAL a
10e0: 6e 64 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20 66  nd wal-index.# f
10f0: 69 6c 65 73 20 61 72 65 20 74 65 73 74 65 64 20  iles are tested 
1100: 73 65 70 61 72 61 74 65 6c 79 20 62 65 6c 6f 77  separately below
1110: 2e 0a 23 0a 64 6f 5f 61 6c 6c 62 61 63 6b 63 6f  ..#.do_allbackco
1120: 6d 70 61 74 5f 74 65 73 74 20 7b 0a 0a 20 20 23  mpat_test {..  #
1130: 20 54 65 73 74 20 74 68 61 74 20 64 61 74 61 62   Test that datab
1140: 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 62 61  ase files are ba
1150: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1160: 6c 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  le..  #.  do_tes
1170: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 31  t backcompat-1.1
1180: 2e 31 20 7b 20 73 71 6c 31 20 7b 20 0a 20 20 20  .1 { sql1 { .   
1190: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
11a0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
11b0: 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 49  b UNIQUE);.    I
11c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11d0: 4c 55 45 53 28 27 61 62 63 27 2c 20 27 64 65 66  LUES('abc', 'def
11e0: 27 29 3b 0a 20 20 7d 20 7d 20 7b 7d 0a 20 20 64  ');.  } } {}.  d
11f0: 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61  o_test backcompa
1200: 74 2d 31 2e 31 2e 32 20 7b 20 73 71 6c 32 20 7b  t-1.1.2 { sql2 {
1210: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1220: 31 3b 20 7d 20 7d 20 7b 61 62 63 20 64 65 66 7d  1; } } {abc def}
1230: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63  .  do_test backc
1240: 6f 6d 70 61 74 2d 31 2e 31 2e 33 20 7b 20 73 71  ompat-1.1.3 { sq
1250: 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l2 { INSERT INTO
1260: 20 74 31 20 56 41 4c 55 45 53 28 27 67 68 69 27   t1 VALUES('ghi'
1270: 2c 20 27 6a 6b 6c 27 29 3b 20 7d 20 7d 20 7b 7d  , 'jkl'); } } {}
1280: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63  .  do_test backc
1290: 6f 6d 70 61 74 2d 31 2e 31 2e 34 20 7b 20 73 71  ompat-1.1.4 { sq
12a0: 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l1 { SELECT * FR
12b0: 4f 4d 20 74 31 3b 20 7d 20 7d 20 7b 61 62 63 20  OM t1; } } {abc 
12c0: 64 65 66 20 67 68 69 20 6a 6b 6c 7d 0a 20 20 64  def ghi jkl}.  d
12d0: 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61  o_test backcompa
12e0: 74 2d 31 2e 31 2e 35 20 7b 20 73 71 6c 31 20 7b  t-1.1.5 { sql1 {
12f0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
1300: 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d  y_check } } {ok}
1310: 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63  .  do_test backc
1320: 6f 6d 70 61 74 2d 31 2e 31 2e 36 20 7b 20 73 71  ompat-1.1.6 { sq
1330: 6c 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  l2 { PRAGMA inte
1340: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20  grity_check } } 
1350: 7b 6f 6b 7d 0a 0a 20 20 23 20 54 65 73 74 20 74  {ok}..  # Test t
1360: 68 61 74 20 6f 6e 65 20 76 65 72 73 69 6f 6e 20  hat one version 
1370: 63 61 6e 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20  can roll back a 
1380: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
1390: 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 20 20 23   left in the.  #
13a0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 62 79 20   file-system by 
13b0: 74 68 65 20 6f 74 68 65 72 20 76 65 72 73 69 6f  the other versio
13c0: 6e 2e 0a 20 20 23 0a 20 20 23 20 45 61 63 68 20  n..  #.  # Each 
13d0: 74 65 73 74 20 63 61 73 65 20 69 73 20 6e 61 6d  test case is nam
13e0: 65 64 20 22 62 61 63 6b 63 6f 6d 70 61 74 2d 31  ed "backcompat-1
13f0: 2e 58 2e 2e 2e 22 2c 20 77 68 65 72 65 20 58 20  .X...", where X 
1400: 69 73 20 65 69 74 68 65 72 20 30 20 6f 72 0a 20  is either 0 or. 
1410: 20 23 20 31 2e 20 49 66 20 69 74 20 69 73 20 30   # 1. If it is 0
1420: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
1430: 6e 74 20 76 65 72 73 69 6f 6e 20 63 72 65 61 74  nt version creat
1440: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  es a journal fil
1450: 65 20 74 68 61 74 0a 20 20 23 20 74 68 65 20 6f  e that.  # the o
1460: 6c 64 20 76 65 72 73 69 6f 6e 73 20 74 72 79 20  ld versions try 
1470: 74 6f 20 72 65 61 64 2e 20 4f 74 68 65 72 77 69  to read. Otherwi
1480: 73 65 2c 20 69 66 20 58 20 69 73 20 31 2c 20 74  se, if X is 1, t
1490: 68 65 6e 20 74 68 65 20 6f 6c 64 20 76 65 72 73  hen the old vers
14a0: 69 6f 6e 0a 20 20 23 20 63 72 65 61 74 65 73 20  ion.  # creates 
14b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14c0: 20 61 6e 64 20 77 65 20 74 72 79 20 74 6f 20 72   and we try to r
14d0: 65 61 64 20 69 74 20 77 69 74 68 20 74 68 65 20  ead it with the 
14e0: 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 2e  current version.
14f0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 62  .  #.  do_test b
1500: 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 31 20  ackcompat-1.2.1 
1510: 7b 20 73 71 6c 31 20 7b 0a 20 20 20 20 50 52 41  { sql1 {.    PRA
1520: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
1530: 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   10;.    BEGIN;.
1540: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1550: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
1560: 6f 6d 62 6c 6f 62 28 34 30 30 29 2c 20 72 61 6e  omblob(400), ran
1570: 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20  domblob(400));. 
1580: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1590: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
15a0: 6d 62 6c 6f 62 28 34 30 30 29 2c 20 72 61 6e 64  mblob(400), rand
15b0: 6f 6d 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  omblob(400) FROM
15c0: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
15d0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
15e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29   randomblob(400)
15f0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30  , randomblob(400
1600: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
1610: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1620: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
1630: 62 28 34 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  b(400), randombl
1640: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1650: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1660: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
1670: 64 6f 6d 62 6c 6f 62 28 34 30 30 29 2c 20 72 61  domblob(400), ra
1680: 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 20 46 52  ndomblob(400) FR
1690: 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM t1;.    COMMI
16a0: 54 3b 0a 20 20 7d 20 7d 20 7b 7d 0a 20 20 73 65  T;.  } } {}.  se
16b0: 74 20 63 6b 73 75 6d 31 20 5b 73 71 6c 31 20 7b  t cksum1 [sql1 {
16c0: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 29  SELECT md5sum(a)
16d0: 2c 20 6d 64 35 73 75 6d 28 62 29 20 46 52 4f 4d  , md5sum(b) FROM
16e0: 20 74 31 7d 5d 0a 20 20 73 65 74 20 63 6b 73 75   t1}].  set cksu
16f0: 6d 32 20 5b 73 71 6c 32 20 7b 53 45 4c 45 43 54  m2 [sql2 {SELECT
1700: 20 6d 64 35 73 75 6d 28 61 29 2c 20 6d 64 35 73   md5sum(a), md5s
1710: 75 6d 28 62 29 20 46 52 4f 4d 20 74 31 7d 5d 0a  um(b) FROM t1}].
1720: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f    do_test backco
1730: 6d 70 61 74 2d 31 2e 32 2e 32 20 5b 6c 69 73 74  mpat-1.2.2 [list
1740: 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20   string compare 
1750: 24 63 6b 73 75 6d 31 20 24 63 6b 73 75 6d 32 5d  $cksum1 $cksum2]
1760: 20 30 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61   0..  do_test ba
1770: 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 33 20 7b  ckcompat-1.2.3 {
1780: 20 73 71 6c 31 20 7b 0a 20 20 20 20 42 45 47 49   sql1 {.    BEGI
1790: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
17a0: 74 31 20 53 45 54 20 61 20 3d 20 72 61 6e 64 6f  t1 SET a = rando
17b0: 6d 62 6c 6f 62 28 35 30 30 29 3b 0a 20 20 7d 20  mblob(500);.  } 
17c0: 7d 20 7b 7d 0a 20 20 73 65 74 20 64 61 74 61 20  } {}.  set data 
17d0: 5b 72 65 61 64 5f 66 69 6c 65 5f 73 79 73 74 65  [read_file_syste
17e0: 6d 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  m]..  do_test ba
17f0: 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 34 20 7b  ckcompat-1.2.4 {
1800: 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql1 { COMMIT }
1810: 20 7d 20 7b 7d 0a 0a 20 20 73 65 74 20 73 61 6d   } {}..  set sam
1820: 65 20 5b 65 78 70 72 20 7b 5b 73 71 6c 32 20 7b  e [expr {[sql2 {
1830: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 29  SELECT md5sum(a)
1840: 2c 20 6d 64 35 73 75 6d 28 62 29 20 46 52 4f 4d  , md5sum(b) FROM
1850: 20 74 31 7d 5d 20 3d 3d 20 24 63 6b 73 75 6d 32   t1}] == $cksum2
1860: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61 63  }].  do_test bac
1870: 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 35 20 5b 6c  kcompat-1.2.5 [l
1880: 69 73 74 20 73 65 74 20 7b 7d 20 24 73 61 6d 65  ist set {} $same
1890: 5d 20 30 0a 0a 20 20 63 6f 64 65 31 20 7b 20 64  ] 0..  code1 { d
18a0: 62 20 63 6c 6f 73 65 20 7d 0a 20 20 63 6f 64 65  b close }.  code
18b0: 32 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  2 { db close }. 
18c0: 20 77 72 69 74 65 5f 66 69 6c 65 5f 73 79 73 74   write_file_syst
18d0: 65 6d 20 24 64 61 74 61 0a 20 20 63 6f 64 65 31  em $data.  code1
18e0: 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65   { sqlite3 db te
18f0: 73 74 2e 64 62 20 7d 0a 20 20 63 6f 64 65 32 20  st.db }.  code2 
1900: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  { sqlite3 db tes
1910: 74 2e 64 62 20 7d 0a 0a 20 20 73 65 74 20 73 61  t.db }..  set sa
1920: 6d 65 20 5b 65 78 70 72 20 7b 5b 73 71 6c 32 20  me [expr {[sql2 
1930: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
1940: 29 2c 20 6d 64 35 73 75 6d 28 62 29 20 46 52 4f  ), md5sum(b) FRO
1950: 4d 20 74 31 7d 5d 20 3d 3d 20 24 63 6b 73 75 6d  M t1}] == $cksum
1960: 32 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 62 61  2}].  do_test ba
1970: 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 36 20 5b  ckcompat-1.2.6 [
1980: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 73 61 6d  list set {} $sam
1990: 65 5d 20 31 0a 0a 20 20 64 6f 5f 74 65 73 74 20  e] 1..  do_test 
19a0: 62 61 63 6b 63 6f 6d 70 61 74 2d 31 2e 32 2e 37  backcompat-1.2.7
19b0: 20 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41   { sql1 { PRAGMA
19c0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
19d0: 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 64 6f 5f 74   } } {ok}.  do_t
19e0: 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 31  est backcompat-1
19f0: 2e 32 2e 38 20 7b 20 73 71 6c 32 20 7b 20 50 52  .2.8 { sql2 { PR
1a00: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
1a10: 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 0a 20  heck } } {ok}.. 
1a20: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
1a30: 70 61 74 2d 32 2e 31 20 7b 0a 20 20 20 20 73 71  pat-2.1 {.    sq
1a40: 6c 31 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  l1 {.      CREAT
1a50: 45 20 54 41 42 4c 45 20 74 32 28 61 20 55 4e 49  E TABLE t2(a UNI
1a60: 51 55 45 2c 20 62 20 50 52 49 4d 41 52 59 20 4b  QUE, b PRIMARY K
1a70: 45 59 2c 20 63 20 55 4e 49 51 55 45 29 3b 0a 20  EY, c UNIQUE);. 
1a80: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1a90: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 39 2c 35   t2 VALUES(1,9,5
1aa0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
1ab0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 35  INTO t2 VALUES(5
1ac0: 2c 35 2c 31 29 3b 0a 20 20 20 20 20 20 49 4e 53  ,5,1);.      INS
1ad0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1ae0: 45 53 28 39 2c 31 2c 39 29 3b 0a 20 20 20 20 20  ES(9,1,9);.     
1af0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1b00: 32 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  2 ORDER BY a;.  
1b10: 20 20 7d 0a 20 20 7d 20 7b 31 20 39 20 35 20 35    }.  } {1 9 5 5
1b20: 20 35 20 31 20 39 20 31 20 39 7d 0a 20 20 64 6f   5 1 9 1 9}.  do
1b30: 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74  _test backcompat
1b40: 2d 32 2e 32 20 7b 0a 20 20 20 20 73 71 6c 32 20  -2.2 {.    sql2 
1b50: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
1b60: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
1b70: 74 65 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61  ter WHERE rootpa
1b80: 67 65 3d 2d 31 3b 0a 20 20 20 20 20 20 53 45 4c  ge=-1;.      SEL
1b90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52  ECT * FROM t2 OR
1ba0: 44 45 52 20 42 59 20 61 3b 0a 20 20 20 20 7d 0a  DER BY a;.    }.
1bb0: 20 20 7d 20 7b 31 20 39 20 35 20 35 20 35 20 31    } {1 9 5 5 5 1
1bc0: 20 39 20 31 20 39 7d 0a 20 20 64 6f 5f 74 65 73   9 1 9}.  do_tes
1bd0: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 32 2e 33  t backcompat-2.3
1be0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
1bf0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1c00: 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 62 3b  M t2 ORDER BY b;
1c10: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 20 31 20  .    }.  } {9 1 
1c20: 39 20 35 20 35 20 31 20 31 20 39 20 35 7d 0a 20  9 5 5 1 1 9 5}. 
1c30: 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d   do_test backcom
1c40: 70 61 74 2d 32 2e 34 20 7b 0a 20 20 20 20 73 71  pat-2.4 {.    sq
1c50: 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  l2 {.      SELEC
1c60: 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  T * FROM t2 ORDE
1c70: 52 20 42 59 20 62 3b 0a 20 20 20 20 7d 0a 20 20  R BY b;.    }.  
1c80: 7d 20 7b 39 20 31 20 39 20 35 20 35 20 31 20 31  } {9 1 9 5 5 1 1
1c90: 20 39 20 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20   9 5}.  do_test 
1ca0: 62 61 63 6b 63 6f 6d 70 61 74 2d 32 2e 35 20 7b  backcompat-2.5 {
1cb0: 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
1cc0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1cd0: 74 32 20 4f 52 44 45 52 20 42 59 20 63 3b 0a 20  t2 ORDER BY c;. 
1ce0: 20 20 20 7d 0a 20 20 7d 20 7b 35 20 35 20 31 20     }.  } {5 5 1 
1cf0: 31 20 39 20 35 20 39 20 31 20 39 7d 0a 20 20 64  1 9 5 9 1 9}.  d
1d00: 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61  o_test backcompa
1d10: 74 2d 32 2e 36 20 7b 0a 20 20 20 20 73 71 6c 32  t-2.6 {.    sql2
1d20: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1d30: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
1d40: 42 59 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  BY c;.    }.  } 
1d50: 7b 35 20 35 20 31 20 31 20 39 20 35 20 39 20 31  {5 5 1 1 9 5 9 1
1d60: 20 39 7d 0a 7d 0a 66 6f 72 65 61 63 68 20 6b 20   9}.}.foreach k 
1d70: 5b 6c 73 6f 72 74 20 5b 61 72 72 61 79 20 6e 61  [lsort [array na
1d80: 6d 65 73 20 3a 3a 69 6e 63 6f 6d 70 61 74 69 62  mes ::incompatib
1d90: 6c 65 5d 5d 20 7b 0a 20 20 70 75 74 73 20 22 45  le]] {.  puts "E
1da0: 52 52 4f 52 3a 20 44 65 74 65 63 74 65 64 20 6a  RROR: Detected j
1db0: 6f 75 72 6e 61 6c 20 69 6e 63 6f 6d 70 61 74 69  ournal incompati
1dc0: 62 69 6c 69 74 79 20 77 69 74 68 20 76 65 72 73  bility with vers
1dd0: 69 6f 6e 20 24 6b 22 0a 7d 0a 75 6e 73 65 74 20  ion $k".}.unset 
1de0: 3a 3a 69 6e 63 6f 6d 70 61 74 69 62 6c 65 0a 0a  ::incompatible..
1df0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1e40: 73 74 20 74 68 61 74 20 57 41 4c 20 61 6e 64 20  st that WAL and 
1e50: 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 73 20  wal-index files 
1e60: 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 65  may be shared be
1e70: 74 77 65 65 6e 20 64 69 66 66 65 72 65 6e 74 20  tween different 
1e80: 0a 23 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  .# SQLite versio
1e90: 6e 73 2e 0a 23 0a 64 6f 5f 61 6c 6c 62 61 63 6b  ns..#.do_allback
1ea0: 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b 0a 20 20  compat_test {.  
1eb0: 69 66 20 7b 5b 63 6f 64 65 31 20 7b 73 71 6c 69  if {[code1 {sqli
1ec0: 74 65 33 20 2d 76 65 72 73 69 6f 6e 7d 5d 20 3e  te3 -version}] >
1ed0: 3d 20 22 33 2e 37 2e 30 22 0a 20 20 20 26 26 20  = "3.7.0".   && 
1ee0: 5b 63 6f 64 65 31 20 7b 73 65 74 20 3a 3a 73 71  [code1 {set ::sq
1ef0: 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 77 61 6c  lite_options(wal
1f00: 29 7d 5d 0a 20 20 20 26 26 20 5b 63 6f 64 65 32  )}].   && [code2
1f10: 20 7b 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69   {sqlite3 -versi
1f20: 6f 6e 7d 5d 20 3e 3d 20 22 33 2e 37 2e 30 22 0a  on}] >= "3.7.0".
1f30: 20 20 20 26 26 20 5b 63 6f 64 65 32 20 7b 73 65     && [code2 {se
1f40: 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f  t ::sqlite_optio
1f50: 6e 73 28 77 61 6c 29 7d 5d 0a 20 20 7d 20 7b 0a  ns(wal)}].  } {.
1f60: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63  .    do_test bac
1f70: 6b 63 6f 6d 70 61 74 2d 32 2e 31 2e 31 20 7b 20  kcompat-2.1.1 { 
1f80: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41  sql1 {.      PRA
1f90: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
1fa0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52   = WAL;.      CR
1fb0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
1fc0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55  PRIMARY KEY, b U
1fd0: 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20 49 4e  NIQUE);.      IN
1fe0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1ff0: 55 45 53 28 27 49 27 2c 20 31 29 3b 0a 20 20 20  UES('I', 1);.   
2000: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2010: 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c 20 32  1 VALUES('II', 2
2020: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2030: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
2040: 49 49 49 27 2c 20 33 29 3b 0a 20 20 20 20 20 20  III', 3);.      
2050: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2060: 3b 0a 20 20 20 20 7d 20 7d 20 7b 77 61 6c 20 49  ;.    } } {wal I
2070: 20 31 20 49 49 20 32 20 49 49 49 20 33 7d 0a 20   1 II 2 III 3}. 
2080: 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63     do_test backc
2090: 6f 6d 70 61 74 2d 32 2e 31 2e 32 20 7b 20 73 71  ompat-2.1.2 { sq
20a0: 6c 32 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  l2 {.      SELEC
20b0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
20c0: 20 7d 20 7d 20 7b 49 20 31 20 49 49 20 32 20 49   } } {I 1 II 2 I
20d0: 49 49 20 33 7d 0a 0a 20 20 20 20 73 65 74 20 64  II 3}..    set d
20e0: 61 74 61 20 5b 72 65 61 64 5f 66 69 6c 65 5f 73  ata [read_file_s
20f0: 79 73 74 65 6d 5d 0a 20 20 20 20 63 6f 64 65 31  ystem].    code1
2100: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 20 20   {db close}.    
2110: 63 6f 64 65 32 20 7b 64 62 20 63 6c 6f 73 65 7d  code2 {db close}
2120: 0a 20 20 20 20 77 72 69 74 65 5f 66 69 6c 65 5f  .    write_file_
2130: 73 79 73 74 65 6d 20 24 64 61 74 61 0a 20 20 20  system $data.   
2140: 20 63 6f 64 65 31 20 7b 73 71 6c 69 74 65 33 20   code1 {sqlite3 
2150: 64 62 20 74 65 73 74 2e 64 62 7d 0a 20 20 20 20  db test.db}.    
2160: 63 6f 64 65 32 20 7b 73 71 6c 69 74 65 33 20 64  code2 {sqlite3 d
2170: 62 20 74 65 73 74 2e 64 62 7d 0a 0a 20 20 20 20  b test.db}..    
2180: 23 20 54 68 65 20 57 41 4c 20 66 69 6c 65 20 6e  # The WAL file n
2190: 6f 77 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ow in the file-s
21a0: 79 73 74 65 6d 20 77 61 73 20 63 72 65 61 74 65  ystem was create
21b0: 64 20 62 79 20 74 68 65 20 5b 63 6f 64 65 31 5d  d by the [code1]
21c0: 0a 20 20 20 20 23 20 70 72 6f 63 65 73 73 2e 20  .    # process. 
21d0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 5b  Check that the [
21e0: 63 6f 64 65 32 5d 20 70 72 6f 63 65 73 73 20 63  code2] process c
21f0: 61 6e 20 72 65 63 6f 76 65 72 20 74 68 65 20 6c  an recover the l
2200: 6f 67 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  og..    #.    do
2210: 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74  _test backcompat
2220: 2d 32 2e 31 2e 33 20 7b 20 73 71 6c 32 20 7b 0a  -2.1.3 { sql2 {.
2230: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2240: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 20 7d 20  ROM t1;.    } } 
2250: 7b 49 20 31 20 49 49 20 32 20 49 49 49 20 33 7d  {I 1 II 2 III 3}
2260: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63  .    do_test bac
2270: 6b 63 6f 6d 70 61 74 2d 32 2e 31 2e 34 20 7b 20  kcompat-2.1.4 { 
2280: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 53 45 4c  sql1 {.      SEL
2290: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
22a0: 20 20 20 7d 20 7d 20 7b 49 20 31 20 49 49 20 32     } } {I 1 II 2
22b0: 20 49 49 49 20 33 7d 0a 20 20 7d 0a 7d 0a 0a 23   III 3}.  }.}..#
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2310: 20 74 68 61 74 20 46 54 53 33 20 74 61 62 6c 65   that FTS3 table
2320: 73 20 6d 61 79 20 62 65 20 72 65 61 64 2f 77 72  s may be read/wr
2330: 69 74 74 65 6e 20 62 79 20 64 69 66 66 65 72 65  itten by differe
2340: 6e 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 0a  nt versions of .
2350: 23 20 53 51 4c 69 74 65 2e 20 0a 23 0a 69 66 63  # SQLite. .#.ifc
2360: 61 70 61 62 6c 65 20 66 74 73 33 20 7b 0a 20 20  apable fts3 {.  
2370: 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 7b 0a 20  set contents {. 
2380: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
2390: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
23a0: 20 66 74 73 33 28 61 2c 20 62 29 3b 0a 20 20 7d   fts3(a, b);.  }
23b0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 75 6d 20  .  foreach {num 
23c0: 64 6f 63 7d 20 7b 0a 20 20 20 20 6f 6e 65 20 22  doc} {.    one "
23d0: 6a 6b 20 7a 6d 20 6a 6b 20 65 63 7a 6b 6a 62 6c  jk zm jk eczkjbl
23e0: 75 20 75 72 76 79 73 62 6e 79 6b 6b 20 73 6b 20  u urvysbnykk sk 
23f0: 67 6e 6c 20 6a 6b 20 74 74 76 67 66 20 68 6d 6a  gnl jk ttvgf hmj
2400: 66 22 0a 20 20 20 20 74 77 6f 20 22 6a 6b 20 62  f".    two "jk b
2410: 6e 68 63 20 6a 6a 72 78 70 6a 6b 62 20 6d 6a 70  nhc jjrxpjkb mjp
2420: 61 76 6a 75 68 77 20 66 69 62 6f 6b 64 72 79 20  avjuhw fibokdry 
2430: 69 67 6a 75 20 6a 6b 20 7a 6d 20 7a 6d 20 78 68  igju jk zm zm xh
2440: 22 0a 20 20 20 20 74 68 72 65 65 20 22 77 78 65  ".    three "wxe
2450: 20 6f 67 74 74 62 79 6b 76 74 20 75 68 7a 71 20   ogttbykvt uhzq 
2460: 78 72 20 69 61 66 20 7a 66 20 75 72 76 79 73 62  xr iaf zf urvysb
2470: 6e 79 6b 6b 20 61 61 79 78 70 6d 76 65 20 6f 61  nykk aayxpmve oa
2480: 63 61 78 67 6a 6f 6f 20 6d 6a 70 61 76 6a 75 68  caxgjoo mjpavjuh
2490: 77 22 0a 20 20 20 20 66 6f 75 72 20 22 67 61 7a  w".    four "gaz
24a0: 72 74 20 6a 6b 20 65 70 68 6b 6e 6f 6e 71 20 6d  rt jk ephknonq m
24b0: 79 6a 70 20 75 65 6e 76 62 6d 20 77 75 76 61 6a  yjp uenvbm wuvaj
24c0: 68 77 71 7a 20 6a 6b 20 7a 6d 20 78 6e 78 68 66  hwqz jk zm xnxhf
24d0: 20 6e 76 66 61 73 66 68 22 0a 20 20 20 20 66 69   nvfasfh".    fi
24e0: 76 65 20 22 7a 6d 20 61 61 79 78 70 6d 76 65 20  ve "zm aayxpmve 
24f0: 63 73 6a 71 78 68 67 6a 20 78 6e 78 68 66 20 78  csjqxhgj xnxhf x
2500: 72 20 6a 6b 20 61 61 79 78 70 6d 76 65 20 78 6e  r jk aayxpmve xn
2510: 78 68 66 20 7a 6d 20 7a 6d 22 0a 20 20 20 20 73  xhf zm zm".    s
2520: 69 78 20 22 73 6f 6b 63 79 66 20 7a 6d 20 6f 67  ix "sokcyf zm og
2530: 79 61 76 6a 76 76 20 6a 6b 20 7a 6d 20 66 69 62  yavjvv jk zm fib
2540: 6f 6b 64 72 79 20 7a 6d 20 6a 6b 20 69 67 6a 75  okdry zm jk igju
2550: 20 69 67 6a 75 22 0a 20 20 20 20 73 65 76 65 6e   igju".    seven
2560: 20 22 76 67 73 6c 64 20 62 76 67 69 6d 6a 69 6b   "vgsld bvgimjik
2570: 20 78 75 70 72 74 6c 79 6c 65 20 6a 6b 20 61 6b   xuprtlyle jk ak
2580: 6d 69 6b 72 71 79 74 20 6a 6b 20 61 61 79 78 70  mikrqyt jk aayxp
2590: 6d 76 65 20 68 6b 66 6f 75 64 7a 66 74 71 20 64  mve hkfoudzftq d
25a0: 64 6a 6a 22 0a 20 20 20 20 65 69 67 68 74 20 22  djj".    eight "
25b0: 7a 6d 20 75 68 7a 71 20 6f 76 6b 79 65 76 6c 67  zm uhzq ovkyevlg
25c0: 76 20 7a 6b 20 75 65 6e 76 62 6d 20 63 73 6a 71  v zk uenvbm csjq
25d0: 78 68 67 6a 20 6a 6b 20 76 67 73 6c 64 20 70 67  xhgj jk vgsld pg
25e0: 79 62 73 20 6a 6b 22 0a 20 20 20 20 6e 69 6e 65  ybs jk".    nine
25f0: 20 20 22 7a 6d 20 61 67 6d 63 6b 75 69 75 20 7a    "zm agmckuiu z
2600: 65 78 68 20 66 69 62 6f 6b 64 72 79 20 6a 6b 20  exh fibokdry jk 
2610: 75 68 7a 71 20 62 75 20 74 75 67 66 6c 69 78 6f  uhzq bu tugflixo
2620: 65 78 20 78 6e 78 68 66 20 73 6b 22 0a 20 20 7d  ex xnxhf sk".  }
2630: 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 63 6f   {.    append co
2640: 6e 74 65 6e 74 73 20 22 49 4e 53 45 52 54 20 49  ntents "INSERT I
2650: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 24  NTO t1 VALUES('$
2660: 6e 75 6d 27 2c 20 27 24 64 6f 63 27 29 3b 22 0a  num', '$doc');".
2670: 20 20 7d 0a 20 20 64 6f 5f 61 6c 6c 62 61 63 6b    }.  do_allback
2680: 63 6f 6d 70 61 74 5f 74 65 73 74 20 7b 0a 20 20  compat_test {.  
2690: 20 20 69 66 20 7b 5b 63 6f 64 65 31 20 7b 73 65    if {[code1 {se
26a0: 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f  t ::sqlite_optio
26b0: 6e 73 28 66 74 73 33 29 7d 5d 0a 20 20 20 20 20  ns(fts3)}].     
26c0: 26 26 20 5b 63 6f 64 65 32 20 7b 73 65 74 20 3a  && [code2 {set :
26d0: 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28  :sqlite_options(
26e0: 66 74 73 33 29 7d 5d 0a 20 20 20 20 7d 20 7b 0a  fts3)}].    } {.
26f0: 20 20 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74    .      do_test
2700: 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 31 20   backcompat-3.1 
2710: 7b 20 73 71 6c 31 20 24 63 6f 6e 74 65 6e 74 73  { sql1 $contents
2720: 20 7d 20 7b 7d 0a 20 20 0a 20 20 20 20 20 20 66   } {}.  .      f
2730: 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20 7b 0a 20  oreach {n q} {. 
2740: 20 20 20 20 20 20 20 31 20 20 20 20 22 53 45 4c         1    "SEL
2750: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52  ECT * FROM t1 OR
2760: 44 45 52 20 42 59 20 61 2c 20 62 22 0a 20 20 20  DER BY a, b".   
2770: 20 20 20 20 20 32 20 20 20 20 22 53 45 4c 45 43       2    "SELEC
2780: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  T rowid FROM t1 
2790: 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 66  WHERE a MATCH 'f
27a0: 69 76 65 27 22 0a 20 20 20 20 20 20 20 20 33 20  ive'".        3 
27b0: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
27c0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54  M t1 WHERE a MAT
27d0: 43 48 20 27 66 69 76 65 27 22 0a 20 20 20 20 20  CH 'five'".     
27e0: 20 20 20 34 20 20 20 20 22 53 45 4c 45 43 54 20     4    "SELECT 
27f0: 6f 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d  offsets(t1) FROM
2800: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
2810: 43 48 20 27 6a 6b 27 22 0a 20 20 20 20 20 20 20  CH 'jk'".       
2820: 20 35 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66   5    "SELECT of
2830: 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74  fsets(t1) FROM t
2840: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
2850: 20 27 74 75 67 2a 20 4f 52 20 65 69 67 68 74 27   'tug* OR eight'
2860: 22 0a 20 20 20 20 20 20 7d 20 7b 0a 20 20 20 20  ".      } {.    
2870: 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b      do_test back
2880: 63 6f 6d 70 61 74 2d 33 2e 32 20 5b 6c 69 73 74  compat-3.2 [list
2890: 20 73 71 6c 31 20 24 71 5d 20 5b 73 71 6c 32 20   sql1 $q] [sql2 
28a0: 24 71 5d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  $q].      }.  . 
28b0: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63       do_test bac
28c0: 6b 63 6f 6d 70 61 74 2d 33 2e 33 20 7b 20 73 71  kcompat-3.3 { sq
28d0: 6c 31 20 7b 0a 20 20 20 20 20 20 20 20 49 4e 53  l1 {.        INS
28e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
28f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
2900: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2910: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
2920: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 49  OM t1;.        I
2930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
2950: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2960: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
2970: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
2980: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2990: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
29a0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
29b0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
29c0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
29d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
29e0: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
29f0: 74 31 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  t1;.        INSE
2a00: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2a10: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
2a20: 20 20 20 7d 20 7d 20 7b 7d 0a 20 20 0a 20 20 20     } } {}.  .   
2a30: 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d     foreach {n q}
2a40: 20 7b 0a 20 20 20 20 20 20 20 20 31 20 20 20 20   {.        1    
2a50: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2a60: 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62 22  1 ORDER BY a, b"
2a70: 0a 20 20 20 20 20 20 20 20 32 20 20 20 20 22 53  .        2    "S
2a80: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
2a90: 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43   t1 WHERE a MATC
2aa0: 48 20 27 66 69 76 65 27 22 0a 20 20 20 20 20 20  H 'five'".      
2ab0: 20 20 33 20 20 20 20 22 53 45 4c 45 43 54 20 2a    3    "SELECT *
2ac0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
2ad0: 20 4d 41 54 43 48 20 27 66 69 76 65 27 22 0a 20   MATCH 'five'". 
2ae0: 20 20 20 20 20 20 20 34 20 20 20 20 22 53 45 4c         4    "SEL
2af0: 45 43 54 20 6f 66 66 73 65 74 73 28 74 31 29 20  ECT offsets(t1) 
2b00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
2b10: 20 4d 41 54 43 48 20 27 6a 6b 27 22 0a 20 20 20   MATCH 'jk'".   
2b20: 20 20 20 20 20 35 20 20 20 20 22 53 45 4c 45 43       5    "SELEC
2b30: 54 20 6f 66 66 73 65 74 73 28 74 31 29 20 46 52  T offsets(t1) FR
2b40: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
2b50: 41 54 43 48 20 27 74 75 67 2a 20 4f 52 20 65 69  ATCH 'tug* OR ei
2b60: 67 68 74 27 22 0a 20 20 20 20 20 20 7d 20 7b 0a  ght'".      } {.
2b70: 20 20 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20          do_test 
2b80: 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 34 20 5b  backcompat-3.4 [
2b90: 6c 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73  list sql1 $q] [s
2ba0: 71 6c 32 20 24 71 5d 0a 20 20 20 20 20 20 7d 0a  ql2 $q].      }.
2bb0: 20 20 0a 20 20 20 20 20 20 73 65 74 20 61 6c 70    .      set alp
2bc0: 68 61 62 65 74 20 22 61 20 62 20 63 20 64 20 65  habet "a b c d e
2bd0: 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d   f g h i j k l m
2be0: 20 6e 20 6f 20 70 20 71 20 72 20 73 20 74 20 75   n o p q r s t u
2bf0: 20 76 20 77 20 78 20 79 20 7a 20 31 20 32 20 33   v w x y z 1 2 3
2c00: 20 34 22 0a 20 20 20 20 20 20 66 6f 72 20 7b 73   4".      for {s
2c10: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 39 30  et i 0} {$i < 90
2c20: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
2c30: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 20 22        set term "
2c40: 5b 6c 69 6e 64 65 78 20 24 61 6c 70 68 61 62 65  [lindex $alphabe
2c50: 74 20 5b 65 78 70 72 20 24 69 2f 33 30 5d 5d 5b  t [expr $i/30]][
2c60: 6c 69 6e 64 65 78 20 24 61 6c 70 68 61 62 65 74  lindex $alphabet
2c70: 20 5b 65 78 70 72 20 24 69 25 33 30 5d 5d 20 22   [expr $i%30]] "
2c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 31 20 22 49  .        sql1 "I
2c90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2ca0: 4c 55 45 53 28 24 69 2c 20 27 5b 73 74 72 69 6e  LUES($i, '[strin
2cb0: 67 20 72 65 70 65 61 74 20 24 74 65 72 6d 20 31  g repeat $term 1
2cc0: 34 5d 27 29 22 0a 20 20 20 20 20 20 7d 0a 20 20  4]')".      }.  
2cd0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b  .      foreach {
2ce0: 6e 20 71 7d 20 7b 0a 20 20 20 20 20 20 20 20 31  n q} {.        1
2cf0: 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52      "SELECT * FR
2d00: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
2d10: 2c 20 62 22 0a 20 20 20 20 20 20 20 20 32 20 20  , b".        2  
2d20: 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20    "SELECT rowid 
2d30: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
2d40: 4d 41 54 43 48 20 27 66 69 76 65 27 22 0a 20 20  MATCH 'five'".  
2d50: 20 20 20 20 20 20 33 20 20 20 20 22 53 45 4c 45        3    "SELE
2d60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2d70: 52 45 20 61 20 4d 41 54 43 48 20 27 66 69 76 65  RE a MATCH 'five
2d80: 27 22 0a 20 20 20 20 20 20 20 20 34 20 20 20 20  '".        4    
2d90: 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28  "SELECT offsets(
2da0: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
2db0: 45 20 74 31 20 4d 41 54 43 48 20 27 6a 6b 27 22  E t1 MATCH 'jk'"
2dc0: 0a 20 20 20 20 20 20 20 20 35 20 20 20 20 22 53  .        5    "S
2dd0: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 74 31  ELECT offsets(t1
2de0: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
2df0: 74 31 20 4d 41 54 43 48 20 27 74 75 67 2a 20 4f  t1 MATCH 'tug* O
2e00: 52 20 65 69 67 68 74 27 22 0a 20 20 0a 20 20 20  R eight'".  .   
2e10: 20 20 20 20 20 36 20 20 20 20 22 53 45 4c 45 43       6    "SELEC
2e20: 54 20 6f 66 66 73 65 74 73 28 74 31 29 20 46 52  T offsets(t1) FR
2e30: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
2e40: 41 54 43 48 20 27 61 61 27 22 0a 20 20 20 20 20  ATCH 'aa'".     
2e50: 20 20 20 37 20 20 20 20 22 53 45 4c 45 43 54 20     7    "SELECT 
2e60: 6f 66 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d  offsets(t1) FROM
2e70: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
2e80: 43 48 20 27 34 34 27 22 0a 20 20 20 20 20 20 20  CH '44'".       
2e90: 20 38 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66   8    "SELECT of
2ea0: 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74  fsets(t1) FROM t
2eb0: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
2ec0: 20 27 61 2a 27 22 0a 20 20 20 20 20 20 7d 20 7b   'a*'".      } {
2ed0: 0a 20 20 20 20 20 20 20 20 64 6f 5f 74 65 73 74  .        do_test
2ee0: 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 35 20   backcompat-3.5 
2ef0: 5b 6c 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b  [list sql1 $q] [
2f00: 73 71 6c 32 20 24 71 5d 0a 20 20 20 20 20 20 7d  sql2 $q].      }
2f10: 0a 20 20 0a 20 20 20 20 20 20 64 6f 5f 74 65 73  .  .      do_tes
2f20: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33 2e 36  t backcompat-3.6
2f30: 20 7b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 31   { .        sql1
2f40: 20 22 53 45 4c 45 43 54 20 6f 70 74 69 6d 69 7a   "SELECT optimiz
2f50: 65 28 74 31 29 20 46 52 4f 4d 20 74 31 20 4c 49  e(t1) FROM t1 LI
2f60: 4d 49 54 20 31 22 20 0a 20 20 20 20 20 20 7d 20  MIT 1" .      } 
2f70: 7b 7b 49 6e 64 65 78 20 6f 70 74 69 6d 69 7a 65  {{Index optimize
2f80: 64 7d 7d 0a 20 20 0a 20 20 20 20 20 20 66 6f 72  d}}.  .      for
2f90: 65 61 63 68 20 7b 6e 20 71 7d 20 7b 0a 20 20 20  each {n q} {.   
2fa0: 20 20 20 20 20 31 20 20 20 20 22 53 45 4c 45 43       1    "SELEC
2fb0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T * FROM t1 ORDE
2fc0: 52 20 42 59 20 61 2c 20 62 22 0a 20 20 20 20 20  R BY a, b".     
2fd0: 20 20 20 32 20 20 20 20 22 53 45 4c 45 43 54 20     2    "SELECT 
2fe0: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48  rowid FROM t1 WH
2ff0: 45 52 45 20 61 20 4d 41 54 43 48 20 27 66 69 76  ERE a MATCH 'fiv
3000: 65 27 22 0a 20 20 20 20 20 20 20 20 33 20 20 20  e'".        3   
3010: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
3020: 74 31 20 57 48 45 52 45 20 61 20 4d 41 54 43 48  t1 WHERE a MATCH
3030: 20 27 66 69 76 65 27 22 0a 20 20 20 20 20 20 20   'five'".       
3040: 20 34 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66   4    "SELECT of
3050: 66 73 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74  fsets(t1) FROM t
3060: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
3070: 20 27 6a 6b 27 22 0a 20 20 20 20 20 20 20 20 35   'jk'".        5
3080: 20 20 20 20 22 53 45 4c 45 43 54 20 6f 66 66 73      "SELECT offs
3090: 65 74 73 28 74 31 29 20 46 52 4f 4d 20 74 31 20  ets(t1) FROM t1 
30a0: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
30b0: 74 75 67 2a 20 4f 52 20 65 69 67 68 74 27 22 0a  tug* OR eight'".
30c0: 20 20 0a 20 20 20 20 20 20 20 20 36 20 20 20 20    .        6    
30d0: 22 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28  "SELECT offsets(
30e0: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
30f0: 45 20 74 31 20 4d 41 54 43 48 20 27 61 61 27 22  E t1 MATCH 'aa'"
3100: 0a 20 20 20 20 20 20 20 20 37 20 20 20 20 22 53  .        7    "S
3110: 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 74 31  ELECT offsets(t1
3120: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
3130: 74 31 20 4d 41 54 43 48 20 27 34 34 27 22 0a 20  t1 MATCH '44'". 
3140: 20 20 20 20 20 20 20 38 20 20 20 20 22 53 45 4c         8    "SEL
3150: 45 43 54 20 6f 66 66 73 65 74 73 28 74 31 29 20  ECT offsets(t1) 
3160: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
3170: 20 4d 41 54 43 48 20 27 61 2a 27 22 0a 20 20 20   MATCH 'a*'".   
3180: 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 64     } {.        d
3190: 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61  o_test backcompa
31a0: 74 2d 33 2e 37 20 5b 6c 69 73 74 20 73 71 6c 31  t-3.7 [list sql1
31b0: 20 24 71 5d 20 5b 73 71 6c 32 20 24 71 5d 0a 20   $q] [sql2 $q]. 
31c0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 23 20       }..      # 
31d0: 4e 6f 77 20 74 65 73 74 20 74 68 61 74 20 61 6e  Now test that an
31e0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
31f0: 67 65 20 63 61 6e 20 62 65 20 73 74 61 72 74 65  ge can be starte
3200: 64 20 62 79 20 6f 6e 65 20 76 65 72 73 69 6f 6e  d by one version
3210: 0a 20 20 20 20 20 20 23 20 61 6e 64 20 66 69 6e  .      # and fin
3220: 69 73 68 65 64 20 62 79 20 61 6e 6f 74 68 65 72  ished by another
3230: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 69  . And that the i
3240: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 73  ntegrity-check s
3250: 74 69 6c 6c 20 0a 20 20 20 20 20 20 23 20 70 61  till .      # pa
3260: 73 73 65 73 2e 0a 20 20 20 20 20 20 64 6f 5f 74  sses..      do_t
3270: 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 33  est backcompat-3
3280: 2e 38 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  .8 {.        sql
3290: 31 20 7b 20 0a 20 20 20 20 20 20 20 20 20 20 44  1 { .          D
32a0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
32b0: 53 54 53 20 74 31 3b 0a 20 20 20 20 20 20 20 20  STS t1;.        
32c0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
32d0: 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20 20  EXISTS t2;.     
32e0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
32f0: 45 20 74 31 28 64 6f 63 69 64 2c 20 77 6f 72 64  E t1(docid, word
3300: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43 52  s);.          CR
3310: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3320: 4c 45 20 74 32 20 55 53 49 4e 47 20 66 74 73 33  LE t2 USING fts3
3330: 28 77 6f 72 64 73 29 3b 0a 20 20 20 20 20 20 20  (words);.       
3340: 20 7d 0a 20 20 20 20 20 20 20 20 63 6f 64 65 31   }.        code1
3350: 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 74   [list source $t
3360: 65 73 74 64 69 72 2f 67 65 6e 65 73 69 73 2e 74  estdir/genesis.t
3370: 63 6c 5d 0a 20 20 20 20 20 20 20 20 63 6f 64 65  cl].        code
3380: 31 20 7b 20 66 74 73 5f 6b 6a 76 5f 67 65 6e 65  1 { fts_kjv_gene
3390: 73 69 73 20 7d 0a 20 20 20 20 20 20 20 20 73 71  sis }.        sq
33a0: 6c 31 20 7b 0a 20 20 20 20 20 20 20 20 20 20 49  l1 {.          I
33b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
33c0: 4c 45 43 54 20 77 6f 72 64 73 20 46 52 4f 4d 20  LECT words FROM 
33d0: 74 31 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e  t1;.          IN
33e0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
33f0: 45 43 54 20 77 6f 72 64 73 20 46 52 4f 4d 20 74  ECT words FROM t
3400: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53  1;.          INS
3410: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
3420: 43 54 20 77 6f 72 64 73 20 46 52 4f 4d 20 74 31  CT words FROM t1
3430: 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45  ;.          INSE
3440: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
3450: 54 20 77 6f 72 64 73 20 46 52 4f 4d 20 74 31 3b  T words FROM t1;
3460: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
3470: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
3480: 20 77 6f 72 64 73 20 46 52 4f 4d 20 74 31 3b 0a   words FROM t1;.
3490: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
34a0: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
34b0: 77 6f 72 64 73 20 46 52 4f 4d 20 74 31 3b 0a 20  words FROM t1;. 
34c0: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
34d0: 6c 65 76 65 6c 2c 20 67 72 6f 75 70 5f 63 6f 6e  level, group_con
34e0: 63 61 74 28 69 64 78 2c 20 27 20 27 29 20 46 52  cat(idx, ' ') FR
34f0: 4f 4d 20 74 32 5f 73 65 67 64 69 72 20 47 52 4f  OM t2_segdir GRO
3500: 55 50 20 42 59 20 6c 65 76 65 6c 3b 0a 20 20 20  UP BY level;.   
3510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 7b       }.      } {
3520: 30 20 7b 30 20 31 20 32 20 33 20 34 20 35 7d 7d  0 {0 1 2 3 4 5}}
3530: 0a 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 6f 64  ..      if {[cod
3540: 65 31 20 7b 20 73 65 74 20 3a 3a 73 71 6c 69 74  e1 { set ::sqlit
3550: 65 5f 6c 69 62 76 65 72 73 69 6f 6e 20 7d 5d 20  e_libversion }] 
3560: 3e 3d 33 30 37 31 32 30 30 20 0a 20 20 20 20 20  >=3071200 .     
3570: 20 20 26 26 20 5b 63 6f 64 65 32 20 7b 20 73 65    && [code2 { se
3580: 74 20 3a 3a 73 71 6c 69 74 65 5f 6c 69 62 76 65  t ::sqlite_libve
3590: 72 73 69 6f 6e 20 7d 5d 20 3e 3d 33 30 37 31 32  rsion }] >=30712
35a0: 30 30 20 0a 20 20 20 20 20 20 7d 20 7b 0a 20 20  00 .      } {.  
35b0: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61        do_test ba
35c0: 63 6b 63 6f 6d 70 61 74 2d 33 2e 39 20 7b 0a 20  ckcompat-3.9 {. 
35d0: 20 20 20 20 20 20 20 20 20 73 71 6c 31 20 7b 20           sql1 { 
35e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74  INSERT INTO t2(t
35f0: 32 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65  2) VALUES('merge
3600: 3d 31 30 30 2c 34 27 29 3b 20 7d 0a 20 20 20 20  =100,4'); }.    
3610: 20 20 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53        sql2 { INS
3620: 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20  ERT INTO t2(t2) 
3630: 56 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 31 30  VALUES('merge=10
3640: 30 2c 34 27 29 3b 20 7d 0a 20 20 20 20 20 20 20  0,4'); }.       
3650: 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54     sql1 { INSERT
3660: 20 49 4e 54 4f 20 74 32 28 74 32 29 20 56 41 4c   INTO t2(t2) VAL
3670: 55 45 53 28 27 6d 65 72 67 65 3d 31 30 30 2c 34  UES('merge=100,4
3680: 27 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  '); }.          
3690: 73 71 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e  sql2 { INSERT IN
36a0: 54 4f 20 74 32 28 74 32 29 20 56 41 4c 55 45 53  TO t2(t2) VALUES
36b0: 28 27 6d 65 72 67 65 3d 32 35 30 30 2c 34 27 29  ('merge=2500,4')
36c0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71  ; }.          sq
36d0: 6c 32 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l2 {.           
36e0: 20 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 67   SELECT level, g
36f0: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 69 64 78 2c  roup_concat(idx,
3700: 20 27 20 27 29 20 46 52 4f 4d 20 74 32 5f 73 65   ' ') FROM t2_se
3710: 67 64 69 72 20 47 52 4f 55 50 20 42 59 20 6c 65  gdir GROUP BY le
3720: 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  vel;.          }
3730: 0a 20 20 20 20 20 20 20 20 7d 20 7b 30 20 7b 30  .        } {0 {0
3740: 20 31 7d 20 31 20 30 7d 0a 0a 20 20 20 20 20 20   1} 1 0}..      
3750: 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b 63 6f    do_test backco
3760: 6d 70 61 74 2d 33 2e 31 30 20 7b 0a 20 20 20 20  mpat-3.10 {.    
3770: 20 20 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53        sql1 { INS
3780: 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20  ERT INTO t2(t2) 
3790: 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74  VALUES('integrit
37a0: 79 2d 63 68 65 63 6b 27 29 20 7d 0a 20 20 20 20  y-check') }.    
37b0: 20 20 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53        sql2 { INS
37c0: 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20  ERT INTO t2(t2) 
37d0: 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74  VALUES('integrit
37e0: 79 2d 63 68 65 63 6b 27 29 20 7d 0a 20 20 20 20  y-check') }.    
37f0: 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 20 20 7d      } {}.      }
3800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d  .    }.  }.}..#-
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
3860: 74 68 61 74 20 52 74 72 65 65 20 74 61 62 6c 65  that Rtree table
3870: 73 20 6d 61 79 20 62 65 20 72 65 61 64 2f 77 72  s may be read/wr
3880: 69 74 74 65 6e 20 62 79 20 64 69 66 66 65 72 65  itten by differe
3890: 6e 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 0a  nt versions of .
38a0: 23 20 53 51 4c 69 74 65 2e 20 0a 23 0a 69 66 63  # SQLite. .#.ifc
38b0: 61 70 61 62 6c 65 20 72 74 72 65 65 20 7b 0a 20  apable rtree {. 
38c0: 20 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 7b 0a   set contents {.
38d0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
38e0: 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
38f0: 47 20 72 74 72 65 65 28 69 64 2c 20 78 31 2c 20  G rtree(id, x1, 
3900: 78 32 2c 20 79 31 2c 20 79 32 29 3b 0a 20 20 7d  x2, y1, y2);.  }
3910: 0a 20 20 66 6f 72 65 61 63 68 20 7b 69 64 20 78  .  foreach {id x
3920: 31 20 78 32 20 79 31 20 79 32 7d 20 7b 0a 20 20  1 x2 y1 y2} {.  
3930: 20 20 31 20 20 20 20 2d 34 37 2e 36 34 20 34 33    1    -47.64 43
3940: 2e 38 37 20 20 20 20 33 33 2e 38 36 20 33 34 2e  .87    33.86 34.
3950: 34 32 20 20 20 20 20 20 20 20 32 20 20 20 20 2d  42        2    -
3960: 32 31 2e 35 31 20 31 37 2e 33 32 20 20 20 20 32  21.51 17.32    2
3970: 2e 30 35 20 33 31 2e 30 34 0a 20 20 20 20 33 20  .05 31.04.    3 
3980: 20 20 20 2d 34 33 2e 36 37 20 2d 33 38 2e 33 33     -43.67 -38.33
3990: 20 20 20 20 2d 31 39 2e 37 39 20 33 2e 34 33 20      -19.79 3.43 
39a0: 20 20 20 20 20 20 34 20 20 20 20 33 32 2e 34 31        4    32.41
39b0: 20 33 35 2e 31 36 20 20 20 20 39 2e 31 32 20 31   35.16    9.12 1
39c0: 39 2e 38 32 0a 20 20 20 20 35 20 20 20 20 33 33  9.82.    5    33
39d0: 2e 32 38 20 33 34 2e 38 37 20 20 20 20 31 34 2e  .28 34.87    14.
39e0: 37 38 20 32 38 2e 32 36 20 20 20 20 20 20 20 20  78 28.26        
39f0: 20 36 20 20 20 20 34 39 2e 33 31 20 31 31 36 2e   6    49.31 116.
3a00: 35 39 20 20 20 20 2d 39 2e 38 37 20 37 35 2e 30  59    -9.87 75.0
3a10: 39 0a 20 20 20 20 37 20 20 20 20 2d 31 34 2e 39  9.    7    -14.9
3a20: 33 20 33 34 2e 35 31 20 20 20 20 2d 31 37 2e 36  3 34.51    -17.6
3a30: 34 20 36 34 2e 30 39 20 20 20 20 20 20 20 38 20  4 64.09       8 
3a40: 20 20 20 2d 34 33 2e 30 35 20 32 33 2e 34 33 20     -43.05 23.43 
3a50: 20 20 20 2d 31 2e 31 39 20 36 39 2e 34 34 0a 20     -1.19 69.44. 
3a60: 20 20 20 39 20 20 20 20 34 34 2e 37 39 20 31 33     9    44.79 13
3a70: 33 2e 35 36 20 20 20 20 32 38 2e 30 39 20 38 30  3.56    28.09 80
3a80: 2e 33 30 20 20 20 20 20 20 20 20 31 30 20 20 20  .30        10   
3a90: 20 2d 32 2e 36 36 20 38 31 2e 34 37 20 20 20 20   -2.66 81.47    
3aa0: 2d 34 31 2e 33 38 20 2d 31 30 2e 34 36 0a 20 20  -41.38 -10.46.  
3ab0: 20 20 31 31 20 20 20 20 2d 34 32 2e 38 39 20 2d    11    -42.89 -
3ac0: 33 2e 35 34 20 20 20 20 31 35 2e 37 36 20 37 31  3.54    15.76 71
3ad0: 2e 36 33 20 20 20 20 20 20 20 31 32 20 20 20 20  .63       12    
3ae0: 2d 33 2e 35 30 20 38 34 2e 39 36 20 20 20 20 2d  -3.50 84.96    -
3af0: 31 31 2e 36 34 20 36 34 2e 39 35 0a 20 20 20 20  11.64 64.95.    
3b00: 31 33 20 20 20 20 2d 34 35 2e 36 39 20 32 36 2e  13    -45.69 26.
3b10: 32 35 20 20 20 20 31 31 2e 31 34 20 35 35 2e 30  25    11.14 55.0
3b20: 36 20 20 20 20 20 20 20 31 34 20 20 20 20 2d 34  6       14    -4
3b30: 34 2e 30 39 20 31 31 2e 32 33 20 20 20 20 31 37  4.09 11.23    17
3b40: 2e 35 32 20 34 34 2e 34 35 0a 20 20 20 20 31 35  .52 44.45.    15
3b50: 20 20 20 20 33 36 2e 32 33 20 31 33 33 2e 34 39      36.23 133.49
3b60: 20 20 20 20 2d 31 39 2e 33 38 20 35 33 2e 36 37      -19.38 53.67
3b70: 20 20 20 20 20 20 31 36 20 20 20 20 2d 31 37 2e        16    -17.
3b80: 38 39 20 38 31 2e 35 34 20 20 20 20 31 34 2e 36  89 81.54    14.6
3b90: 34 20 35 30 2e 36 31 0a 20 20 20 20 31 37 20 20  4 50.61.    17  
3ba0: 20 20 2d 34 31 2e 39 37 20 2d 32 34 2e 30 34 20    -41.97 -24.04 
3bb0: 20 20 20 2d 33 39 2e 34 33 20 32 38 2e 39 35 20     -39.43 28.95 
3bc0: 20 20 20 20 31 38 20 20 20 20 2d 35 2e 38 35 20      18    -5.85 
3bd0: 37 2e 37 36 20 20 20 20 2d 36 2e 33 38 20 34 37  7.76    -6.38 47
3be0: 2e 30 32 0a 20 20 20 20 31 39 20 20 20 20 31 38  .02.    19    18
3bf0: 2e 38 32 20 32 37 2e 31 30 20 20 20 20 34 32 2e  .82 27.10    42.
3c00: 38 32 20 31 30 30 2e 30 39 20 20 20 20 20 20 20  82 100.09       
3c10: 32 30 20 20 20 20 33 39 2e 31 37 20 31 31 33 2e  20    39.17 113.
3c20: 34 35 20 20 20 20 32 36 2e 31 34 20 37 33 2e 34  45    26.14 73.4
3c30: 37 0a 20 20 20 20 32 31 20 20 20 20 32 32 2e 33  7.    21    22.3
3c40: 31 20 31 30 33 2e 31 37 20 20 20 20 34 39 2e 39  1 103.17    49.9
3c50: 32 20 31 30 36 2e 30 35 20 20 20 20 20 20 32 32  2 106.05      22
3c60: 20 20 20 20 2d 34 33 2e 30 36 20 34 30 2e 33 38      -43.06 40.38
3c70: 20 20 20 20 2d 31 2e 37 35 20 37 36 2e 30 38 0a      -1.75 76.08.
3c80: 20 20 20 20 32 33 20 20 20 20 32 2e 34 33 20 35      23    2.43 5
3c90: 37 2e 32 37 20 20 20 20 2d 31 34 2e 31 39 20 2d  7.27    -14.19 -
3ca0: 33 2e 38 33 20 20 20 20 20 20 20 20 32 34 20 20  3.83        24  
3cb0: 20 20 2d 34 37 2e 35 37 20 2d 34 2e 33 35 20 20    -47.57 -4.35  
3cc0: 20 20 38 2e 39 33 20 31 30 30 2e 30 36 0a 20 20    8.93 100.06.  
3cd0: 20 20 32 35 20 20 20 20 2d 33 37 2e 34 37 20 34    25    -37.47 4
3ce0: 39 2e 31 34 20 20 20 20 2d 32 39 2e 31 31 20 38  9.14    -29.11 8
3cf0: 2e 38 31 20 20 20 20 20 20 20 32 36 20 20 20 20  .81       26    
3d00: 2d 37 2e 38 36 20 37 35 2e 37 32 20 20 20 20 34  -7.86 75.72    4
3d10: 39 2e 33 34 20 31 30 37 2e 34 32 0a 20 20 20 20  9.34 107.42.    
3d20: 32 37 20 20 20 20 31 2e 35 33 20 34 35 2e 34 39  27    1.53 45.49
3d30: 20 20 20 20 32 30 2e 33 36 20 34 39 2e 37 34 20      20.36 49.74 
3d40: 20 20 20 20 20 20 20 20 32 38 20 20 20 20 2d 34          28    -4
3d50: 38 2e 34 38 20 33 32 2e 35 34 20 20 20 20 32 38  8.48 32.54    28
3d60: 2e 38 31 20 35 34 2e 34 35 0a 20 20 20 20 32 39  .81 54.45.    29
3d70: 20 20 20 20 32 2e 36 37 20 33 39 2e 37 37 20 20      2.67 39.77  
3d80: 20 20 2d 34 2e 30 35 20 31 33 2e 36 37 20 20 20    -4.05 13.67   
3d90: 20 20 20 20 20 20 33 30 20 20 20 20 34 2e 31 31        30    4.11
3da0: 20 36 32 2e 38 38 20 20 20 20 2d 34 37 2e 34 34   62.88    -47.44
3db0: 20 2d 35 2e 37 32 0a 20 20 20 20 33 31 20 20 20   -5.72.    31   
3dc0: 20 2d 32 31 2e 34 37 20 35 31 2e 37 35 20 20 20   -21.47 51.75   
3dd0: 20 33 37 2e 32 35 20 31 31 36 2e 30 39 20 20 20   37.25 116.09   
3de0: 20 20 20 33 32 20 20 20 20 34 35 2e 35 39 20 31     32    45.59 1
3df0: 31 31 2e 33 37 20 20 20 20 2d 36 2e 34 33 20 34  11.37    -6.43 4
3e00: 33 2e 36 34 0a 20 20 20 20 33 33 20 20 20 20 33  3.64.    33    3
3e10: 35 2e 32 33 20 34 38 2e 32 39 20 20 20 20 32 33  5.23 48.29    23
3e20: 2e 35 34 20 31 31 33 2e 33 33 20 20 20 20 20 20  .54 113.33      
3e30: 20 33 34 20 20 20 20 31 36 2e 36 31 20 36 38 2e   34    16.61 68.
3e40: 33 35 20 20 20 20 2d 31 34 2e 36 39 20 36 35 2e  35    -14.69 65.
3e50: 39 37 0a 20 20 20 20 33 35 20 20 20 20 31 33 2e  97.    35    13.
3e60: 39 38 20 31 36 2e 36 30 20 20 20 20 34 38 2e 36  98 16.60    48.6
3e70: 36 20 31 30 32 2e 38 37 20 20 20 20 20 20 20 33  6 102.87       3
3e80: 36 20 20 20 20 31 39 2e 37 34 20 32 33 2e 38 34  6    19.74 23.84
3e90: 20 20 20 20 33 31 2e 31 35 20 37 37 2e 32 37 0a      31.15 77.27.
3ea0: 20 20 20 20 33 37 20 20 20 20 2d 32 37 2e 36 31      37    -27.61
3eb0: 20 32 34 2e 34 33 20 20 20 20 37 2e 39 36 20 39   24.43    7.96 9
3ec0: 34 2e 39 31 20 20 20 20 20 20 20 20 33 38 20 20  4.91        38  
3ed0: 20 20 2d 33 34 2e 37 37 20 31 32 2e 30 35 20 20    -34.77 12.05  
3ee0: 20 20 2d 32 32 2e 36 30 20 2d 36 2e 32 39 0a 20    -22.60 -6.29. 
3ef0: 20 20 20 33 39 20 20 20 20 2d 32 35 2e 38 33 20     39    -25.83 
3f00: 38 2e 37 31 20 20 20 20 2d 31 33 2e 34 38 20 2d  8.71    -13.48 -
3f10: 31 32 2e 35 33 20 20 20 20 20 20 34 30 20 20 20  12.53      40   
3f20: 20 2d 31 37 2e 31 31 20 2d 31 2e 30 31 20 20 20   -17.11 -1.01   
3f30: 20 31 38 2e 30 36 20 36 37 2e 38 39 0a 20 20 20   18.06 67.89.   
3f40: 20 34 31 20 20 20 20 31 34 2e 31 33 20 37 31 2e   41    14.13 71.
3f50: 37 32 20 20 20 20 2d 33 2e 37 38 20 33 39 2e 32  72    -3.78 39.2
3f60: 35 20 20 20 20 20 20 20 20 34 32 20 20 20 20 32  5        42    2
3f70: 33 2e 37 35 20 37 36 2e 30 30 20 20 20 20 2d 31  3.75 76.00    -1
3f80: 36 2e 33 30 20 38 2e 32 33 0a 20 20 20 20 34 33  6.30 8.23.    43
3f90: 20 20 20 20 2d 33 39 2e 31 35 20 32 38 2e 36 33      -39.15 28.63
3fa0: 20 20 20 20 33 38 2e 31 32 20 31 32 35 2e 38 38      38.12 125.88
3fb0: 20 20 20 20 20 20 34 34 20 20 20 20 34 38 2e 36        44    48.6
3fc0: 32 20 38 36 2e 30 39 20 20 20 20 33 36 2e 34 39  2 86.09    36.49
3fd0: 20 31 30 32 2e 39 35 0a 20 20 20 20 34 35 20 20   102.95.    45  
3fe0: 20 20 2d 33 31 2e 33 39 20 2d 32 31 2e 39 38 20    -31.39 -21.98 
3ff0: 20 20 20 32 2e 35 32 20 38 39 2e 37 38 20 20 20     2.52 89.78   
4000: 20 20 20 20 34 36 20 20 20 20 35 2e 36 35 20 35      46    5.65 5
4010: 36 2e 30 34 20 20 20 20 31 35 2e 39 34 20 38 39  6.04    15.94 89
4020: 2e 31 30 0a 20 20 20 20 34 37 20 20 20 20 31 38  .10.    47    18
4030: 2e 32 38 20 39 35 2e 38 31 20 20 20 20 34 36 2e  .28 95.81    46.
4040: 34 36 20 31 34 33 2e 30 38 20 20 20 20 20 20 20  46 143.08       
4050: 34 38 20 20 20 20 33 30 2e 39 33 20 31 30 32 2e  48    30.93 102.
4060: 38 32 20 20 20 20 2d 32 30 2e 30 38 20 33 37 2e  82    -20.08 37.
4070: 33 36 0a 20 20 20 20 34 39 20 20 20 20 2d 32 30  36.    49    -20
4080: 2e 37 38 20 2d 33 2e 34 38 20 20 20 20 2d 35 2e  .78 -3.48    -5.
4090: 35 38 20 33 35 2e 34 36 20 20 20 20 20 20 20 35  58 35.46       5
40a0: 30 20 20 20 20 34 39 2e 38 35 20 39 30 2e 35 38  0    49.85 90.58
40b0: 20 20 20 20 2d 32 34 2e 34 38 20 34 36 2e 32 39      -24.48 46.29
40c0: 0a 20 20 7d 20 7b 0a 20 20 69 66 20 7b 24 78 31  .  } {.  if {$x1
40d0: 20 3e 3d 20 24 78 32 20 7c 7c 20 24 79 31 20 3e   >= $x2 || $y1 >
40e0: 3d 20 24 79 32 7d 20 7b 20 65 72 72 6f 72 20 22  = $y2} { error "
40f0: 24 78 31 20 24 78 32 20 24 79 31 20 24 79 32 22  $x1 $x2 $y1 $y2"
4100: 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 20 63 6f   }.    append co
4110: 6e 74 65 6e 74 73 20 22 49 4e 53 45 52 54 20 49  ntents "INSERT I
4120: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69  NTO t1 VALUES($i
4130: 64 2c 20 24 78 31 2c 20 24 78 32 2c 20 24 79 31  d, $x1, $x2, $y1
4140: 2c 20 24 79 32 29 3b 22 0a 20 20 7d 0a 20 20 73  , $y2);".  }.  s
4150: 65 74 20 71 75 65 72 69 65 73 20 7b 0a 20 20 20  et queries {.   
4160: 20 31 20 20 20 20 22 53 45 4c 45 43 54 20 69 64   1    "SELECT id
4170: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
4180: 31 3e 31 30 20 41 4e 44 20 78 32 3c 34 34 22 0a  1>10 AND x2<44".
4190: 20 20 20 20 32 20 20 20 20 22 53 45 4c 45 43 54      2    "SELECT
41a0: 20 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52   id FROM t1 WHER
41b0: 45 20 79 31 3c 31 30 30 22 0a 20 20 20 20 33 20  E y1<100".    3 
41c0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 20 46 52     "SELECT id FR
41d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 79 31 3c 31  OM t1 WHERE y1<1
41e0: 30 30 20 41 4e 44 20 78 31 3e 30 22 0a 20 20 20  00 AND x1>0".   
41f0: 20 34 20 20 20 20 22 53 45 4c 45 43 54 20 69 64   4    "SELECT id
4200: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 79   FROM t1 WHERE y
4210: 31 3e 31 30 20 41 4e 44 20 78 31 3e 30 20 41 4e  1>10 AND x1>0 AN
4220: 44 20 78 32 3c 35 30 20 41 4e 44 20 79 32 3c 35  D x2<50 AND y2<5
4230: 35 30 22 0a 20 20 7d 0a 20 20 64 6f 5f 61 6c 6c  50".  }.  do_all
4240: 62 61 63 6b 63 6f 6d 70 61 74 5f 74 65 73 74 20  backcompat_test 
4250: 7b 0a 20 20 20 20 69 66 20 7b 5b 63 6f 64 65 31  {.    if {[code1
4260: 20 7b 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f   {set ::sqlite_o
4270: 70 74 69 6f 6e 73 28 66 74 73 33 29 7d 5d 0a 20  ptions(fts3)}]. 
4280: 20 20 20 20 26 26 20 5b 63 6f 64 65 32 20 7b 73      && [code2 {s
4290: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 74 69  et ::sqlite_opti
42a0: 6f 6e 73 28 66 74 73 33 29 7d 5d 0a 20 20 20 20  ons(fts3)}].    
42b0: 7d 20 7b 0a 20 20 0a 20 20 20 20 20 20 64 6f 5f  } {.  .      do_
42c0: 74 65 73 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d  test backcompat-
42d0: 34 2e 31 20 7b 20 73 71 6c 31 20 24 63 6f 6e 74  4.1 { sql1 $cont
42e0: 65 6e 74 73 20 7d 20 7b 7d 0a 20 20 0a 20 20 20  ents } {}.  .   
42f0: 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d     foreach {n q}
4300: 20 24 3a 3a 71 75 65 72 69 65 73 20 7b 0a 20 20   $::queries {.  
4310: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61        do_test ba
4320: 63 6b 63 6f 6d 70 61 74 2d 34 2e 32 2e 24 6e 20  ckcompat-4.2.$n 
4330: 5b 6c 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b  [list sql1 $q] [
4340: 73 71 6c 32 20 24 71 5d 0a 20 20 20 20 20 20 7d  sql2 $q].      }
4350: 0a 20 20 0a 20 20 20 20 20 20 64 6f 5f 74 65 73  .  .      do_tes
4360: 74 20 62 61 63 6b 63 6f 6d 70 61 74 2d 34 2e 33  t backcompat-4.3
4370: 20 7b 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20   { sql1 {.      
4380: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4390: 20 53 45 4c 45 43 54 20 69 64 2b 31 30 30 2c 20   SELECT id+100, 
43a0: 78 31 2b 31 30 2e 30 2c 20 78 32 2b 31 30 2e 30  x1+10.0, x2+10.0
43b0: 2c 20 79 31 2d 31 30 2e 30 2c 20 79 32 2d 31 30  , y1-10.0, y2-10
43c0: 2e 30 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  .0 FROM t1;.    
43d0: 20 20 7d 20 7d 20 7b 7d 0a 20 20 0a 20 20 20 20    } } {}.  .    
43e0: 20 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20    foreach {n q} 
43f0: 24 3a 3a 71 75 65 72 69 65 73 20 7b 0a 20 20 20  $::queries {.   
4400: 20 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63       do_test bac
4410: 6b 63 6f 6d 70 61 74 2d 34 2e 34 2e 24 6e 20 5b  kcompat-4.4.$n [
4420: 6c 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73  list sql1 $q] [s
4430: 71 6c 32 20 24 71 5d 0a 20 20 20 20 20 20 7d 0a  ql2 $q].      }.
4440: 20 20 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74    .      do_test
4450: 20 62 61 63 6b 63 6f 6d 70 61 74 2d 34 2e 35 20   backcompat-4.5 
4460: 7b 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 20  { sql2 {.       
4470: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4480: 53 45 4c 45 43 54 20 69 64 2b 32 30 30 2c 20 78  SELECT id+200, x
4490: 31 2b 32 30 2e 30 2c 20 78 32 2b 32 30 2e 30 2c  1+20.0, x2+20.0,
44a0: 20 79 31 2d 32 30 2e 30 2c 20 79 32 2d 32 30 2e   y1-20.0, y2-20.
44b0: 30 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  0 FROM t1;.     
44c0: 20 7d 20 7d 20 7b 7d 0a 20 20 0a 20 20 20 20 20   } } {}.  .     
44d0: 20 66 6f 72 65 61 63 68 20 7b 6e 20 71 7d 20 24   foreach {n q} $
44e0: 3a 3a 71 75 65 72 69 65 73 20 7b 0a 20 20 20 20  ::queries {.    
44f0: 20 20 20 20 64 6f 5f 74 65 73 74 20 62 61 63 6b      do_test back
4500: 63 6f 6d 70 61 74 2d 34 2e 36 2e 24 6e 20 5b 6c  compat-4.6.$n [l
4510: 69 73 74 20 73 71 6c 31 20 24 71 5d 20 5b 73 71  ist sql1 $q] [sq
4520: 6c 32 20 24 71 5d 0a 20 20 20 20 20 20 7d 0a 20  l2 $q].      }. 
4530: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 66   .    }.  }.}..f
4540: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.