-C Remove\sthe\sencode/decode\sfrom\sthe\sversion\s3.0\ssource\stree.\s(CVS\s1959)
-D 2004-09-13T13:46:01
+C The\scallback\son\ssqlite3_trace()\sis\sinvoked\sthe\sfirst\stime\ssqlite3_step()\nis\scalled\safter\ssqlite3_prepare()\sor\ssqlite3_reset().\s\sTicket\s#900.\s(CVS\s1960)
+D 2004-09-15T13:38:11
F Makefile.in 9cdfc3af2647055085969968ca2394f24c3c6166
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
F src/auth.c 65408baa7e6621520882478dfa1e6b8c1d6c1850
F src/btree.c 470e00b08688f065c2e62a6dcd3fb18880e8e309
F src/btree.h 94dfec0a1722d33359b23e7e310f2b64ffedf029
-F src/build.c 662f4e56a64aacadc97c481492b08c842b9ec0f4
+F src/build.c c5ecf114af4ebc2963a03142b6bd6f2284ee35fc
F src/date.c eb8d5fa1a6d5cfc09031c8852d10ff742a94b15b
F src/delete.c e887f44aae1e33da1643df58abe86cd9cde45ad1
F src/expr.c 9130794d8c86af2cbf2b8cdc66f2158167fd15b1
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
F src/insert.c bfd21070c28dd94e58ae918260a6985d2b5e4477
F src/legacy.c d58ea507bce885298a2c8c3cbb0f4bff5d47830b
-F src/main.c ac302ed646bdb256b78c87385627b3142357eced
+F src/main.c 82a952ef3e5f7bacaa1b20060d0588f8767a6774
F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070
F src/os.h d1780e0db95cad01f213d48da22ab490eb4fd345
F src/os_common.h cd7eb025fdab7dc91e0e97bf6310f1648205857f
F src/vdbe.c b19de04c57b4136a8e0203d5e3b76dd82bded1b5
F src/vdbe.h 067ca8d6750ba4f69a50284765e5883dee860181
F src/vdbeInt.h e09362d6323a725de3c30b0cc381a691e86ed697
-F src/vdbeapi.c 20bf8901592c7f38e8aabb448a913327ab19f0a7
-F src/vdbeaux.c 066766b06836d6dbb8d7ad5d87b539f383e0f10d
+F src/vdbeapi.c c7208bb89fc4efc605e20328099a540175e2dae6
+F src/vdbeaux.c 0fbc50cf7aed1ea30c89839ad316446b839cc645
F src/vdbemem.c ef9ac7d32acfe4bce5c5b408b1294c8d9e0cdb56
F src/where.c 12e214870c84546858ddb9f121165a1fbfce6811
F test/all.test 929bfa932b55e75c96fe2203f7650ba451c1862c
F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35
F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b
F test/threadtest2.c 97a830d53c24c42290501fdfba4a6e5bdd34748b
-F test/trace.test 0ed72787440d97c6de6b6ecb4c022e6f78d5d94a
+F test/trace.test b6fb0931e4ac802414977a09109c0b02ee446202
F test/trans.test 29645b344d2b9b6792793562b12340177ddd8f96
F test/trigger1.test dc015c410161f1a6109fd52638dfac852e2a34de
F test/trigger2.test a5d06e6e8e1e773cfcb5aaa75ab381b2ff35de63
F www/audit.tcl 90e09d580f79c7efec0c7d6f447b7ec5c2dce5c0
F www/c_interface.tcl 83b39203e1ded4c2dab97f42edf31279a308efcb
F www/capi3.tcl 5c1cb163f4d2a54e2d0e22dcc399dd71245c8b89
-F www/capi3ref.tcl aa6ea82ea34ff71357300b8f1ab9fd8232a9eec8
+F www/capi3ref.tcl 893977e2b1c8ae47a441335bc124cdc6d5fdbe95
F www/changes.tcl 3641bc28b86b40c82d546727da45ea0f0aa9a9f4
F www/common.tcl f786e6be86fb2627ceb30e770e9efa83b9c67a3a
F www/conflict.tcl fb8a2ba83746c7fdfd9e52fa7f6aaf5c422b8246
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P dd62224ae8d1047db388acdc4b91eb56fb9e966a
-R b72a839b56c08880706fc5af1e49a3b1
+P c1f1320be5ce0b6e52491577078ba2b939882fbd
+R aecc6b7d054a0a0bc5b475a58b060454
U drh
-Z 55b7cec5724fd9cc6c0ba5706bebd5ec
+Z 08c3c5131edf3b7397865edadac24eb1
-c1f1320be5ce0b6e52491577078ba2b939882fbd
\ No newline at end of file
+0cc2f40e6afa157ead45140c4e28a9a33c469b73
\ No newline at end of file
** ROLLBACK
** PRAGMA
**
-** $Id: build.c,v 1.252 2004/09/08 15:09:41 drh Exp $
+** $Id: build.c,v 1.253 2004/09/15 13:38:11 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto);
}
-#ifndef NDEBUG
/* Add a No-op that contains the complete text of the compiled SQL
** statement as its P3 argument. This does not change the functionality
- ** of the program. But it does make it easier to debug.
+ ** of the program.
+ **
+ ** This is used to implement sqlite3_trace() functionality.
*/
sqlite3VdbeOp3(v, OP_Noop, 0, 0, pParse->zSql, pParse->zTail-pParse->zSql);
-#endif
}
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
-** $Id: main.c,v 1.259 2004/09/06 17:24:13 drh Exp $
+** $Id: main.c,v 1.260 2004/09/15 13:38:11 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
sParse.db = db;
sqlite3RunParser(&sParse, zSql, &zErrMsg);
- if( db->xTrace && !db->init.busy ){
- /* Trace only the statment that was compiled.
- ** Make a copy of that part of the SQL string since zSQL is const
- ** and we must pass a zero terminated string to the trace function
- ** The copy is unnecessary if the tail pointer is pointing at the
- ** beginning or end of the SQL string.
- */
- if( sParse.zTail && sParse.zTail!=zSql && *sParse.zTail ){
- char *tmpSql = sqliteStrNDup(zSql, sParse.zTail - zSql);
- if( tmpSql ){
- db->xTrace(db->pTraceArg, tmpSql);
- sqliteFree(tmpSql);
- }else{
- /* If a memory error occurred during the copy,
- ** trace entire SQL string and fall through to the
- ** sqlite3_malloc_failed test to report the error.
- */
- db->xTrace(db->pTraceArg, zSql);
- }
- }else{
- db->xTrace(db->pTraceArg, zSql);
- }
- }
-
- /* Print a copy of SQL as it is executed if the SQL_TRACE pragma is turned
- ** on in debugging mode.
- */
-#ifdef SQLITE_DEBUG
- if( (db->flags & SQLITE_SqlTrace)!=0 && sParse.zTail && sParse.zTail!=zSql ){
- sqlite3DebugPrintf("SQL-trace: %.*s\n", sParse.zTail - zSql, zSql);
- }
-#endif /* SQLITE_DEBUG */
-
-
if( sqlite3_malloc_failed ){
rc = SQLITE_NOMEM;
sqlite3RollbackAll(db);
return SQLITE_MISUSE;
}
if( p->pc<0 ){
+ /* Invoke the trace callback if there is one
+ */
+ if( (db = p->db)->xTrace && !db->init.busy ){
+ assert( p->nOp>0 );
+ assert( p->aOp[p->nOp-1].opcode==OP_Noop );
+ assert( p->aOp[p->nOp-1].p3!=0 );
+ assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC );
+ sqlite3SafetyOff(db);
+ db->xTrace(db->pTraceArg, p->aOp[p->nOp-1].p3);
+ if( sqlite3SafetyOn(db) ){
+ p->rc = SQLITE_MISUSE;
+ return SQLITE_MISUSE;
+ }
+ }
+
+ /* Print a copy of SQL as it is executed if the SQL_TRACE pragma is turned
+ ** on in debugging mode.
+ */
+#ifdef SQLITE_DEBUG
+ if( (db->flags & SQLITE_SqlTrace)!=0 ){
+ sqlite3DebugPrintf("SQL-trace: %s\n", p->aOp[p->nOp-1].p3);
+ }
+#endif /* SQLITE_DEBUG */
+
db->activeVdbeCnt++;
p->pc = 0;
}
#ifdef SQLITE_DEBUG
int nOp = p->nOp;
VdbeOp *pOp;
- if( nOp<2 ) return;
- pOp = &p->aOp[nOp-2];
+ if( nOp<1 ) return;
+ pOp = &p->aOp[nOp-1];
if( pOp->opcode==OP_Noop && pOp->p3!=0 ){
const char *z = pOp->p3;
while( isspace(*(u8*)z) ) z++;
assert( p!=0 );
assert( p->magic==VDBE_MAGIC_INIT );
- /* Add a HALT instruction to the very end of the program.
+ /* There should be at least one opcode.
*/
- if( p->nOp==0 || (p->aOp && p->aOp[p->nOp-1].opcode!=OP_Halt) ){
- sqlite3VdbeAddOp(p, OP_Halt, 0, 0);
- }
+ assert( p->nOp>0 );
/* No instruction ever pushes more than a single element onto the
** stack. And the stack never grows on successive executions of the
#
# This file implements tests for the "sqlite3_trace()" API.
#
-# $Id: trace.test,v 1.2 2004/06/30 02:35:51 danielk1977 Exp $
+# $Id: trace.test,v 1.3 2004/09/15 13:38:11 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
} {1 2}
do_test trace-1.4 {
set ::stmtlist
-} {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;} {}}
+} {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;}}
do_test trace-1.5 {
db trace {}
db trace
} {}
+# If we prepare a statement and execute it multiple times, the trace
+# happens on each execution.
+#
+db close
+set DB [sqlite3 db test.db]
+do_test trace-2.1 {
+ set STMT [sqlite3_prepare $DB {INSERT INTO t1 VALUES(2,3)} -1 TAIL]
+ db trace trace_proc
+ proc trace_proc sql {
+ global TRACE_OUT
+ set TRACE_OUT $sql
+ }
+ set TRACE_OUT {}
+ sqlite3_step $STMT
+ set TRACE_OUT
+} {INSERT INTO t1 VALUES(2,3)}
+do_test trace-2.2 {
+ set TRACE_OUT {}
+ sqlite3_reset $STMT
+ set TRACE_OUT
+} {}
+do_test trace-2.3 {
+ sqlite3_step $STMT
+ set TRACE_OUT
+} {INSERT INTO t1 VALUES(2,3)}
+do_test trace-2.4 {
+ execsql {SELECT * FROM t1}
+} {1 2 2 3 2 3}
+do_test trace-2.5 {
+ set TRACE_OUT
+} {SELECT * FROM t1}
+
+
finish_test
-set rcsid {$Id: capi3ref.tcl,v 1.11 2004/09/07 16:19:54 drh Exp $}
+set rcsid {$Id: capi3ref.tcl,v 1.12 2004/09/15 13:38:11 drh Exp $}
source common.tcl
header {C/C++ Interface For SQLite Version 3}
puts {
api {} {
void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
} {
- Register a function that is called at every invocation of sqlite3_exec()
- or sqlite3_prepare(). This function can be used (for example) to generate
- a log file of all SQL executed against a database. This is frequently
+ Register a function that is called each time an SQL statement is evaluated.
+ The callback function is invoked on the first call to sqlite3_step() after
+ calls to sqlite3_prepare() or sqlite3_reset().
+ This function can be used (for example) to generate
+ a log file of all SQL executed against a database. This can be
useful when debugging an application that uses SQLite.
}