From: drh Date: Wed, 2 Sep 2015 17:55:12 +0000 (+0000) Subject: Change sqlite3_sql() so that it always returns the SQL text of the prepared X-Git-Tag: version-3.9.0~164 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ef41dfe5b16b6046223a28ff729b4ab58f358b88;p=thirdparty%2Fsqlite.git Change sqlite3_sql() so that it always returns the SQL text of the prepared statement, if the text is available, even if the the prepared statement was generated using sqlite3_prepare() instead of sqlite3_prepare_v2(). Also include some minor comment fixes and code simplifications. FossilOrigin-Name: 2f5472cfda6c72e75b9cf7b7481612465c1a5e6a --- diff --git a/manifest b/manifest index 67042b09db..753a360c91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\ssimplification\sto\sthe\sEXPLAIN\sQUERY\sPLAN\slogic. -D 2015-09-02T16:51:37.514 +C Change\ssqlite3_sql()\sso\sthat\sit\salways\sreturns\sthe\sSQL\stext\sof\sthe\sprepared\nstatement,\sif\sthe\stext\sis\savailable,\seven\sif\sthe\sthe\sprepared\sstatement\swas\ngenerated\susing\ssqlite3_prepare()\sinstead\sof\ssqlite3_prepare_v2().\s\sAlso\ninclude\ssome\sminor\scomment\sfixes\sand\scode\ssimplifications. +D 2015-09-02T17:55:12.694 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -404,7 +404,7 @@ F src/vdbe.c 6d85be995bd2308a5aa2a68c7b564c5d4cc1a6fb F src/vdbe.h 7a75045d879118b9d3af7e8b3c108f2f27c51473 F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816 F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f -F src/vdbeaux.c af2d86b2b114a106c94fc656503fc5c89594f5af +F src/vdbeaux.c a5d98e1d6443d96666af8134b35c72a6c7262b96 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b @@ -1380,7 +1380,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 82355e41084387fa11b7b531e4d660dd3b4cd984 -R 24d6bc28c6b4612282a7c50341fa4c3b +P d1592d201afea20cb2ca94fe2bf5ae031bd29ede +R 5c0a36335a16d9c6f40f2328ad880c60 U drh -Z 2e9b16d5ccccceea14352a27b62cdb47 +Z 02a692c7e94743745a23778fec8a8ab8 diff --git a/manifest.uuid b/manifest.uuid index 14752ac8fe..0a0bf3cfd6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1592d201afea20cb2ca94fe2bf5ae031bd29ede \ No newline at end of file +2f5472cfda6c72e75b9cf7b7481612465c1a5e6a \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e866e9dcfe..02fb46397b 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -68,7 +68,7 @@ void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, int isPrepareV2){ */ const char *sqlite3_sql(sqlite3_stmt *pStmt){ Vdbe *p = (Vdbe *)pStmt; - return (p && p->isPrepareV2) ? p->zSql : 0; + return p ? p->zSql : 0; } /* @@ -319,7 +319,8 @@ void sqlite3VdbeResolveLabel(Vdbe *v, int x){ int j = -1-x; assert( v->magic==VDBE_MAGIC_INIT ); assert( jnLabel ); - if( ALWAYS(j>=0) && p->aLabel ){ + assert( j>=0 ); + if( p->aLabel ){ p->aLabel[j] = v->nOp; } p->iFixedOp = v->nOp - 1; @@ -463,17 +464,21 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ /* -** Loop through the program looking for P2 values that are negative -** on jump instructions. Each such value is a label. Resolve the -** label by setting the P2 value to its correct non-zero value. +** This routine is called after all opcodes have been inserted. It loops +** through all the opcodes and fixes up some details. +** +** (1) For each jump instruction with a negative P2 value (a label) +** resolve the P2 value to an actual address. +** +** (2) Compute the maximum number of arguments used by any SQL function +** and store that value in *pMaxFuncArgs. ** -** This routine is called once after all opcodes have been inserted. +** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately +** indicate what the prepared statement actually does. ** -** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument -** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by -** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array. +** (4) Initialize the p4.xAdvance pointer on opcodes that use it. ** -** The Op.opflags field is set on all opcodes. +** (5) Reclaim the memory allocated for storing labels. */ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ int i; @@ -586,46 +591,44 @@ VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ ** address of the first operation added. */ int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp, int iLineno){ - int addr; + int addr, i; + VdbeOp *pOut; + assert( nOp>0 ); assert( p->magic==VDBE_MAGIC_INIT ); if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ return 0; } addr = p->nOp; - if( ALWAYS(nOp>0) ){ - int i; - VdbeOpList const *pIn = aOp; - for(i=0; ip2; - VdbeOp *pOut = &p->aOp[i+addr]; - pOut->opcode = pIn->opcode; - pOut->p1 = pIn->p1; - if( p2<0 ){ - assert( sqlite3OpcodeProperty[pOut->opcode] & OPFLG_JUMP ); - pOut->p2 = addr + ADDR(p2); - }else{ - pOut->p2 = p2; - } - pOut->p3 = pIn->p3; - pOut->p4type = P4_NOTUSED; - pOut->p4.p = 0; - pOut->p5 = 0; + pOut = &p->aOp[addr]; + for(i=0; ip2; + pOut->opcode = aOp->opcode; + pOut->p1 = aOp->p1; + if( p2<0 ){ + assert( sqlite3OpcodeProperty[pOut->opcode] & OPFLG_JUMP ); + pOut->p2 = addr + ADDR(p2); + }else{ + pOut->p2 = p2; + } + pOut->p3 = aOp->p3; + pOut->p4type = P4_NOTUSED; + pOut->p4.p = 0; + pOut->p5 = 0; #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - pOut->zComment = 0; + pOut->zComment = 0; #endif #ifdef SQLITE_VDBE_COVERAGE - pOut->iSrcLine = iLineno+i; + pOut->iSrcLine = iLineno+i; #else - (void)iLineno; + (void)iLineno; #endif #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ - sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]); - } -#endif + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]); } - p->nOp += nOp; +#endif } + p->nOp += nOp; return addr; }