AryaWu/sqlite
0
1# 2014-11-272#3# The author disclaims copyright to this source code. In place of4# 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.tcl17set testprefix btree0118 19# The refactoring on the b-tree balance() routine in check-in20# http://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 RECURSIVE27 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 we35# add a number of additional tests to stress the balancer in similar36# 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 RECURSIVE43 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 RECURSIVE56 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 RECURSIVE69 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 RECURSIVE84 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 RECURSIVE97 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 RECURSIVE110 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 RECURSIVE123 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 45329133# An assertion fault due to the failure to clear a flag in an optimization134# committed last night.135#136# When the stay-on-last page optimization of sqlite3BtreeIndexMoveto() is137# invoked, it needs to clear the BTCF_ValidOvfl flag.138#139db close140sqlite3 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_test157 