]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Optimizations to the processing of integer comparisons. (CVS 420)
authordrh <drh@noemail.net>
Wed, 6 Mar 2002 03:08:25 +0000 (03:08 +0000)
committerdrh <drh@noemail.net>
Wed, 6 Mar 2002 03:08:25 +0000 (03:08 +0000)
FossilOrigin-Name: b7a7dae919be0e4c35b1fe8cb24fa7359a4b1200

manifest
manifest.uuid
src/expr.c
src/util.c
src/vdbe.c
tool/speedtest.tcl

index 7a9a10958378d2cf698811dbda6dd8d9169ed89e..42c7d5d7a14cb31b7d944484ba16efaacf61c75c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\sthe\spager\slocking\smechanism\sso\sthat\swe\sdon't\shave\sto\swrite\spage\s1\nto\sthe\sjournal\sand\sto\sthe\sdatabase\sunless\sit\sactually\schanges.\s(CVS\s419)
-D 2002-03-05T12:41:20
+C Optimizations\sto\sthe\sprocessing\sof\sinteger\scomparisons.\s(CVS\s420)
+D 2002-03-06T03:08:26
 F Makefile.in 50f1b3351df109b5774771350d8c1b8d3640130d
 F Makefile.template 89e373b2dad0321df00400fa968dc14b61a03296
 F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
@@ -23,7 +23,7 @@ F src/btree.c b7d1b8875113ab4061a6a8cc759f75728ae7daf0
 F src/btree.h 8abeabfe6e0b1a990b64fa457592a6482f6674f3
 F src/build.c 0f3c6b6482e0b74284b22661de1b813a0bfb0197
 F src/delete.c 577da499162291c1855f0b304b211bffcf9da945
-F src/expr.c e12ca550536c0bae7a3acef49dfa3068fe5f0900
+F src/expr.c d2adad05dc2fe112aef364bdb9c0eb8877618bbe
 F src/func.c 87516e7dc37190c24af77593931a5d09d797520a
 F src/hash.c cc259475e358baaf299b00a2c7370f2b03dda892
 F src/hash.h dca065dda89d4575f3176e75e9a3dc0f4b4fb8b9
@@ -50,8 +50,8 @@ F src/test3.c 4e52fff8b01f08bd202f7633feda5639b7ba2b5e
 F src/threadtest.c 81f0598e0f031c1bd506af337fdc1b7e8dff263f
 F src/tokenize.c 4b5d30590a744b9bb5605a92d1f620ab2e7e75af
 F src/update.c 7dd714a6a7fa47f849ebb36b6d915974d6c6accb
-F src/util.c 00a35b421c92ae0d7cfa51bd87f7d4995f464d19
-F src/vdbe.c 0b634bbe3d1a770136b9f7324804bb55903a9b17
+F src/util.c b34cd91387bbfdc79319ea451a7d120cef478120
+F src/vdbe.c fcbe9d3c1b87f18ed3d7f0553f6c4194fb74a85d
 F src/vdbe.h f9be1f6e9a336c3ff4d14ea7489ee976e07460cc
 F src/where.c 34d91fd5d822c2663caeb023f72d60df316ebf29
 F test/all.test 7a8a8a7a579ed2bb4d8976d55402f21eacd58049
@@ -108,7 +108,7 @@ F tool/opNames.awk 5ba1f48aa854ee3b7c3d2b54233665bc3e649ea2
 F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
 F tool/renumberOps.awk 6d067177ad5f8d711b79577b462da9b3634bd0a9
 F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816
-F tool/speedtest.tcl 1c151e27d7ca10c6a2509bf6e816116744c3199e
+F tool/speedtest.tcl 61660a00b9a5ad8566dbc48e9b09071b1ad8a1c3
 F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf
 F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4
 F www/arch.tcl 72a0c80e9054cc7025a50928d28d9c75c02c2b8b
@@ -128,7 +128,7 @@ F www/speed.tcl 83457b2bf6bb430900bd48ca3dd98264d9a916a5
 F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
 F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P 414da4af1f4aebc3936ca339fbc7932add081912
-R 0b32113f5a809c11a2af16e72cce2c93
+P 480eef1a3a4f049bc0d0cbee32dc8a8d138597c6
+R 293e4b0f9d71b9a7cc31da9375205a15
 U drh
