diff --git a/manifest b/manifest index 507bad91ee..687209f379 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\ssources\sto\sthat\sthey\scan\sbe\scombined\sinto\sa\ssingle\ssqlite3.c\ssource\nfile.\s\sEliminate\sall\stype-pruned\spointer\swarnings.\s(CVS\s3722) -D 2007-03-26T22:05:01 +C Get\sthe\s-DSQLITE_OMIT_XFER_OPT\soption\sworking.\s\sRun\sspeed\stests\son\sa\sfull\nregression.\s\sAdd\sthe\sscript\sfor\sgenerating\ssqlite3.c.\s(CVS\s3723) +D 2007-03-27T12:04:05 F Makefile.in 1fe3d0b46e40fd684e1e61f8e8056cefed16de9f F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -70,7 +70,7 @@ F src/expr.c 971dd206ec0fa82d9fd1abb587a40df226f98966 F src/func.c 94372fe3cf26b81d4dcdc15f98ff240c37c8c708 F src/hash.c 449f3d6620193aa557f5d86cbc5cc6b87702b185 F src/hash.h 1b3f7e2609141fd571f62199fc38687d262e9564 -F src/insert.c 72cb64b698796f2005c0158e098124d9490868bb +F src/insert.c 9dbb62ba053769de20cf6b4ac73ceeb81ffc24f3 F src/legacy.c 2631df6a861f830d6b1c0fe92b9fdd745b2c0cd6 F src/loadext.c c186ad5c9e8a0aaa73d0caf5f604d112e45e8b89 F src/main.c af8922e0205cf618392de2836c9efad71786d0d6 @@ -133,7 +133,7 @@ F src/vtab.c 7fbda947e28cbe7adb3ba752a76ca9ef29936750 F src/where.c 0825fabc1a185af1567dc82e63683cd9b47d9e22 F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/all.test 7da67663cb5af0c95ecd4805d888459023fb8cfd +F test/all.test 60267b055e82de4fb8b841eabb014bc2f836a4eb F test/alter.test a2cc30e844cb3b5d203416962f56f78fc11b1978 F test/alter2.test 8b2d81eae944471d473de99ab25ba6d9cda73cd3 F test/alter3.test a6eec8f454be9b6ce73d8d7dc711453675a10ce7 @@ -302,7 +302,7 @@ F test/shared3.test 01e3e124dbb3859788aabc7cfb82f7ea04421749 F test/shared_err.test 841f7341eb07ed97c713bf89960a4e9199717193 F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5 F test/speed1.test 0ab227eae013d064f2205adcb9ee6f3c325b5bf4 -F test/speed2.test a6a9e3598cd957045e94385bebdfc64d0d57359e +F test/speed2.test 31296ea46516ad6093e39f8622a4cbcc766923ec F test/subquery.test ae324ee928c5fb463a3ce08a8860d6e7f1ca5797 F test/subselect.test 2d13fb7f450db3595adcdd24079a0dd1d2d6abc2 F test/sync.test d05397b8f89f423dd6dba528692019ab036bc1c3 @@ -377,6 +377,7 @@ F tool/memleak2.awk 9cc20c8e8f3c675efac71ea0721ee6874a1566e8 F tool/memleak3.tcl 7707006ee908cffff210c98158788d85bb3fcdbf F tool/mkkeywordhash.c eb7cd7244b9725e9e77270d0572de8b22a96e83a F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x +F tool/mksqlite3c.tcl ca566a1482d187433f3aea97a83a1ca9fb6af071 F tool/omittest.tcl e6b3d6a1285f9813bc1dea53bb522b4b72774710 F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816 @@ -441,7 +442,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 8fe317054982969ad539cdbf1b996b97d86ec4f2 -R c60b5a581f8ad645c254d239aa450c65 +P 0b832e218ec12b0eb559e407d80aba6709e2ea85 +R 76a8b8a54e51e640933974bfc36cdc29 U drh -Z d6b37215b7fed9fea082ff01114bbc2c +Z 06e3558004d52759f1e96dadb9b6ab93 diff --git a/manifest.uuid b/manifest.uuid index d07ca2ba2c..ead90d3f3d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b832e218ec12b0eb559e407d80aba6709e2ea85 \ No newline at end of file +42c038518c4ba0ef827a5717d450f95165b3c729 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 8b0f76bead..dfc5bdef1d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle INSERT statements in SQLite. ** -** $Id: insert.c,v 1.176 2007/02/24 15:18:50 drh Exp $ +** $Id: insert.c,v 1.177 2007/03/27 12:04:05 drh Exp $ */ #include "sqliteInt.h" @@ -1246,6 +1246,18 @@ void sqlite3OpenTableAndIndices( } } + +#ifdef SQLITE_TEST +/* +** The following global variable is incremented whenever the +** transfer optimization is used. This is used for testing +** purposes only - to make sure the transfer optimization really +** is happening when it is suppose to. +*/ +int sqlite3_xferopt_count; +#endif /* SQLITE_TEST */ + + #ifndef SQLITE_OMIT_XFER_OPT /* ** Check to collation names to see if they are compatible. @@ -1297,16 +1309,6 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ return 1; } -#ifdef SQLITE_TEST -/* -** The following global variable is incremented whenever the -** transfer optimization is used. This is used for testing -** purposes only - to make sure the transfer optimization really -** is happening when it is suppose to. -*/ -int sqlite3_xferopt_count; -#endif /* SQLITE_TEST */ - /* ** Attempt the transfer optimization on INSERTs of the form ** diff --git a/test/all.test b/test/all.test index 17d950349e..21181ac580 100644 --- a/test/all.test +++ b/test/all.test @@ -10,7 +10,7 @@ #*********************************************************************** # This file runs all tests. # -# $Id: all.test,v 1.37 2007/03/17 10:26:59 danielk1977 Exp $ +# $Id: all.test,v 1.38 2007/03/27 12:04:06 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -57,7 +57,6 @@ set EXCLUDE { malloc.test misuse.test memleak.test - speed1.test } # Files to include in the test. If this list is empty then everything diff --git a/test/speed2.test b/test/speed2.test index 8e3b3eea94..a7098100f9 100644 --- a/test/speed2.test +++ b/test/speed2.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this script is measuring executing speed. # -# $Id: speed2.test,v 1.2 2007/03/26 16:30:16 drh Exp $ +# $Id: speed2.test,v 1.3 2007/03/27 12:04:06 drh Exp $ # set testdir [file dirname $argv0] @@ -20,7 +20,7 @@ source $testdir/tester.tcl # Set a uniform random seed expr srand(0) -set sqlout [open speed1.txt w] +set sqlout [open speed2.txt w] proc tracesql {sql} { puts $::sqlout $sql\; } @@ -62,7 +62,7 @@ proc number_name {n} { # Create a database schema. # -do_test speed1-1.0 { +do_test speed2-1.0 { execsql { PRAGMA page_size=1024; PRAGMA cache_size=8192; @@ -86,7 +86,7 @@ for {set i 1} {$i<=50000} {incr i} { append sql "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');\n" } db eval BEGIN -speed_trial speed1-insert1 50000 row $sql +speed_trial speed2-insert1 50000 row $sql db eval COMMIT # 50000 INSERTs on an indexed table @@ -97,7 +97,7 @@ for {set i 1} {$i<=50000} {incr i} { append sql "INSERT INTO t2 VALUES($i,$r,'[number_name $r]');\n" } db eval BEGIN -speed_trial speed1-insert2 50000 row $sql +speed_trial speed2-insert2 50000 row $sql db eval COMMIT @@ -111,7 +111,7 @@ for {set i 0} {$i<50} {incr i} { set upr [expr {($i+10)*100}] append sql "SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr;" } -speed_trial speed1-select1 [expr {50*50000}] row $sql +speed_trial speed2-select1 [expr {50*50000}] row $sql # 50 SELECTs on an LIKE comparison. There is no index so a full # table scan is required. @@ -121,12 +121,12 @@ for {set i 0} {$i<50} {incr i} { append sql \ "SELECT count(*), avg(b) FROM t1 WHERE c LIKE '%[number_name $i]%';" } -speed_trial speed1-select2 [expr {50*50000}] row $sql +speed_trial speed2-select2 [expr {50*50000}] row $sql # Create indices # db eval BEGIN -speed_trial speed1-createidx 150000 row { +speed_trial speed2-createidx 150000 row { CREATE INDEX i1a ON t1(a); CREATE INDEX i1b ON t1(b); CREATE INDEX i1c ON t1(c); @@ -142,7 +142,7 @@ for {set i 0} {$i<5000} {incr i} { set upr [expr {($i+10)*100}] append sql "SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr;" } -speed_trial speed1-select3 5000 stmt $sql +speed_trial speed2-select3 5000 stmt $sql # 100000 random SELECTs against rowid. # @@ -151,7 +151,7 @@ for {set i 1} {$i<=100000} {incr i} { set id [expr {int(rand()*50000)+1}] append sql "SELECT c=='hi' FROM t1 WHERE rowid=$id;\n" } -speed_trial speed1-select4 100000 row $sql +speed_trial speed2-select4 100000 row $sql # 100000 random SELECTs against a unique indexed column. # @@ -160,7 +160,7 @@ for {set i 1} {$i<=100000} {incr i} { set id [expr {int(rand()*50000)+1}] append sql "SELECT c FROM t1 WHERE a=$id;" } -speed_trial speed1-select5 100000 row $sql +speed_trial speed2-select5 100000 row $sql # 50000 random SELECTs against an indexed column text column # @@ -168,10 +168,10 @@ set sql {} db eval {SELECT c FROM t1 ORDER BY random() LIMIT 50000} { append sql "SELECT c FROM t1 WHERE c='$c';" } -speed_trial speed1-select6 50000 row $sql +speed_trial speed2-select6 50000 row $sql # Vacuum -speed_trial speed1-vacuum 100000 row VACUUM +speed_trial speed2-vacuum 100000 row VACUUM # 5000 updates of ranges where the field being compared is indexed. # @@ -182,7 +182,7 @@ for {set i 0} {$i<5000} {incr i} { append sql "UPDATE t1 SET b=b*2 WHERE a>=$lwr AND a<$upr;" } db eval BEGIN -speed_trial speed1-update1 5000 stmt $sql +speed_trial speed2-update1 5000 stmt $sql db eval COMMIT # 50000 single-row updates. An index is used to find the row quickly. @@ -193,12 +193,12 @@ for {set i 0} {$i<50000} {incr i} { append sql "UPDATE t1 SET b=$r WHERE a=$i;" } db eval BEGIN -speed_trial speed1-update2 50000 row $sql +speed_trial speed2-update2 50000 row $sql db eval COMMIT # 1 big text update that touches every row in the table. # -speed_trial speed1-update3 50000 row { +speed_trial speed2-update3 50000 row { UPDATE t1 SET c=a; } @@ -211,29 +211,29 @@ for {set i 1} {$i<=50000} {incr i} { append sql "UPDATE t1 SET c='[number_name $r]' WHERE a=$i;" } db eval BEGIN -speed_trial speed1-update4 50000 row $sql +speed_trial speed2-update4 50000 row $sql db eval COMMIT # Delete all content in a table. # -speed_trial speed1-delete1 50000 row {DELETE FROM t1} +speed_trial speed2-delete1 50000 row {DELETE FROM t1} # Copy one table into another # -speed_trial speed1-copy1 50000 row {INSERT INTO t1 SELECT * FROM t2} +speed_trial speed2-copy1 50000 row {INSERT INTO t1 SELECT * FROM t2} # Delete all content in a table, one row at a time. # -speed_trial speed1-delete2 50000 row {DELETE FROM t1 WHERE 1} +speed_trial speed2-delete2 50000 row {DELETE FROM t1 WHERE 1} # Refill the table yet again # -speed_trial speed1-copy2 50000 row {INSERT INTO t1 SELECT * FROM t2} +speed_trial speed2-copy2 50000 row {INSERT INTO t1 SELECT * FROM t2} # Drop the table and recreate it without its indices. # db eval BEGIN -speed_trial speed1-drop1 50000 row { +speed_trial speed2-drop1 50000 row { DROP TABLE t1; CREATE TABLE t1(a INTEGER, b INTEGER, c TEXT); } @@ -242,32 +242,32 @@ db eval COMMIT # Refill the table yet again. This copy should be faster because # there are no indices to deal with. # -speed_trial speed1-copy3 50000 row {INSERT INTO t1 SELECT * FROM t2} +speed_trial speed2-copy3 50000 row {INSERT INTO t1 SELECT * FROM t2} # Select 20000 rows from the table at random. # -speed_trial speed1-random1 50000 row { +speed_trial speed2-random1 50000 row { SELECT rowid FROM t1 ORDER BY random() LIMIT 20000 } # Delete 20000 random rows from the table. # -speed_trial speed1-random-del1 20000 row { +speed_trial speed2-random-del1 20000 row { DELETE FROM t1 WHERE rowid IN (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000) } -do_test speed1-1.1 { +do_test speed2-1.1 { db one {SELECT count(*) FROM t1} } 30000 # Delete 20000 more rows at random from the table. # -speed_trial speed1-random-del2 20000 row { +speed_trial speed2-random-del2 20000 row { DELETE FROM t1 WHERE rowid IN (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000) } -do_test speed1-1.2 { +do_test speed2-1.2 { db one {SELECT count(*) FROM t1} } 10000 diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl new file mode 100644 index 0000000000..d13532540b --- /dev/null +++ b/tool/mksqlite3c.tcl @@ -0,0 +1,190 @@ +#!/usr/bin/tclsh +# +# To build a single huge source file holding all of SQLite (or at +# least the core components - the test harness, shell, and TCL +# interface are omitted.) first do +# +# make target_source +# +# Then run this script +# +# tclsh mkonebigsourcefile.tcl +# +# The combined SQLite source code will be written into sqlite3.c +# + +# Open the output file and write a header comment at the beginning +# of the file. +# +set out [open sqlite3.c w] +puts $out \ +"/****************************************************************************** +** This file is a amalgamation of many separate source files from SQLite. By +** pulling all the source files into this single unified source file, the +** entire code can be compiled as a single translation unit, which allows the +** compiler to do a better job of optimizing. +*/" + +# These are the header files used by SQLite. The first time any of these +# files are seen in a #include statement in the C code, include the complete +# text of the file in-line. The file only needs to be included once. +# +foreach hdr { + btree.h + hash.h + keywordhash.h + opcodes.h + os_common.h + os.h + os_os2.h + pager.h + parse.h + sqlite3ext.h + sqlite3.h + sqliteInt.h + vdbe.h + vdbeInt.h +} { + set available_hdr($hdr) 1 +} + +# 78 stars used for comment formatting. +set s78 \ +{*****************************************************************************} + +# Insert a comment into the code +# +proc section_comment {text} { + global out s78 + set n [string length $text] + set nstar [expr {60 - $n}] + set stars [string range $s78 0 $nstar] + puts $out "/************** $text $stars/" +} + +# Read the source file named $filename and write it into the +# sqlite3.c output file. If any #include statements are seen, +# process them approprately. +# +proc copy_file {filename} { + global seen_hdr available_hdr out + set tail [file tail $filename] + section_comment "Begin file $tail" + set in [open $filename r] + while {![eof $in]} { + set line [gets $in] + if {[regexp {^#\s*include\s+["<]([^">]+)[">]} $line all hdr]} { + if {[info exists available_hdr($hdr)]} { + if {$available_hdr($hdr)} { + if {$hdr!="os_common.h"} { + set available_hdr($hdr) 0 + } + section_comment "Include $hdr in the middle of $tail" + copy_file tsrc/$hdr + section_comment "Continuing where we left off in $tail" + } + } elseif {![info exists seen_hdr($hdr)]} { + set seen_hdr($hdr) 1 + puts $out $line + } + } elseif {[regexp {^#ifdef __cplusplus} $line]} { + puts $out "#if 0" + } elseif {[regexp {^#line} $line]} { + # Skip #line directives. + } else { + puts $out $line + } + } + close $in + section_comment "End of $tail" +} + + +# Process the source files. Process files containing commonly +# used subroutines first in order to help the compiler find +# inlining opportunities. +# +foreach file { + printf.c + random.c + utf.c + util.c + hash.c + opcodes.c + + os.c + os_os2.c + os_unix.c + os_win.c + + pager.c + + btree.c + + vdbefifo.c + vdbemem.c + vdbeaux.c + vdbeapi.c + vdbe.c + + expr.c + alter.c + analyze.c + attach.c + auth.c + build.c + callback.c + complete.c + date.c + delete.c + func.c + insert.c + legacy.c + loadext.c + pragma.c + prepare.c + select.c + table.c + trigger.c + update.c + vacuum.c + vtab.c + where.c + + parse.c + + tokenize.c + + main.c +} { + copy_file tsrc/$file +} + +if 0 { +puts $out "#ifdef SQLITE_TEST" +foreach file { + test1.c + test2.c + test3.c + test4.c + test5.c + test6.c + test7.c + test8.c + test_async.c + test_autoext.c + test_loadext.c + test_md5.c + test_schema.c + test_server.c + test_tclvar.c +} { + copy_file ../sqlite/src/$file +} +puts $out "#endif /* SQLITE_TEST */" +puts $out "#ifdef SQLITE_TCL" +copy_file ../sqlite/src/tclsqlite.c +puts $out "#endif /* SQLITE_TCL */" +} + +close $out