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