xref: /sqlite-3.40.0/test/backcompat.test (revision de503eb1)
18311c47dSdan# 2010 August 19
28311c47dSdan#
38311c47dSdan# The author disclaims copyright to this source code.  In place of
48311c47dSdan# a legal notice, here is a blessing:
58311c47dSdan#
68311c47dSdan#    May you do good and not evil.
78311c47dSdan#    May you find forgiveness for yourself and forgive others.
88311c47dSdan#    May you share freely, never taking more than you give.
98311c47dSdan#
108311c47dSdan#***********************************************************************
118311c47dSdan# This file implements regression tests for SQLite library.  The
128311c47dSdan# focus of this file is testing that the current version of SQLite
138311c47dSdan# is capable of reading and writing databases created by previous
148311c47dSdan# versions, and vice-versa.
158311c47dSdan#
168311c47dSdan# To use this test, old versions of the testfixture process should be
178311c47dSdan# copied into the working directory alongside the new version. The old
188311c47dSdan# versions should be named "testfixtureXXX" (or testfixtureXXX.exe on
198311c47dSdan# windows), where XXX can be any string.
208311c47dSdan#
218311c47dSdan# This test file uses the tcl code for controlling a second testfixture
228311c47dSdan# process located in lock_common.tcl. See the commments in lock_common.tcl
238311c47dSdan# for documentation of the available commands.
248311c47dSdan#
258311c47dSdan
268311c47dSdanset testdir [file dirname $argv0]
278311c47dSdansource $testdir/tester.tcl
288311c47dSdansource $testdir/lock_common.tcl
298311c47dSdansource $testdir/malloc_common.tcl
3074f47e1dSdansource $testdir/bc_common.tcl
31a35dafcdSdandb close
328311c47dSdan
3374f47e1dSdanif {"" == [bc_find_binaries backcompat.test]} {
348311c47dSdan  finish_test
358311c47dSdan  return
368311c47dSdan}
378311c47dSdan
38a35dafcdSdanproc do_backcompat_test {rv bin1 bin2 script} {
398311c47dSdan
40fda06befSmistachkin  forcedelete test.db
41a35dafcdSdan
42a35dafcdSdan  if {$bin1 != ""} { set ::bc_chan1 [launch_testfixture $bin1] }
43a35dafcdSdan  set ::bc_chan2 [launch_testfixture $bin2]
448311c47dSdan
458311c47dSdan  if { $rv } {
468311c47dSdan    proc code2 {tcl} { uplevel #0 $tcl }
47a35dafcdSdan    if {$bin1 != ""} { proc code2 {tcl} { testfixture $::bc_chan1 $tcl } }
48a35dafcdSdan    proc code1 {tcl} { testfixture $::bc_chan2 $tcl }
498311c47dSdan  } else {
508311c47dSdan    proc code1 {tcl} { uplevel #0 $tcl }
51a35dafcdSdan    if {$bin1 != ""} { proc code1 {tcl} { testfixture $::bc_chan1 $tcl } }
52a35dafcdSdan    proc code2 {tcl} { testfixture $::bc_chan2 $tcl }
538311c47dSdan  }
548311c47dSdan
558311c47dSdan  proc sql1 sql { code1 [list db eval $sql] }
568311c47dSdan  proc sql2 sql { code2 [list db eval $sql] }
578311c47dSdan
588311c47dSdan  code1 { sqlite3 db test.db }
598311c47dSdan  code2 { sqlite3 db test.db }
608311c47dSdan
61e8238481Sdan  foreach c {code1 code2} {
62e8238481Sdan    $c {
63e8238481Sdan      set v [split [db version] .]
64e8238481Sdan      if {[llength $v]==3} {lappend v 0}
65e8238481Sdan      set ::sqlite_libversion [format \
66c7dbce0fSdan        "%d%.2d%.2d%.2d" [lindex $v 0] [lindex $v 1] [lindex $v 2] [lindex $v 3]
67e8238481Sdan      ]
68e8238481Sdan    }
69e8238481Sdan  }
70e8238481Sdan
718311c47dSdan  uplevel $script
728311c47dSdan
738311c47dSdan  catch { code1 { db close } }
748311c47dSdan  catch { code2 { db close } }
75a35dafcdSdan  catch { close $::bc_chan2 }
76a35dafcdSdan  catch { close $::bc_chan1 }
77e8238481Sdan
78e8238481Sdan
798311c47dSdan}
808311c47dSdan
818311c47dSdanarray set ::incompatible [list]
828311c47dSdanproc do_allbackcompat_test {script} {
838311c47dSdan
8474f47e1dSdan  foreach bin $::BC(binaries) {
858311c47dSdan    set nErr [set_test_counter errors]
868311c47dSdan    foreach dir {0 1} {
878311c47dSdan
88*de503eb1Sdan      set bintag $bin
89*de503eb1Sdan      regsub {.*testfixture\.} $bintag {} bintag
905ad723f4Sshaneh      set bintag [string map {\.exe {}} $bintag]
91fc5026d3Sdan      if {$bintag == ""} {set bintag self}
92fc5026d3Sdan      set ::bcname ".$bintag.$dir."
938311c47dSdan
948311c47dSdan      rename do_test _do_test
958311c47dSdan      proc do_test {nm sql res} {
968311c47dSdan        set nm [regsub {\.} $nm $::bcname]
978311c47dSdan        uplevel [list _do_test $nm $sql $res]
988311c47dSdan      }
998311c47dSdan
100a35dafcdSdan      do_backcompat_test $dir {} $bin $script
1018311c47dSdan
1028311c47dSdan      rename do_test {}
1038311c47dSdan      rename _do_test do_test
1048311c47dSdan    }
1058311c47dSdan    if { $nErr < [set_test_counter errors] } {
1068311c47dSdan      set ::incompatible([get_version $bin]) 1
1078311c47dSdan    }
1088311c47dSdan  }
1098311c47dSdan}
1108311c47dSdan
1118311c47dSdanproc read_file {zFile} {
1128311c47dSdan  set zData {}
1139ab7fe87Sdan  if {[file exists $zFile]} {
1148311c47dSdan    set fd [open $zFile]
1158311c47dSdan    fconfigure $fd -translation binary -encoding binary
1169ab7fe87Sdan
1179ab7fe87Sdan    if {[file size $zFile]<=$::sqlite_pending_byte || $zFile != "test.db"} {
1188311c47dSdan      set zData [read $fd]
1199ab7fe87Sdan    } else {
1209ab7fe87Sdan      set zData [read $fd $::sqlite_pending_byte]
1219ab7fe87Sdan      append zData [string repeat x 512]
1229ab7fe87Sdan      seek $fd [expr $::sqlite_pending_byte+512] start
1239ab7fe87Sdan      append zData [read $fd]
1249ab7fe87Sdan    }
1259ab7fe87Sdan
1268311c47dSdan    close $fd
1278311c47dSdan  }
1288311c47dSdan  return $zData
1298311c47dSdan}
1308311c47dSdanproc write_file {zFile zData} {
1318311c47dSdan  set fd [open $zFile w]
1328311c47dSdan  fconfigure $fd -translation binary -encoding binary
1338311c47dSdan  puts -nonewline $fd $zData
1348311c47dSdan  close $fd
1358311c47dSdan}
1368311c47dSdanproc read_file_system {} {
1378311c47dSdan  set ret [list]
1388311c47dSdan  foreach f {test.db test.db-journal test.db-wal} { lappend ret [read_file $f] }
1398311c47dSdan  set ret
1408311c47dSdan}
1418311c47dSdanproc write_file_system {data} {
1428311c47dSdan  foreach f {test.db test.db-journal test.db-wal} d $data {
1438311c47dSdan    if {[string length $d] == 0} {
144fda06befSmistachkin      forcedelete $f
1458311c47dSdan    } else {
1468311c47dSdan      write_file $f $d
1478311c47dSdan    }
1488311c47dSdan  }
1498311c47dSdan}
1508311c47dSdan
1518311c47dSdan#-------------------------------------------------------------------------
1528311c47dSdan# Actual tests begin here.
1538311c47dSdan#
154fc5026d3Sdan# This first block of tests checks to see that the same database and
155fc5026d3Sdan# journal files can be used by old and new versions. WAL and wal-index
156fc5026d3Sdan# files are tested separately below.
157fc5026d3Sdan#
1588311c47dSdando_allbackcompat_test {
1598311c47dSdan
1608311c47dSdan  # Test that database files are backwards compatible.
1618311c47dSdan  #
1628311c47dSdan  do_test backcompat-1.1.1 { sql1 {
1638311c47dSdan    CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
1648311c47dSdan    INSERT INTO t1 VALUES('abc', 'def');
1658311c47dSdan  } } {}
1668311c47dSdan  do_test backcompat-1.1.2 { sql2 { SELECT * FROM t1; } } {abc def}
1678311c47dSdan  do_test backcompat-1.1.3 { sql2 { INSERT INTO t1 VALUES('ghi', 'jkl'); } } {}
1688311c47dSdan  do_test backcompat-1.1.4 { sql1 { SELECT * FROM t1; } } {abc def ghi jkl}
1698311c47dSdan  do_test backcompat-1.1.5 { sql1 { PRAGMA integrity_check } } {ok}
1708311c47dSdan  do_test backcompat-1.1.6 { sql2 { PRAGMA integrity_check } } {ok}
1718311c47dSdan
1728311c47dSdan  # Test that one version can roll back a hot-journal file left in the
1738311c47dSdan  # file-system by the other version.
1748311c47dSdan  #
175a35dafcdSdan  # Each test case is named "backcompat-1.X...", where X is either 0 or
176a35dafcdSdan  # 1. If it is 0, then the current version creates a journal file that
177a35dafcdSdan  # the old versions try to read. Otherwise, if X is 1, then the old version
178a35dafcdSdan  # creates the journal file and we try to read it with the current version.
179a35dafcdSdan  #
1808311c47dSdan  do_test backcompat-1.2.1 { sql1 {
1818311c47dSdan    PRAGMA cache_size = 10;
1828311c47dSdan    BEGIN;
1838311c47dSdan      INSERT INTO t1 VALUES(randomblob(400), randomblob(400));
1848311c47dSdan      INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1;
1858311c47dSdan      INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1;
1868311c47dSdan      INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1;
1878311c47dSdan      INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM t1;
1888311c47dSdan    COMMIT;
1898311c47dSdan  } } {}
1908311c47dSdan  set cksum1 [sql1 {SELECT md5sum(a), md5sum(b) FROM t1}]
1918311c47dSdan  set cksum2 [sql2 {SELECT md5sum(a), md5sum(b) FROM t1}]
1928311c47dSdan  do_test backcompat-1.2.2 [list string compare $cksum1 $cksum2] 0
1938311c47dSdan
1948311c47dSdan  do_test backcompat-1.2.3 { sql1 {
1958311c47dSdan    BEGIN;
1968311c47dSdan      UPDATE t1 SET a = randomblob(500);
1978311c47dSdan  } } {}
1988311c47dSdan  set data [read_file_system]
199a35dafcdSdan
2008311c47dSdan  do_test backcompat-1.2.4 { sql1 { COMMIT } } {}
2018311c47dSdan
2028311c47dSdan  set same [expr {[sql2 {SELECT md5sum(a), md5sum(b) FROM t1}] == $cksum2}]
2038311c47dSdan  do_test backcompat-1.2.5 [list set {} $same] 0
2048311c47dSdan
205a35dafcdSdan  code1 { db close }
206a35dafcdSdan  code2 { db close }
2078311c47dSdan  write_file_system $data
208a35dafcdSdan  code1 { sqlite3 db test.db }
209a35dafcdSdan  code2 { sqlite3 db test.db }
210a35dafcdSdan
2118311c47dSdan  set same [expr {[sql2 {SELECT md5sum(a), md5sum(b) FROM t1}] == $cksum2}]
2128311c47dSdan  do_test backcompat-1.2.6 [list set {} $same] 1
2138311c47dSdan
214a35dafcdSdan  do_test backcompat-1.2.7 { sql1 { PRAGMA integrity_check } } {ok}
2158311c47dSdan  do_test backcompat-1.2.8 { sql2 { PRAGMA integrity_check } } {ok}
21642533337Sdrh
21742533337Sdrh  do_test backcompat-2.1 {
21842533337Sdrh    sql1 {
21942533337Sdrh      CREATE TABLE t2(a UNIQUE, b PRIMARY KEY, c UNIQUE);
2207b3d1860Sdan      INSERT INTO t2 VALUES(1,9,5);
2217b3d1860Sdan      INSERT INTO t2 VALUES(5,5,1);
2227b3d1860Sdan      INSERT INTO t2 VALUES(9,1,9);
22342533337Sdrh      SELECT * FROM t2 ORDER BY a;
22442533337Sdrh    }
22542533337Sdrh  } {1 9 5 5 5 1 9 1 9}
22642533337Sdrh  do_test backcompat-2.2 {
22742533337Sdrh    sql2 {
2287b3d1860Sdan      SELECT * FROM sqlite_master WHERE rootpage=-1;
22942533337Sdrh      SELECT * FROM t2 ORDER BY a;
23042533337Sdrh    }
23142533337Sdrh  } {1 9 5 5 5 1 9 1 9}
23242533337Sdrh  do_test backcompat-2.3 {
23342533337Sdrh    sql1 {
23442533337Sdrh      SELECT * FROM t2 ORDER BY b;
23542533337Sdrh    }
23642533337Sdrh  } {9 1 9 5 5 1 1 9 5}
23742533337Sdrh  do_test backcompat-2.4 {
23842533337Sdrh    sql2 {
23942533337Sdrh      SELECT * FROM t2 ORDER BY b;
24042533337Sdrh    }
24142533337Sdrh  } {9 1 9 5 5 1 1 9 5}
24242533337Sdrh  do_test backcompat-2.5 {
24342533337Sdrh    sql1 {
24442533337Sdrh      SELECT * FROM t2 ORDER BY c;
24542533337Sdrh    }
24642533337Sdrh  } {5 5 1 1 9 5 9 1 9}
24742533337Sdrh  do_test backcompat-2.6 {
24842533337Sdrh    sql2 {
24942533337Sdrh      SELECT * FROM t2 ORDER BY c;
25042533337Sdrh    }
25142533337Sdrh  } {5 5 1 1 9 5 9 1 9}
2528311c47dSdan}
2538311c47dSdanforeach k [lsort [array names ::incompatible]] {
254fc5026d3Sdan  puts "ERROR: Detected journal incompatibility with version $k"
255fc5026d3Sdan}
256fc5026d3Sdanunset ::incompatible
257fc5026d3Sdan
258fc5026d3Sdan
259fc5026d3Sdan#-------------------------------------------------------------------------
260fc5026d3Sdan# Test that WAL and wal-index files may be shared between different
261fc5026d3Sdan# SQLite versions.
262fc5026d3Sdan#
263fc5026d3Sdando_allbackcompat_test {
264fc5026d3Sdan  if {[code1 {sqlite3 -version}] >= "3.7.0"
26566498ae8Smistachkin   && [code1 {set ::sqlite_options(wal)}]
266fc5026d3Sdan   && [code2 {sqlite3 -version}] >= "3.7.0"
26766498ae8Smistachkin   && [code2 {set ::sqlite_options(wal)}]
268fc5026d3Sdan  } {
269fc5026d3Sdan
270fc5026d3Sdan    do_test backcompat-2.1.1 { sql1 {
271fc5026d3Sdan      PRAGMA journal_mode = WAL;
272fc5026d3Sdan      CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
273fc5026d3Sdan      INSERT INTO t1 VALUES('I', 1);
274fc5026d3Sdan      INSERT INTO t1 VALUES('II', 2);
275fc5026d3Sdan      INSERT INTO t1 VALUES('III', 3);
276fc5026d3Sdan      SELECT * FROM t1;
277fc5026d3Sdan    } } {wal I 1 II 2 III 3}
278fc5026d3Sdan    do_test backcompat-2.1.2 { sql2 {
279fc5026d3Sdan      SELECT * FROM t1;
280fc5026d3Sdan    } } {I 1 II 2 III 3}
281fc5026d3Sdan
282fc5026d3Sdan    set data [read_file_system]
283fc5026d3Sdan    code1 {db close}
284fc5026d3Sdan    code2 {db close}
285fc5026d3Sdan    write_file_system $data
286fc5026d3Sdan    code1 {sqlite3 db test.db}
287fc5026d3Sdan    code2 {sqlite3 db test.db}
288fc5026d3Sdan
289fc5026d3Sdan    # The WAL file now in the file-system was created by the [code1]
290fc5026d3Sdan    # process. Check that the [code2] process can recover the log.
291fc5026d3Sdan    #
292fc5026d3Sdan    do_test backcompat-2.1.3 { sql2 {
293fc5026d3Sdan      SELECT * FROM t1;
294fc5026d3Sdan    } } {I 1 II 2 III 3}
295fc5026d3Sdan    do_test backcompat-2.1.4 { sql1 {
296fc5026d3Sdan      SELECT * FROM t1;
297fc5026d3Sdan    } } {I 1 II 2 III 3}
298fc5026d3Sdan  }
2998311c47dSdan}
3008311c47dSdan
301c99415d2Sdan#-------------------------------------------------------------------------
302c99415d2Sdan# Test that FTS3 tables may be read/written by different versions of
303c99415d2Sdan# SQLite.
304c99415d2Sdan#
3055cfed52dSdanifcapable fts3 {
306c99415d2Sdan  set contents {
307c99415d2Sdan    CREATE VIRTUAL TABLE t1 USING fts3(a, b);
308c99415d2Sdan  }
309c99415d2Sdan  foreach {num doc} {
310c99415d2Sdan    one "jk zm jk eczkjblu urvysbnykk sk gnl jk ttvgf hmjf"
311c99415d2Sdan    two "jk bnhc jjrxpjkb mjpavjuhw fibokdry igju jk zm zm xh"
312c99415d2Sdan    three "wxe ogttbykvt uhzq xr iaf zf urvysbnykk aayxpmve oacaxgjoo mjpavjuhw"
313c99415d2Sdan    four "gazrt jk ephknonq myjp uenvbm wuvajhwqz jk zm xnxhf nvfasfh"
314c99415d2Sdan    five "zm aayxpmve csjqxhgj xnxhf xr jk aayxpmve xnxhf zm zm"
315c99415d2Sdan    six "sokcyf zm ogyavjvv jk zm fibokdry zm jk igju igju"
316c99415d2Sdan    seven "vgsld bvgimjik xuprtlyle jk akmikrqyt jk aayxpmve hkfoudzftq ddjj"
317c99415d2Sdan    eight "zm uhzq ovkyevlgv zk uenvbm csjqxhgj jk vgsld pgybs jk"
318c99415d2Sdan    nine  "zm agmckuiu zexh fibokdry jk uhzq bu tugflixoex xnxhf sk"
319c99415d2Sdan  } {
320c99415d2Sdan    append contents "INSERT INTO t1 VALUES('$num', '$doc');"
321c99415d2Sdan  }
322c99415d2Sdan  do_allbackcompat_test {
323c99415d2Sdan    if {[code1 {set ::sqlite_options(fts3)}]
324c99415d2Sdan     && [code2 {set ::sqlite_options(fts3)}]
325c99415d2Sdan    } {
326c99415d2Sdan
327c99415d2Sdan      do_test backcompat-3.1 { sql1 $contents } {}
328c99415d2Sdan
329c99415d2Sdan      foreach {n q} {
330c99415d2Sdan        1    "SELECT * FROM t1 ORDER BY a, b"
331c99415d2Sdan        2    "SELECT rowid FROM t1 WHERE a MATCH 'five'"
332c99415d2Sdan        3    "SELECT * FROM t1 WHERE a MATCH 'five'"
333c99415d2Sdan        4    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'jk'"
334c99415d2Sdan        5    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'tug* OR eight'"
335c99415d2Sdan      } {
336c99415d2Sdan        do_test backcompat-3.2 [list sql1 $q] [sql2 $q]
337c99415d2Sdan      }
338c99415d2Sdan
339c99415d2Sdan      do_test backcompat-3.3 { sql1 {
340c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
341c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
342c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
343c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
344c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
345c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
346c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
347c99415d2Sdan        INSERT INTO t1 SELECT * FROM t1;
348c99415d2Sdan      } } {}
349c99415d2Sdan
350c99415d2Sdan      foreach {n q} {
351c99415d2Sdan        1    "SELECT * FROM t1 ORDER BY a, b"
352c99415d2Sdan        2    "SELECT rowid FROM t1 WHERE a MATCH 'five'"
353c99415d2Sdan        3    "SELECT * FROM t1 WHERE a MATCH 'five'"
354c99415d2Sdan        4    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'jk'"
355c99415d2Sdan        5    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'tug* OR eight'"
356c99415d2Sdan      } {
357c99415d2Sdan        do_test backcompat-3.4 [list sql1 $q] [sql2 $q]
358c99415d2Sdan      }
359c99415d2Sdan
360c99415d2Sdan      set alphabet "a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4"
361c99415d2Sdan      for {set i 0} {$i < 900} {incr i} {
362c99415d2Sdan        set term "[lindex $alphabet [expr $i/30]][lindex $alphabet [expr $i%30]] "
363c99415d2Sdan        sql1 "INSERT INTO t1 VALUES($i, '[string repeat $term 14]')"
364c99415d2Sdan      }
365c99415d2Sdan
366c99415d2Sdan      foreach {n q} {
367c99415d2Sdan        1    "SELECT * FROM t1 ORDER BY a, b"
368c99415d2Sdan        2    "SELECT rowid FROM t1 WHERE a MATCH 'five'"
369c99415d2Sdan        3    "SELECT * FROM t1 WHERE a MATCH 'five'"
370c99415d2Sdan        4    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'jk'"
371c99415d2Sdan        5    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'tug* OR eight'"
372c99415d2Sdan
373c99415d2Sdan        6    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'aa'"
374c99415d2Sdan        7    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH '44'"
375c99415d2Sdan        8    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'a*'"
376c99415d2Sdan      } {
377c99415d2Sdan        do_test backcompat-3.5 [list sql1 $q] [sql2 $q]
378c99415d2Sdan      }
379c99415d2Sdan
380c99415d2Sdan      do_test backcompat-3.6 {
381c99415d2Sdan        sql1 "SELECT optimize(t1) FROM t1 LIMIT 1"
382c99415d2Sdan      } {{Index optimized}}
383c99415d2Sdan
384c99415d2Sdan      foreach {n q} {
385c99415d2Sdan        1    "SELECT * FROM t1 ORDER BY a, b"
386c99415d2Sdan        2    "SELECT rowid FROM t1 WHERE a MATCH 'five'"
387c99415d2Sdan        3    "SELECT * FROM t1 WHERE a MATCH 'five'"
388c99415d2Sdan        4    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'jk'"
389c99415d2Sdan        5    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'tug* OR eight'"
390c99415d2Sdan
391c99415d2Sdan        6    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'aa'"
392c99415d2Sdan        7    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH '44'"
393c99415d2Sdan        8    "SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'a*'"
394c99415d2Sdan      } {
395c99415d2Sdan        do_test backcompat-3.7 [list sql1 $q] [sql2 $q]
396c99415d2Sdan      }
397e8238481Sdan
398e8238481Sdan      # Now test that an incremental merge can be started by one version
399e8238481Sdan      # and finished by another. And that the integrity-check still
400e8238481Sdan      # passes.
401e8238481Sdan      do_test backcompat-3.8 {
402e8238481Sdan        sql1 {
403e8238481Sdan          DROP TABLE IF EXISTS t1;
404e8238481Sdan          DROP TABLE IF EXISTS t2;
405e8238481Sdan          CREATE TABLE t1(docid, words);
406e8238481Sdan          CREATE VIRTUAL TABLE t2 USING fts3(words);
407e8238481Sdan        }
408e8238481Sdan        code1 [list source $testdir/genesis.tcl]
409e8238481Sdan        code1 { fts_kjv_genesis }
410e8238481Sdan        sql1 {
411e8238481Sdan          INSERT INTO t2 SELECT words FROM t1;
412e8238481Sdan          INSERT INTO t2 SELECT words FROM t1;
413e8238481Sdan          INSERT INTO t2 SELECT words FROM t1;
414e8238481Sdan          INSERT INTO t2 SELECT words FROM t1;
415e8238481Sdan          INSERT INTO t2 SELECT words FROM t1;
416e8238481Sdan          INSERT INTO t2 SELECT words FROM t1;
417e8238481Sdan          SELECT level, group_concat(idx, ' ') FROM t2_segdir GROUP BY level;
418e8238481Sdan        }
419e8238481Sdan      } {0 {0 1 2 3 4 5}}
420e8238481Sdan
421e8238481Sdan      if {[code1 { set ::sqlite_libversion }] >=3071200
422e8238481Sdan       && [code2 { set ::sqlite_libversion }] >=3071200
423e8238481Sdan      } {
424c7dbce0fSdan        if {[code1 { set ::sqlite_libversion }]<3120000} {
425c7dbce0fSdan          set res {0 {0 1} 1 0}
426c7dbce0fSdan        } else {
427c7dbce0fSdan          set res {1 0}
428c7dbce0fSdan        }
429c7dbce0fSdan
430e8238481Sdan        do_test backcompat-3.9 {
431e8238481Sdan          sql1 { INSERT INTO t2(t2) VALUES('merge=100,4'); }
432e8238481Sdan          sql2 { INSERT INTO t2(t2) VALUES('merge=100,4'); }
433e8238481Sdan          sql1 { INSERT INTO t2(t2) VALUES('merge=100,4'); }
434e8238481Sdan          sql2 { INSERT INTO t2(t2) VALUES('merge=2500,4'); }
435e8238481Sdan          sql2 {
436e8238481Sdan            SELECT level, group_concat(idx, ' ') FROM t2_segdir GROUP BY level;
437e8238481Sdan          }
438c7dbce0fSdan        } $res
439e8238481Sdan
440e8238481Sdan        do_test backcompat-3.10 {
441e8238481Sdan          sql1 { INSERT INTO t2(t2) VALUES('integrity-check') }
442e8238481Sdan          sql2 { INSERT INTO t2(t2) VALUES('integrity-check') }
443e8238481Sdan        } {}
444e8238481Sdan      }
445c99415d2Sdan    }
446c99415d2Sdan  }
4475cfed52dSdan}
448c99415d2Sdan
4491c152101Sdan#-------------------------------------------------------------------------
4501c152101Sdan# Test that Rtree tables may be read/written by different versions of
4511c152101Sdan# SQLite.
4521c152101Sdan#
4535cfed52dSdanifcapable rtree {
4541c152101Sdan  set contents {
4551c152101Sdan    CREATE VIRTUAL TABLE t1 USING rtree(id, x1, x2, y1, y2);
4561c152101Sdan  }
4571c152101Sdan  foreach {id x1 x2 y1 y2} {
4581c152101Sdan    1    -47.64 43.87    33.86 34.42        2    -21.51 17.32    2.05 31.04
4591c152101Sdan    3    -43.67 -38.33    -19.79 3.43       4    32.41 35.16    9.12 19.82
4601c152101Sdan    5    33.28 34.87    14.78 28.26         6    49.31 116.59    -9.87 75.09
4611c152101Sdan    7    -14.93 34.51    -17.64 64.09       8    -43.05 23.43    -1.19 69.44
4621c152101Sdan    9    44.79 133.56    28.09 80.30        10    -2.66 81.47    -41.38 -10.46
4631c152101Sdan    11    -42.89 -3.54    15.76 71.63       12    -3.50 84.96    -11.64 64.95
4641c152101Sdan    13    -45.69 26.25    11.14 55.06       14    -44.09 11.23    17.52 44.45
4651c152101Sdan    15    36.23 133.49    -19.38 53.67      16    -17.89 81.54    14.64 50.61
4661c152101Sdan    17    -41.97 -24.04    -39.43 28.95     18    -5.85 7.76    -6.38 47.02
4671c152101Sdan    19    18.82 27.10    42.82 100.09       20    39.17 113.45    26.14 73.47
4681c152101Sdan    21    22.31 103.17    49.92 106.05      22    -43.06 40.38    -1.75 76.08
4691c152101Sdan    23    2.43 57.27    -14.19 -3.83        24    -47.57 -4.35    8.93 100.06
4701c152101Sdan    25    -37.47 49.14    -29.11 8.81       26    -7.86 75.72    49.34 107.42
4711c152101Sdan    27    1.53 45.49    20.36 49.74         28    -48.48 32.54    28.81 54.45
4721c152101Sdan    29    2.67 39.77    -4.05 13.67         30    4.11 62.88    -47.44 -5.72
4731c152101Sdan    31    -21.47 51.75    37.25 116.09      32    45.59 111.37    -6.43 43.64
4741c152101Sdan    33    35.23 48.29    23.54 113.33       34    16.61 68.35    -14.69 65.97
4751c152101Sdan    35    13.98 16.60    48.66 102.87       36    19.74 23.84    31.15 77.27
4761c152101Sdan    37    -27.61 24.43    7.96 94.91        38    -34.77 12.05    -22.60 -6.29
4771c152101Sdan    39    -25.83 8.71    -13.48 -12.53      40    -17.11 -1.01    18.06 67.89
4781c152101Sdan    41    14.13 71.72    -3.78 39.25        42    23.75 76.00    -16.30 8.23
4791c152101Sdan    43    -39.15 28.63    38.12 125.88      44    48.62 86.09    36.49 102.95
4801c152101Sdan    45    -31.39 -21.98    2.52 89.78       46    5.65 56.04    15.94 89.10
4811c152101Sdan    47    18.28 95.81    46.46 143.08       48    30.93 102.82    -20.08 37.36
4821c152101Sdan    49    -20.78 -3.48    -5.58 35.46       50    49.85 90.58    -24.48 46.29
4831c152101Sdan  } {
4841c152101Sdan  if {$x1 >= $x2 || $y1 >= $y2} { error "$x1 $x2 $y1 $y2" }
4851c152101Sdan    append contents "INSERT INTO t1 VALUES($id, $x1, $x2, $y1, $y2);"
4861c152101Sdan  }
4871c152101Sdan  set queries {
4881c152101Sdan    1    "SELECT id FROM t1 WHERE x1>10 AND x2<44"
4891c152101Sdan    2    "SELECT id FROM t1 WHERE y1<100"
4901c152101Sdan    3    "SELECT id FROM t1 WHERE y1<100 AND x1>0"
4911c152101Sdan    4    "SELECT id FROM t1 WHERE y1>10 AND x1>0 AND x2<50 AND y2<550"
4921c152101Sdan  }
4931c152101Sdan  do_allbackcompat_test {
4941c152101Sdan    if {[code1 {set ::sqlite_options(fts3)}]
4951c152101Sdan     && [code2 {set ::sqlite_options(fts3)}]
4961c152101Sdan    } {
4971c152101Sdan
4981c152101Sdan      do_test backcompat-4.1 { sql1 $contents } {}
4991c152101Sdan
5001c152101Sdan      foreach {n q} $::queries {
5011c152101Sdan        do_test backcompat-4.2.$n [list sql1 $q] [sql2 $q]
5021c152101Sdan      }
5031c152101Sdan
5041c152101Sdan      do_test backcompat-4.3 { sql1 {
5051c152101Sdan        INSERT INTO t1 SELECT id+100, x1+10.0, x2+10.0, y1-10.0, y2-10.0 FROM t1;
5061c152101Sdan      } } {}
5071c152101Sdan
5081c152101Sdan      foreach {n q} $::queries {
5091c152101Sdan        do_test backcompat-4.4.$n [list sql1 $q] [sql2 $q]
5101c152101Sdan      }
5111c152101Sdan
5121c152101Sdan      do_test backcompat-4.5 { sql2 {
5131c152101Sdan        INSERT INTO t1 SELECT id+200, x1+20.0, x2+20.0, y1-20.0, y2-20.0 FROM t1;
5141c152101Sdan      } } {}
5151c152101Sdan
5161c152101Sdan      foreach {n q} $::queries {
5171c152101Sdan        do_test backcompat-4.6.$n [list sql1 $q] [sql2 $q]
5181c152101Sdan      }
5191c152101Sdan
5201c152101Sdan    }
5211c152101Sdan  }
5225cfed52dSdan}
5231c152101Sdan
5248311c47dSdanfinish_test
525