1# 2014-11-27 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12# This file contains test cases for b-tree logic. 13# 14 15set testdir [file dirname $argv0] 16source $testdir/tester.tcl 17set testprefix btree01 18 19# The refactoring on the b-tree balance() routine in check-in 20# http://www.sqlite.org/src/info/face33bea1ba3a (2014-10-27) 21# caused the integrity_check on the following SQL to fail. 22# 23do_execsql_test btree01-1.1 { 24 PRAGMA page_size=65536; 25 CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB); 26 WITH RECURSIVE 27 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 28 INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; 29 UPDATE t1 SET b=zeroblob(3000); 30 UPDATE t1 SET b=zeroblob(64000) WHERE a=2; 31 PRAGMA integrity_check; 32} {ok} 33 34# The previous test is sufficient to prevent a regression. But we 35# add a number of additional tests to stress the balancer in similar 36# ways, looking for related problems. 37# 38for {set i 1} {$i<=30} {incr i} { 39 do_test btree01-1.2.$i { 40 db eval { 41 DELETE FROM t1; 42 WITH RECURSIVE 43 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 44 INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; 45 UPDATE t1 SET b=zeroblob(3000); 46 UPDATE t1 SET b=zeroblob(64000) WHERE a=$::i; 47 PRAGMA integrity_check; 48 } 49 } {ok} 50} 51for {set i 1} {$i<=30} {incr i} { 52 do_test btree01-1.3.$i { 53 db eval { 54 DELETE FROM t1; 55 WITH RECURSIVE 56 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 57 INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; 58 UPDATE t1 SET b=zeroblob(2000); 59 UPDATE t1 SET b=zeroblob(64000) WHERE a=$::i; 60 PRAGMA integrity_check; 61 } 62 } {ok} 63} 64for {set i 1} {$i<=30} {incr i} { 65 do_test btree01-1.4.$i { 66 db eval { 67 DELETE FROM t1; 68 WITH RECURSIVE 69 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 70 INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; 71 UPDATE t1 SET b=zeroblob(6499) WHERE (a%3)==0; 72 UPDATE t1 SET b=zeroblob(6499) WHERE (a%3)==1; 73 UPDATE t1 SET b=zeroblob(6499) WHERE (a%3)==2; 74 UPDATE t1 SET b=zeroblob(64000) WHERE a=$::i; 75 PRAGMA integrity_check; 76 } 77 } {ok} 78} 79for {set i 1} {$i<=30} {incr i} { 80 do_test btree01-1.5.$i { 81 db eval { 82 DELETE FROM t1; 83 WITH RECURSIVE 84 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 85 INSERT INTO t1(a,b) SELECT i, zeroblob(6542) FROM c; 86 UPDATE t1 SET b=zeroblob(2331); 87 UPDATE t1 SET b=zeroblob(65496) WHERE a=$::i; 88 PRAGMA integrity_check; 89 } 90 } {ok} 91} 92for {set i 1} {$i<=30} {incr i} { 93 do_test btree01-1.6.$i { 94 db eval { 95 DELETE FROM t1; 96 WITH RECURSIVE 97 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 98 INSERT INTO t1(a,b) SELECT i, zeroblob(6542) FROM c; 99 UPDATE t1 SET b=zeroblob(2332); 100 UPDATE t1 SET b=zeroblob(65496) WHERE a=$::i; 101 PRAGMA integrity_check; 102 } 103 } {ok} 104} 105for {set i 1} {$i<=30} {incr i} { 106 do_test btree01-1.7.$i { 107 db eval { 108 DELETE FROM t1; 109 WITH RECURSIVE 110 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) 111 INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; 112 UPDATE t1 SET b=zeroblob(1); 113 UPDATE t1 SET b=zeroblob(65000) WHERE a=$::i; 114 PRAGMA integrity_check; 115 } 116 } {ok} 117} 118for {set i 1} {$i<=31} {incr i} { 119 do_test btree01-1.8.$i { 120 db eval { 121 DELETE FROM t1; 122 WITH RECURSIVE 123 c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<31) 124 INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; 125 UPDATE t1 SET b=zeroblob(4000); 126 UPDATE t1 SET b=zeroblob(65000) WHERE a=$::i; 127 PRAGMA integrity_check; 128 } 129 } {ok} 130} 131 132# 2022-03-06 OSSFuzz issue 45329 133# An assertion fault due to the failure to clear a flag in an optimization 134# committed last night. 135# 136# When the stay-on-last page optimization of sqlite3BtreeIndexMoveto() is 137# invoked, it needs to clear the BTCF_ValidOvfl flag. 138# 139db close 140sqlite3 db :memory: 141do_execsql_test btree01-2.1 { 142 PRAGMA page_size=1024; 143 CREATE TABLE t1(a INT PRIMARY KEY, b BLOB, c INT) WITHOUT ROWID; 144 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) 145 INSERT INTO t1(a,b,c) SELECT x*2, zeroblob(100), x FROM c; 146 UPDATE t1 SET b=zeroblob(1000) WHERE a=198; 147 CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); 148 INSERT INTO t2(y) VALUES(198),(187),(100); 149 SELECT y, c FROM t2 LEFT JOIN t1 ON y=a ORDER BY x; 150} {198 99 187 {} 100 50} 151do_execsql_test btree01-2.2 { 152 SELECT y, c FROM t1 RIGHT JOIN t2 ON y=a ORDER BY x; 153} {198 99 187 {} 100 50} 154 155 156finish_test 157