diff --git a/manifest b/manifest index 72e4ce49c9..63f336fadf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C :-)\s(CVS\s91) -D 2000-06-09T14:14:33 +C added\sthe\sfcnt()\sfunction\sfor\stesting\s(CVS\s92) +D 2000-06-11T23:50:13 F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4 F Makefile.in b5693de0513e32f6e51bf0d1c62ea0d6b9a6c5d6 F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958 @@ -10,20 +10,20 @@ F src/build.c 925a785da2758269cb8773691e157ea5269178ba F src/dbbe.c 4129779d7199c05200482046182f718a122f8c96 F src/dbbe.h a8a46f71238e0f09f3ec08fd9d1c8c7f4cdc49bf F src/delete.c c267b93f7ccb5493b677fa18201880267c699aa8 -F src/expr.c 5790665132658362f1416755cc4060215c781e90 +F src/expr.c 81512e0ae54de0d347c9dbd7ed8928028f4e1b41 F src/insert.c ac4edfff474589c00b2490f206317dc5822122e5 F src/main.c e3297835b8e38ca726ac73f2c2bdb7cf08103197 F src/parse.y 6a3085fd8e2c477e73468e6d1a278cb72254c0c9 F src/select.c 3a12d76074fa57d7c39c4436bdeb8d7e1eb6fdf4 F src/shell.c 3f4afc39a36e4824e8aa262623fd03568874799e F src/sqlite.h 58da0a8590133777b741f9836beaef3d58f40268 -F src/sqliteInt.h 0aac58ed2e9fe46f24411e2e012fe85cd3457129 +F src/sqliteInt.h 19954bd2f75632849b265b9d7163a67391ec5148 F src/tclsqlite.c 9f358618ae803bedf4fb96da5154fd45023bc1f7 F src/tokenize.c 344754f81b55da5b19ea9504dfa16a9de68cd5ba F src/update.c d8d90df714bac99c68446a0c49f3d957ca6fc3c8 F src/util.c 38e4bb5edf6fa92e677698c45785bf73c69b9e9f -F src/vdbe.c ec66bc50ac92f0cbb8582e503a8366231d3579ef -F src/vdbe.h 8f79f57c66ce1030f6371ff067b326d627a52c6d +F src/vdbe.c 00b2ab7e0c0df2ac6eb4bf659656afc30e76c66b +F src/vdbe.h 5f58611b19799de2dbcdefa4eef33a255cfa8d0d F src/where.c c9b90e7672f4662a83ef9a27a193020d69fe034c F test/all.test 0950c135cab7e60c07bd745ccfad1476211e5bd7 F test/copy.test b77a1214bd7756f2849d5c4fa6e715c0ff0c34eb @@ -63,7 +63,7 @@ F www/index.tcl 4116afce6a8c63d68882d2b00aa10b079e0129cd F www/lang.tcl 1645e9107d75709be4c6099b643db235bbe0a151 F www/opcode.tcl 3cdc4bb2515fcfcbe853e3f0c91cd9199e82dadd F www/sqlite.tcl 5420eab24b539928f80ea9b3088e2549d34f438d -P aba926bb336d7ac28d7ca73db47185801e5d2c79 -R dd39acd153ed566c1b1c836be9a51d37 +P d573b431ed766db2d38672334a0c81faa1dde353 +R a071d3d9a4a3d2d16791159e4a3e2df8 U drh -Z b881c0382203d92c75b521598ab53066 +Z beff43aecb1f6e4f53737f0253af3944 diff --git a/manifest.uuid b/manifest.uuid index 666b1eddd4..379b92c925 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d573b431ed766db2d38672334a0c81faa1dde353 \ No newline at end of file +0f93c27cddb4254f72305ca3a64b77c2e7772c56 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index d487ca3a4b..01d41f7048 100644 --- a/src/expr.c +++ b/src/expr.c @@ -23,7 +23,7 @@ ************************************************************************* ** This file contains C code routines used for processing expressions ** -** $Id: expr.c,v 1.14 2000/06/08 15:10:47 drh Exp $ +** $Id: expr.c,v 1.15 2000/06/11 23:50:13 drh Exp $ */ #include "sqliteInt.h" @@ -321,6 +321,7 @@ int sqliteFuncId(Token *pToken){ { "max", 3, FN_Max }, { "sum", 3, FN_Sum }, { "avg", 3, FN_Avg }, + { "fcnt", 4, FN_Fcnt }, /* Used for testing only */ }; int i; for(i=0; ipList; + if( id==FN_Fcnt ){ + sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0); + break; + } op = id==FN_Min ? OP_Min : OP_Max; for(i=0; inExpr; i++){ sqliteExprCode(pParse, pList->a[i].pExpr); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index eec9e4b861..d4069eac86 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -23,7 +23,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.23 2000/06/08 13:36:40 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.24 2000/06/11 23:50:13 drh Exp $ */ #include "sqlite.h" #include "dbbe.h" @@ -85,6 +85,7 @@ int sqlite_iMallocFail; /* Fail sqliteMalloc() after this many calls */ #define FN_Max 3 #define FN_Sum 4 #define FN_Avg 5 +#define FN_Fcnt 6 /* ** Forward references to structures diff --git a/src/vdbe.c b/src/vdbe.c index 95b1de57c1..6dc03010cc 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -41,7 +41,7 @@ ** But other routines are also provided to help in building up ** a program instruction by instruction. ** -** $Id: vdbe.c,v 1.32 2000/06/09 14:14:34 drh Exp $ +** $Id: vdbe.c,v 1.33 2000/06/11 23:50:13 drh Exp $ */ #include "sqliteInt.h" #include @@ -191,6 +191,7 @@ struct Vdbe { Agg agg; /* Aggregate information */ int nSet; /* Number of sets allocated */ Set *aSet; /* An array of sets */ + int nFetch; /* Number of OP_Fetch instructions executed */ }; /* @@ -733,28 +734,28 @@ void sqliteVdbeDelete(Vdbe *p){ ** this array, then copy and paste it into this file, if you want. */ static char *zOpName[] = { 0, - "Open", "Close", "Fetch", "New", - "Put", "Distinct", "Found", "NotFound", - "Delete", "Field", "KeyAsData", "Key", - "Rewind", "Next", "Destroy", "Reorganize", - "ResetIdx", "NextIdx", "PutIdx", "DeleteIdx", - "MemLoad", "MemStore", "ListOpen", "ListWrite", - "ListRewind", "ListRead", "ListClose", "SortOpen", - "SortPut", "SortMakeRec", "SortMakeKey", "Sort", - "SortNext", "SortKey", "SortCallback", "SortClose", - "FileOpen", "FileRead", "FileField", "FileClose", - "AggReset", "AggFocus", "AggIncr", "AggNext", - "AggSet", "AggGet", "SetInsert", "SetFound", - "SetNotFound", "SetClear", "MakeRecord", "MakeKey", - "Goto", "If", "Halt", "ColumnCount", - "ColumnName", "Callback", "Integer", "String", - "Null", "Pop", "Dup", "Pull", - "Add", "AddImm", "Subtract", "Multiply", - "Divide", "Min", "Max", "Like", - "Glob", "Eq", "Ne", "Lt", - "Le", "Gt", "Ge", "IsNull", - "NotNull", "Negative", "And", "Or", - "Not", "Concat", "Noop", + "Open", "Close", "Fetch", "Fcnt", + "New", "Put", "Distinct", "Found", + "NotFound", "Delete", "Field", "KeyAsData", + "Key", "Rewind", "Next", "Destroy", + "Reorganize", "ResetIdx", "NextIdx", "PutIdx", + "DeleteIdx", "MemLoad", "MemStore", "ListOpen", + "ListWrite", "ListRewind", "ListRead", "ListClose", + "SortOpen", "SortPut", "SortMakeRec", "SortMakeKey", + "Sort", "SortNext", "SortKey", "SortCallback", + "SortClose", "FileOpen", "FileRead", "FileField", + "FileClose", "AggReset", "AggFocus", "AggIncr", + "AggNext", "AggSet", "AggGet", "SetInsert", + "SetFound", "SetNotFound", "SetClear", "MakeRecord", + "MakeKey", "Goto", "If", "Halt", + "ColumnCount", "ColumnName", "Callback", "Integer", + "String", "Null", "Pop", "Dup", + "Pull", "Add", "AddImm", "Subtract", + "Multiply", "Divide", "Min", "Max", + "Like", "Glob", "Eq", "Ne", + "Lt", "Le", "Gt", "Ge", + "IsNull", "NotNull", "Negative", "And", + "Or", "Not", "Concat", "Noop", }; /* @@ -1760,11 +1761,29 @@ int sqliteVdbeExec( sqliteDbbeFetch(p->aTab[i].pTable, p->aStack[tos].n, p->zStack[tos]); } + p->nFetch++; } PopStack(p, 1); break; } + /* Opcode: Fcnt * * * + ** + ** Push an integer onto the stack which is the total number of + ** OP_Fetch opcodes that have been executed by this virtual machine. + ** + ** This instruction is used to implement the special fcnt() function + ** in the SQL dialect that SQLite understands. fcnt() is used for + ** testing purposes. + */ + case OP_Fcnt: { + int i = ++p->tos; + if( NeedStack(p, p->tos) ) goto no_mem; + p->aStack[i].i = p->nFetch; + p->aStack[i].flags = STK_Int; + break; + } + /* Opcode: Distinct P1 P2 * ** ** Use the top of the stack as a key. If a record with that key @@ -2018,6 +2037,8 @@ int sqliteVdbeExec( if( i>=0 && inTable && p->aTab[i].pTable!=0 ){ if( sqliteDbbeNextKey(p->aTab[i].pTable)==0 ){ pc = pOp->p2 - 1; + }else{ + p->nFetch++; } } break; diff --git a/src/vdbe.h b/src/vdbe.h index 35fa0854cf..70ce44e8d9 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -27,7 +27,7 @@ ** or VDBE. The VDBE implements an abstract machine that runs a ** simple program to access and modify the underlying database. ** -** $Id: vdbe.h,v 1.9 2000/06/06 21:56:08 drh Exp $ +** $Id: vdbe.h,v 1.10 2000/06/11 23:50:13 drh Exp $ */ #ifndef _SQLITE_VDBE_H_ #define _SQLITE_VDBE_H_ @@ -74,105 +74,106 @@ typedef struct VdbeOp VdbeOp; #define OP_Open 1 #define OP_Close 2 #define OP_Fetch 3 -#define OP_New 4 -#define OP_Put 5 -#define OP_Distinct 6 -#define OP_Found 7 -#define OP_NotFound 8 -#define OP_Delete 9 -#define OP_Field 10 -#define OP_KeyAsData 11 -#define OP_Key 12 -#define OP_Rewind 13 -#define OP_Next 14 +#define OP_Fcnt 4 +#define OP_New 5 +#define OP_Put 6 +#define OP_Distinct 7 +#define OP_Found 8 +#define OP_NotFound 9 +#define OP_Delete 10 +#define OP_Field 11 +#define OP_KeyAsData 12 +#define OP_Key 13 +#define OP_Rewind 14 +#define OP_Next 15 -#define OP_Destroy 15 -#define OP_Reorganize 16 +#define OP_Destroy 16 +#define OP_Reorganize 17 -#define OP_ResetIdx 17 -#define OP_NextIdx 18 -#define OP_PutIdx 19 -#define OP_DeleteIdx 20 +#define OP_ResetIdx 18 +#define OP_NextIdx 19 +#define OP_PutIdx 20 +#define OP_DeleteIdx 21 -#define OP_MemLoad 21 -#define OP_MemStore 22 +#define OP_MemLoad 22 +#define OP_MemStore 23 -#define OP_ListOpen 23 -#define OP_ListWrite 24 -#define OP_ListRewind 25 -#define OP_ListRead 26 -#define OP_ListClose 27 +#define OP_ListOpen 24 +#define OP_ListWrite 25 +#define OP_ListRewind 26 +#define OP_ListRead 27 +#define OP_ListClose 28 -#define OP_SortOpen 28 -#define OP_SortPut 29 -#define OP_SortMakeRec 30 -#define OP_SortMakeKey 31 -#define OP_Sort 32 -#define OP_SortNext 33 -#define OP_SortKey 34 -#define OP_SortCallback 35 -#define OP_SortClose 36 +#define OP_SortOpen 29 +#define OP_SortPut 30 +#define OP_SortMakeRec 31 +#define OP_SortMakeKey 32 +#define OP_Sort 33 +#define OP_SortNext 34 +#define OP_SortKey 35 +#define OP_SortCallback 36 +#define OP_SortClose 37 -#define OP_FileOpen 37 -#define OP_FileRead 38 -#define OP_FileField 39 -#define OP_FileClose 40 +#define OP_FileOpen 38 +#define OP_FileRead 39 +#define OP_FileField 40 +#define OP_FileClose 41 -#define OP_AggReset 41 -#define OP_AggFocus 42 -#define OP_AggIncr 43 -#define OP_AggNext 44 -#define OP_AggSet 45 -#define OP_AggGet 46 +#define OP_AggReset 42 +#define OP_AggFocus 43 +#define OP_AggIncr 44 +#define OP_AggNext 45 +#define OP_AggSet 46 +#define OP_AggGet 47 -#define OP_SetInsert 47 -#define OP_SetFound 48 -#define OP_SetNotFound 49 -#define OP_SetClear 50 +#define OP_SetInsert 48 +#define OP_SetFound 49 +#define OP_SetNotFound 50 +#define OP_SetClear 51 -#define OP_MakeRecord 51 -#define OP_MakeKey 52 +#define OP_MakeRecord 52 +#define OP_MakeKey 53 -#define OP_Goto 53 -#define OP_If 54 -#define OP_Halt 55 +#define OP_Goto 54 +#define OP_If 55 +#define OP_Halt 56 -#define OP_ColumnCount 56 -#define OP_ColumnName 57 -#define OP_Callback 58 +#define OP_ColumnCount 57 +#define OP_ColumnName 58 +#define OP_Callback 59 -#define OP_Integer 59 -#define OP_String 60 -#define OP_Null 61 -#define OP_Pop 62 -#define OP_Dup 63 -#define OP_Pull 64 +#define OP_Integer 60 +#define OP_String 61 +#define OP_Null 62 +#define OP_Pop 63 +#define OP_Dup 64 +#define OP_Pull 65 -#define OP_Add 65 -#define OP_AddImm 66 -#define OP_Subtract 67 -#define OP_Multiply 68 -#define OP_Divide 69 -#define OP_Min 70 -#define OP_Max 71 -#define OP_Like 72 -#define OP_Glob 73 -#define OP_Eq 74 -#define OP_Ne 75 -#define OP_Lt 76 -#define OP_Le 77 -#define OP_Gt 78 -#define OP_Ge 79 -#define OP_IsNull 80 -#define OP_NotNull 81 -#define OP_Negative 82 -#define OP_And 83 -#define OP_Or 84 -#define OP_Not 85 -#define OP_Concat 86 -#define OP_Noop 87 +#define OP_Add 66 +#define OP_AddImm 67 +#define OP_Subtract 68 +#define OP_Multiply 69 +#define OP_Divide 70 +#define OP_Min 71 +#define OP_Max 72 +#define OP_Like 73 +#define OP_Glob 74 +#define OP_Eq 75 +#define OP_Ne 76 +#define OP_Lt 77 +#define OP_Le 78 +#define OP_Gt 79 +#define OP_Ge 80 +#define OP_IsNull 81 +#define OP_NotNull 82 +#define OP_Negative 83 +#define OP_And 84 +#define OP_Or 85 +#define OP_Not 86 +#define OP_Concat 87 +#define OP_Noop 88 -#define OP_MAX 87 +#define OP_MAX 88 /* ** Prototypes for the VDBE interface. See comments on the implementation