-Z d718da112d32fa4d0c0cf7ece4f5da88
+Z be460c9473f4d69e9aab54c7c0b566d7
index ba69187ab8dce0c83839b99af61ee3bb9a61b230..dbe1aa79fb6e1ea4bc747ec0df7d06e098b99dd0 100644 (file)
@@ -1 +1 @@
-480eef1a3a4f049bc0d0cbee32dc8a8d138597c6
\ No newline at end of file
+b7a7dae919be0e4c35b1fe8cb24fa7359a4b1200
\ No newline at end of file
index 9c16889dbd0648e9e70eca6d85f794c3c54fe042..58ed85a672186e22f5399e0619bb75ad02a5a9b6 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains routines used for analyzing expressions and
 ** for generating VDBE code that evaluates expressions in SQLite.
 **
-** $Id: expr.c,v 1.54 2002/03/03 18:59:41 drh Exp $
+** $Id: expr.c,v 1.55 2002/03/06 03:08:26 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -730,8 +730,12 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
       }
       break;
     }
-    case TK_FLOAT:
     case TK_INTEGER: {
+      sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0);
+      sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
+      break;
+    }
+    case TK_FLOAT: {
       sqliteVdbeAddOp(v, OP_String, 0, 0);
       assert( pExpr->token.z );
       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
@@ -798,7 +802,11 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
         Token *p = &pExpr->pLeft->token;
         char *z = sqliteMalloc( p->n + 2 );
         sprintf(z, "-%.*s", p->n, p->z);
-        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        if( pExpr->pLeft->op==TK_INTEGER ){
+          sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
+        }else{
+          sqliteVdbeAddOp(v, OP_String, 0, 0);
+        }
         sqliteVdbeChangeP3(v, -1, z, p->n+1);
         sqliteFree(z);
         break;
index f02372232b5230802ea07d5d9f411d322e262486..fe54552f886251246735b01f2dbc57d6340c6934 100644 (file)
@@ -14,7 +14,7 @@
 ** This file contains functions for allocating memory, comparing
 ** strings, and stuff like that.
 **
-** $Id: util.c,v 1.40 2002/02/28 04:10:30 drh Exp $
+** $Id: util.c,v 1.41 2002/03/06 03:08:26 drh Exp $
 */
 #include "sqliteInt.h"
 #include <stdarg.h>
@@ -629,7 +629,7 @@ static int sortStrCmp(const char *atext, const char *btext, int useCase){
 **
 ** Am empty string is considered numeric.
 */
-static int isNum(const char *z){
+static int sqliteIsNumber(const char *z){
   if( *z=='-' || *z=='+' ) z++;
   if( !isdigit(*z) ){
     return *z==0;
@@ -669,8 +669,8 @@ int sqliteCompare(const char *atext, const char *btext){
   }else if( btext==0 ){
     return 1;
   }
-  isNumA = isNum(atext);
-  isNumB = isNum(btext);
+  isNumA = sqliteIsNumber(atext);
+  isNumB = sqliteIsNumber(btext);
   if( isNumA ){
     if( !isNumB ){
       result = -1;
@@ -728,8 +728,8 @@ int sqliteSortCompare(const char *a, const char *b){
   int isNumA, isNumB;
 
   while( res==0 && *a && *b ){
-    isNumA = isNum(&a[1]);
-    isNumB = isNum(&b[1]);
+    isNumA = sqliteIsNumber(&a[1]);
+    isNumB = sqliteIsNumber(&b[1]);
     if( isNumA ){
       double rA, rB;
       if( !isNumB ){
index f5ab9161cf130ef7dedde705d18d270afb6547ce..adb3fbe5e7e8a41f6245022a9463c5a9b4acdacd 100644 (file)
@@ -30,7 +30,7 @@
 ** But other routines are also provided to help in building up
 ** a program instruction by instruction.
 **
-** $Id: vdbe.c,v 1.131 2002/03/05 01:11:14 drh Exp $
+** $Id: vdbe.c,v 1.132 2002/03/06 03:08:26 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -1360,15 +1360,21 @@ case OP_Halt: {
   break;
 }
 
-/* Opcode: Integer P1 * *
+/* Opcode: Integer P1 * P3
 **
-** The integer value P1 is pushed onto the stack.
+** The integer value P1 is pushed onto the stack.  If P3 is not zero
+** then it is assumed to be a string representation of the same integer.
 */
 case OP_Integer: {
   int i = ++p->tos;
   VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
   aStack[i].i = pOp->p1;
   aStack[i].flags = STK_Int;
+  if( pOp->p3 ){
+    zStack[i] = pOp->p3;
+    aStack[i].flags |= STK_Str | STK_Static;
+    aStack[i].n = strlen(pOp->p3)+1;
+  }
   break;
 }
 
@@ -1428,16 +1434,16 @@ case OP_Dup: {
   if( aStack[j].flags & STK_Str ){
     if( pOp->p2 || (aStack[j].flags & STK_Static)!=0 ){
       zStack[j] = zStack[i];
-      aStack[j].flags = STK_Str | STK_Static;
+      aStack[j].flags &= ~STK_Dyn;
     }else if( aStack[i].n<=NBFS ){
       memcpy(aStack[j].z, zStack[i], aStack[j].n);
       zStack[j] = aStack[j].z;
-      aStack[j].flags = STK_Str;
+      aStack[j].flags &= ~(STK_Static|STK_Dyn);
     }else{
       zStack[j] = sqliteMalloc( aStack[j].n );
       if( zStack[j]==0 ) goto no_mem;
       memcpy(zStack[j], zStack[i], aStack[j].n);
-      aStack[j].flags = STK_Str | STK_Dyn;
+      aStack[j].flags &= ~STK_Static;
     }
   }
   break;
@@ -1971,7 +1977,13 @@ case OP_Ge: {
   VERIFY( if( nos<0 ) goto not_enough_stack; )
   ft = aStack[tos].flags;
   fn = aStack[nos].flags;
-  if( (ft & fn)==STK_Int ){
+  if( (ft & fn & STK_Int)==STK_Int ){
+    c = aStack[nos].i - aStack[tos].i;
+  }else if( (ft & STK_Int)!=0 && (fn & STK_Str)!=0 && isInteger(zStack[nos]) ){
+    Integerify(p, nos);
+    c = aStack[nos].i - aStack[tos].i;
+  }else if( (fn & STK_Int)!=0 && (ft & STK_Str)!=0 && isInteger(zStack[tos]) ){
+    Integerify(p, tos);
     c = aStack[nos].i - aStack[tos].i;
   }else{
     if( Stringify(p, tos) || Stringify(p, nos) ) goto no_mem;
@@ -4620,6 +4632,8 @@ default: {
       for(i=p->tos; i>=0 && i>p->tos-5; i--){
         if( aStack[i].flags & STK_Null ){
           fprintf(p->trace, " NULL");
+        }else if( (aStack[i].flags & (STK_Int|STK_Str))==(STK_Int|STK_Str) ){
+          fprintf(p->trace, " si:%d", aStack[i].i);
         }else if( aStack[i].flags & STK_Int ){
           fprintf(p->trace, " i:%d", aStack[i].i);
         }else if( aStack[i].flags & STK_Real ){
index 420eb35e6f985a3c122c363153a5e9f54037c1bc..276fcc18967c75715b9183afa5f0da4f506c0ebd 100644 (file)
@@ -37,9 +37,9 @@ proc runtest {title} {
   set t [expr {[lindex $t 0]/1000000.0}]
   puts [format $format PostgreSQL: $t]
   exec sync; after $delay;
-  set t [time "exec mysql drh <$sqlfile" 1]
-  set t [expr {[lindex $t 0]/1000000.0}]
-  puts [format $format MySQL: $t]
+#  set t [time "exec mysql -f drh <$sqlfile" 1]
+#  set t [expr {[lindex $t 0]/1000000.0}]
+#  puts [format $format MySQL: $t]
 #  set t [time "exec ./sqlite232 s232.db <$sqlfile" 1]
 #  set t [expr {[lindex $t 0]/1000000.0}]
 #  puts [format $format {SQLite 2.3.2:} $t]
@@ -157,6 +157,7 @@ runtest {100 SELECTs on a string comparison}
 set fd [open test$cnt.sql w]
 puts $fd {CREATE INDEX i2a ON t2(a);}
 puts $fd {CREATE INDEX i2b ON t2(b);}
+puts $fd {VACUUM;}
 close $fd
 runtest {Creating an index}