-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
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
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
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
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
-480eef1a3a4f049bc0d0cbee32dc8a8d138597c6
\ No newline at end of file
+b7a7dae919be0e4c35b1fe8cb24fa7359a4b1200
\ No newline at end of file
** 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"
}
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);
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;
** 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>
**
** 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;
}else if( btext==0 ){
return 1;
}
- isNumA = isNum(atext);
- isNumB = isNum(btext);
+ isNumA = sqliteIsNumber(atext);
+ isNumB = sqliteIsNumber(btext);
if( isNumA ){
if( !isNumB ){
result = -1;
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 ){
** 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>
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;
}
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;
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;
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 ){
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]
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}