CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
btree01.test157 linesDownload Raw Back to test
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