]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
added the fcnt() function for testing (CVS 92)
authordrh <drh@noemail.net>
Sun, 11 Jun 2000 23:50:13 +0000 (23:50 +0000)
committerdrh <drh@noemail.net>
Sun, 11 Jun 2000 23:50:13 +0000 (23:50 +0000)
FossilOrigin-Name: 0f93c27cddb4254f72305ca3a64b77c2e7772c56

manifest
manifest.uuid
src/expr.c
src/sqliteInt.h
src/vdbe.c
src/vdbe.h

index 72e4ce49c968d7de04019ce13ed65ed614e7d104..63f336fadfa68b8bceaa619e11c9f70beb515122 100644 (file)
--- 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
index 666b1eddd412049f6c371493797b2a7b01c2bac7..379b92c92589611a2bbcd806105717ba3ca96e59 100644 (file)
@@ -1 +1 @@
-d573b431ed766db2d38672334a0c81faa1dde353
\ No newline at end of file
+0f93c27cddb4254f72305ca3a64b77c2e7772c56
\ No newline at end of file
index d487ca3a4b5a5c21d06ba4d7528f0af3917882c3..01d41f70481b233e691770ecf714a8d7129e8023 100644 (file)
@@ -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; i<ArraySize(aFunc); i++){
@@ -379,6 +380,17 @@ int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
           is_agg = 1;
           break;
         }
+        /* The "fcnt(*)" function always returns the number of fetch
+        ** operations that have occurred so far while processing the
+        ** SQL statement.  This information can be used by test procedures
+        ** to verify that indices are being used properly to minimize
+        ** searching.  All arguments to fcnt() are ignored.  fcnt() has
+        ** no use (other than testing) that we are aware of.
+        */
+        case FN_Fcnt: {
+          n = 0;
+          break;
+        }
         default: break;
       }
       if( no_such_func ){
@@ -555,6 +567,10 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
       int op;
       int i;
       ExprList *pList = pExpr->pList;
+      if( id==FN_Fcnt ){
+        sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0);
+        break;
+      }
       op = id==FN_Min ? OP_Min : OP_Max;
       for(i=0; i<pList->nExpr; i++){
         sqliteExprCode(pParse, pList->a[i].pExpr);
index eec9e4b861d0196215e4dc8e0e381083599dc2e4..d4069eac8623adb1a0fb4ee80a7cff860312c5b9 100644 (file)
@@ -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
index 95b1de57c1f17d8d6b8771f91edad005810d8f16..6dc03010ccf8db712bc73c1cc4d0dad38857f42a 100644 (file)
@@ -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 <unistd.h>
@@ -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 && i<p->nTable && p->aTab[i].pTable!=0 ){
           if( sqliteDbbeNextKey(p->aTab[i].pTable)==0 ){
             pc = pOp->p2 - 1;
+          }else{
+            p->nFetch++;
           }
         }
         break;
index 35fa0854cf3faab460ef44d3ae1da9a0f37f2588..70ce44e8d961acc4e96db2c16bc9e8f063281a0d 100644 (file)
@@ -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_Destroy            15
-#define OP_Reorganize         16
-
-#define OP_ResetIdx           17
-#define OP_NextIdx            18
-#define OP_PutIdx             19
-#define OP_DeleteIdx          20
-
-#define OP_MemLoad            21
-#define OP_MemStore           22
-
-#define OP_ListOpen           23
-#define OP_ListWrite          24
-#define OP_ListRewind         25
-#define OP_ListRead           26
-#define OP_ListClose          27
-
-#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_FileOpen           37
-#define OP_FileRead           38
-#define OP_FileField          39
-#define OP_FileClose          40
-
-#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_SetInsert          47
-#define OP_SetFound           48
-#define OP_SetNotFound        49
-#define OP_SetClear           50
-
-#define OP_MakeRecord         51
-#define OP_MakeKey            52
-
-#define OP_Goto               53
-#define OP_If                 54
-#define OP_Halt               55
-
-#define OP_ColumnCount        56
-#define OP_ColumnName         57
-#define OP_Callback           58
-
-#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_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_MAX                87
+#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            16
+#define OP_Reorganize         17
+
+#define OP_ResetIdx           18
+#define OP_NextIdx            19
+#define OP_PutIdx             20
+#define OP_DeleteIdx          21
+
+#define OP_MemLoad            22
+#define OP_MemStore           23
+
+#define OP_ListOpen           24
+#define OP_ListWrite          25
+#define OP_ListRewind         26
+#define OP_ListRead           27
+#define OP_ListClose          28
+
+#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           38
+#define OP_FileRead           39
+#define OP_FileField          40
+#define OP_FileClose          41
+
+#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          48
+#define OP_SetFound           49
+#define OP_SetNotFound        50
+#define OP_SetClear           51
+
+#define OP_MakeRecord         52
+#define OP_MakeKey            53
+
+#define OP_Goto               54
+#define OP_If                 55
+#define OP_Halt               56
+
+#define OP_ColumnCount        57
+#define OP_ColumnName         58
+#define OP_Callback           59
+
+#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                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                88
 
 /*
 ** Prototypes for the VDBE interface.  See comments on the implementation