From e684090012aacb4a738178c6458d9731cd3f9310 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Mar 2002 03:08:25 +0000 Subject: [PATCH] Optimizations to the processing of integer comparisons. (CVS 420) FossilOrigin-Name: b7a7dae919be0e4c35b1fe8cb24fa7359a4b1200 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 14 +++++++++++--- src/util.c | 12 ++++++------ src/vdbe.c | 28 +++++++++++++++++++++------- tool/speedtest.tcl | 7 ++++--- 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 7a9a109583..42c7d5d7a1 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index ba69187ab8..dbe1aa79fb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -480eef1a3a4f049bc0d0cbee32dc8a8d138597c6 \ No newline at end of file +b7a7dae919be0e4c35b1fe8cb24fa7359a4b1200 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 9c16889dbd..58ed85a672 100644 --- a/src/expr.c +++ b/src/expr.c @@ -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; diff --git a/src/util.c b/src/util.c index f02372232b..fe54552f88 100644 --- a/src/util.c +++ b/src/util.c @@ -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 @@ -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 ){ diff --git a/src/vdbe.c b/src/vdbe.c index f5ab9161cf..adb3fbe5e7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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 @@ -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 ){ diff --git a/tool/speedtest.tcl b/tool/speedtest.tcl index 420eb35e6f..276fcc1896 100644 --- a/tool/speedtest.tcl +++ b/tool/speedtest.tcl @@ -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} -- 2.47.3