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
This commit is contained in:
drh
2015-09-02 17:55:12 +00:00
parent 2ed0d809a6
commit ef41dfe5b1
3 changed files with 47 additions and 44 deletions
+6 -6
View File
@@ -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
+1 -1
View File
@@ -1 +1 @@
d1592d201afea20cb2ca94fe2bf5ae031bd29ede
2f5472cfda6c72e75b9cf7b7481612465c1a5e6a
+40 -37
View File
@@ -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( j<p->nLabel );
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.
**
** This routine is called once after all opcodes have been inserted.
** (1) For each jump instruction with a negative P2 value (a label)
** resolve the P2 value to an actual address.
**
** 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.
** (2) Compute the maximum number of arguments used by any SQL function
** and store that value in *pMaxFuncArgs.
**
** The Op.opflags field is set on all opcodes.
** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately
** indicate what the prepared statement actually does.
**
** (4) Initialize the p4.xAdvance pointer on opcodes that use it.
**
** (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; i<nOp; i++, pIn++){
int p2 = pIn->p2;
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; i<nOp; i++, aOp++, pOut++){
int p2 = aOp->p2;
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;
}