CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
bigrow.test235 linesDownload Raw Back to test
1# 2001 September 232#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# This file implements regression tests for SQLite library.  The12# focus of this file is stressing the library by putting large amounts13# of data in a single row of a table.14#15# $Id: bigrow.test,v 1.5 2004/08/07 23:54:48 drh Exp $16 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19 20# Make a big string that we can use for test data21#22do_test bigrow-1.0 {23  set ::bigstr {}24  for {set i 1} {$i<=9999} {incr i} {25    set sep [string index "abcdefghijklmnopqrstuvwxyz" [expr {$i%26}]]26    append ::bigstr "$sep [format %04d $i] "27  }28  string length $::bigstr29} {69993}30 31# Make a table into which we can insert some but records.32#33do_test bigrow-1.1 {34  execsql {35    CREATE TABLE t1(a text, b text, c text);36    SELECT name FROM sqlite_master37      WHERE type='table' OR type='index'38      ORDER BY name39  }40} {t1}41 42do_test bigrow-1.2 {43  set ::big1 [string range $::bigstr 0 65519]44  set sql "INSERT INTO t1 VALUES('abc',"45  append sql "'$::big1', 'xyz');"46  execsql $sql47  execsql {SELECT a, c FROM t1}48} {abc xyz}49do_test bigrow-1.3 {50  execsql {SELECT b FROM t1}51} [list $::big1]52do_test bigrow-1.4 {53  set ::big2 [string range $::bigstr 0 65520]54  set sql "INSERT INTO t1 VALUES('abc2',"55  append sql "'$::big2', 'xyz2');"56  set r [catch {execsql $sql} msg]57  lappend r $msg58} {0 {}}59do_test bigrow-1.4.1 {60  execsql {SELECT b FROM t1 ORDER BY c}61} [list $::big1 $::big2]62do_test bigrow-1.4.2 {63  execsql {SELECT c FROM t1 ORDER BY c}64} {xyz xyz2}65do_test bigrow-1.4.3 {66  execsql {DELETE FROM t1 WHERE a='abc2'}67  execsql {SELECT c FROM t1}68} {xyz}69 70do_test bigrow-1.5 {71  execsql {72    UPDATE t1 SET a=b, b=a;73    SELECT b,c FROM t174  }75} {abc xyz}76do_test bigrow-1.6 {77  execsql {78    SELECT * FROM t179  }80} [list $::big1 abc xyz]81do_test bigrow-1.7 {82  execsql {83    INSERT INTO t1 VALUES('1','2','3');84    INSERT INTO t1 VALUES('A','B','C');85    SELECT b FROM t1 WHERE a=='1';86  }87} {2}88do_test bigrow-1.8 {89  execsql "SELECT b FROM t1 WHERE a=='$::big1'"90} {abc}91do_test bigrow-1.9 {92  execsql "SELECT b FROM t1 WHERE a!='$::big1' ORDER BY a"93} {2 B}94 95# Try doing some indexing on big columns96#97do_test bigrow-2.1 {98  execsql {99    CREATE INDEX i1 ON t1(a)100  }101  execsql "SELECT b FROM t1 WHERE a=='$::big1'"102} {abc}103do_test bigrow-2.2 {104  execsql {105    UPDATE t1 SET a=b, b=a106  }107  execsql "SELECT b FROM t1 WHERE a=='abc'"108} [list $::big1]109do_test bigrow-2.3 {110  execsql {111    UPDATE t1 SET a=b, b=a112  }113  execsql "SELECT b FROM t1 WHERE a=='$::big1'"114} {abc}115catch {unset ::bigstr}116catch {unset ::big1}117catch {unset ::big2}118 119# Mosts of the tests above were created back when rows were limited in120# size to 64K.  Now rows can be much bigger.  Test that logic.  Also121# make sure things work correctly at the transition boundries between122# row sizes of 256 to 257 bytes and from 65536 to 65537 bytes.123#124# We begin by testing the 256..257 transition.125#126do_test bigrow-3.1 {127  execsql {128    DELETE FROM t1;129    INSERT INTO t1(a,b,c) VALUES('one','abcdefghijklmnopqrstuvwxyz0123','hi');130  }131  execsql {SELECT a,length(b),c FROM t1}132} {one 30 hi}133do_test bigrow-3.2 {134  execsql {135    UPDATE t1 SET b=b||b;136    UPDATE t1 SET b=b||b;137    UPDATE t1 SET b=b||b;138  }139  execsql {SELECT a,length(b),c FROM t1}140} {one 240 hi}141for {set i 1} {$i<10} {incr i} {142  do_test bigrow-3.3.$i {143    execsql "UPDATE t1 SET b=b||'$i'"144    execsql {SELECT a,length(b),c FROM t1}145  } "one [expr {240+$i}] hi"146}147 148# Now test the 65536..65537 row-size transition.149#150do_test bigrow-4.1 {151  execsql {152    DELETE FROM t1;153    INSERT INTO t1(a,b,c) VALUES('one','abcdefghijklmnopqrstuvwxyz0123','hi');154  }155  execsql {SELECT a,length(b),c FROM t1}156} {one 30 hi}157do_test bigrow-4.2 {158  execsql {159    UPDATE t1 SET b=b||b;160    UPDATE t1 SET b=b||b;161    UPDATE t1 SET b=b||b;162    UPDATE t1 SET b=b||b;163    UPDATE t1 SET b=b||b;164    UPDATE t1 SET b=b||b;165    UPDATE t1 SET b=b||b;166    UPDATE t1 SET b=b||b;167    UPDATE t1 SET b=b||b;168    UPDATE t1 SET b=b||b;169    UPDATE t1 SET b=b||b;170    UPDATE t1 SET b=b||b;171  }172  execsql {SELECT a,length(b),c FROM t1}173} {one 122880 hi}174do_test bigrow-4.3 {175  execsql {176    UPDATE t1 SET b=substr(b,1,65515)177  }178  execsql {SELECT a,length(b),c FROM t1}179} {one 65515 hi}180for {set i 1} {$i<10} {incr i} {181  do_test bigrow-4.4.$i {182    execsql "UPDATE t1 SET b=b||'$i'"183    execsql {SELECT a,length(b),c FROM t1}184  } "one [expr {65515+$i}] hi"185}186 187# Check to make sure the library recovers safely if a row contains188# too much data.189#190do_test bigrow-5.1 {191  execsql {192    DELETE FROM t1;193    INSERT INTO t1(a,b,c) VALUES('one','abcdefghijklmnopqrstuvwxyz0123','hi');194  }195  execsql {SELECT a,length(b),c FROM t1}196} {one 30 hi}197set i 1198for {set sz 60} {$sz<1048560} {incr sz $sz} {199  do_test bigrow-5.2.$i {200    execsql {201      UPDATE t1 SET b=b||b;202      SELECT a,length(b),c FROM t1;203    }204  } "one $sz hi"205  incr i206}207do_test bigrow-5.3 {208  catchsql {UPDATE t1 SET b=b||b}209} {0 {}}210do_test bigrow-5.4 {211  execsql {SELECT length(b) FROM t1}212} 1966080213do_test bigrow-5.5 {214  catchsql {UPDATE t1 SET b=b||b}215} {0 {}}216do_test bigrow-5.6 {217  execsql {SELECT length(b) FROM t1}218} 3932160219do_test bigrow-5.99 {220  execsql {DROP TABLE t1}221} {}222 223if {$SQLITE_MAX_LENGTH > 1200*1000*1000} {224  # If SQLITE_MAX_LENGTH is large enough, check that a serial type greater225  # than 0x7FFFFFFF does not cause trouble.226  set v [string repeat A 1100000000]227  do_execsql_test bigrow-6.0 {228    CREATE TABLE docs(content TEXT);229    INSERT INTO docs VALUES ( $v );230  }231  do_execsql_test bigrow-6.1 { SELECT content FROM docs } [list $v]232}233 234finish_test235