PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - pdo_sqlite/sqlite/src - vdbeapi.c
Test: PHP Code Coverage
Date: 2009-11-19 Instrumented lines: 322
Code covered: 41.6 % Executed lines: 134
Legend: not executed executed

       1                 : /*
       2                 : ** 2004 May 26
       3                 : **
       4                 : ** The author disclaims copyright to this source code.  In place of
       5                 : ** a legal notice, here is a blessing:
       6                 : **
       7                 : **    May you do good and not evil.
       8                 : **    May you find forgiveness for yourself and forgive others.
       9                 : **    May you share freely, never taking more than you give.
      10                 : **
      11                 : *************************************************************************
      12                 : **
      13                 : ** This file contains code use to implement APIs that are part of the
      14                 : ** VDBE.
      15                 : */
      16                 : #include "sqliteInt.h"
      17                 : #include "vdbeInt.h"
      18                 : #include "os.h"
      19                 : 
      20                 : /*
      21                 : ** Return TRUE (non-zero) of the statement supplied as an argument needs
      22                 : ** to be recompiled.  A statement needs to be recompiled whenever the
      23                 : ** execution environment changes in a way that would alter the program
      24                 : ** that sqlite3_prepare() generates.  For example, if new functions or
      25                 : ** collating sequences are registered or if an authorizer function is
      26                 : ** added or changed.
      27                 : */
      28               0 : int sqlite3_expired(sqlite3_stmt *pStmt){
      29               0 :   Vdbe *p = (Vdbe*)pStmt;
      30               0 :   return p==0 || p->expired;
      31                 : }
      32                 : 
      33                 : /**************************** sqlite3_value_  *******************************
      34                 : ** The following routines extract information from a Mem or sqlite3_value
      35                 : ** structure.
      36                 : */
      37               0 : const void *sqlite3_value_blob(sqlite3_value *pVal){
      38               0 :   Mem *p = (Mem*)pVal;
      39               0 :   if( p->flags & (MEM_Blob|MEM_Str) ){
      40               0 :     return p->z;
      41                 :   }else{
      42               0 :     return sqlite3_value_text(pVal);
      43                 :   }
      44                 : }
      45             516 : int sqlite3_value_bytes(sqlite3_value *pVal){
      46             516 :   return sqlite3ValueBytes(pVal, SQLITE_UTF8);
      47                 : }
      48               0 : int sqlite3_value_bytes16(sqlite3_value *pVal){
      49               0 :   return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE);
      50                 : }
      51               0 : double sqlite3_value_double(sqlite3_value *pVal){
      52               0 :   return sqlite3VdbeRealValue((Mem*)pVal);
      53                 : }
      54               0 : int sqlite3_value_int(sqlite3_value *pVal){
      55               0 :   return sqlite3VdbeIntValue((Mem*)pVal);
      56                 : }
      57               0 : sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
      58               0 :   return sqlite3VdbeIntValue((Mem*)pVal);
      59                 : }
      60            2072 : const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
      61            2072 :   return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
      62                 : }
      63                 : #ifndef SQLITE_OMIT_UTF16
      64               0 : const void *sqlite3_value_text16(sqlite3_value* pVal){
      65               0 :   return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE);
      66                 : }
      67               0 : const void *sqlite3_value_text16be(sqlite3_value *pVal){
      68               0 :   return sqlite3ValueText(pVal, SQLITE_UTF16BE);
      69                 : }
      70               0 : const void *sqlite3_value_text16le(sqlite3_value *pVal){
      71               0 :   return sqlite3ValueText(pVal, SQLITE_UTF16LE);
      72                 : }
      73                 : #endif /* SQLITE_OMIT_UTF16 */
      74             714 : int sqlite3_value_type(sqlite3_value* pVal){
      75             714 :   return pVal->type;
      76                 : }
      77                 : /* sqlite3_value_numeric_type() defined in vdbe.c */
      78                 : 
      79                 : /**************************** sqlite3_result_  *******************************
      80                 : ** The following routines are used by user-defined functions to specify
      81                 : ** the function result.
      82                 : */
      83                 : void sqlite3_result_blob(
      84                 :   sqlite3_context *pCtx, 
      85                 :   const void *z, 
      86                 :   int n, 
      87                 :   void (*xDel)(void *)
      88               0 : ){
      89                 :   assert( n>=0 );
      90               0 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, 0, xDel);
      91               0 : }
      92               0 : void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
      93               0 :   sqlite3VdbeMemSetDouble(&pCtx->s, rVal);
      94               0 : }
      95               0 : void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
      96               0 :   pCtx->isError = 1;
      97               0 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
      98               0 : }
      99                 : #ifndef SQLITE_OMIT_UTF16
     100               0 : void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
     101               0 :   pCtx->isError = 1;
     102               0 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
     103               0 : }
     104                 : #endif
     105               0 : void sqlite3_result_int(sqlite3_context *pCtx, int iVal){
     106               0 :   sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal);
     107               0 : }
     108              14 : void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){
     109              14 :   sqlite3VdbeMemSetInt64(&pCtx->s, iVal);
     110              14 : }
     111               0 : void sqlite3_result_null(sqlite3_context *pCtx){
     112               0 :   sqlite3VdbeMemSetNull(&pCtx->s);
     113               0 : }
     114                 : void sqlite3_result_text(
     115                 :   sqlite3_context *pCtx, 
     116                 :   const char *z, 
     117                 :   int n,
     118                 :   void (*xDel)(void *)
     119               3 : ){
     120               3 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, xDel);
     121               3 : }
     122                 : #ifndef SQLITE_OMIT_UTF16
     123                 : void sqlite3_result_text16(
     124                 :   sqlite3_context *pCtx, 
     125                 :   const void *z, 
     126                 :   int n, 
     127                 :   void (*xDel)(void *)
     128               0 : ){
     129               0 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, xDel);
     130               0 : }
     131                 : void sqlite3_result_text16be(
     132                 :   sqlite3_context *pCtx, 
     133                 :   const void *z, 
     134                 :   int n, 
     135                 :   void (*xDel)(void *)
     136               0 : ){
     137               0 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16BE, xDel);
     138               0 : }
     139                 : void sqlite3_result_text16le(
     140                 :   sqlite3_context *pCtx, 
     141                 :   const void *z, 
     142                 :   int n, 
     143                 :   void (*xDel)(void *)
     144               0 : ){
     145               0 :   sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16LE, xDel);
     146               0 : }
     147                 : #endif /* SQLITE_OMIT_UTF16 */
     148               0 : void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
     149               0 :   sqlite3VdbeMemCopy(&pCtx->s, pValue);
     150               0 : }
     151                 : 
     152                 : 
     153                 : /*
     154                 : ** Execute the statement pStmt, either until a row of data is ready, the
     155                 : ** statement is completely executed or an error occurs.
     156                 : **
     157                 : ** This routine implements the bulk of the logic behind the sqlite_step()
     158                 : ** API.  The only thing omitted is the automatic recompile if a 
     159                 : ** schema change has occurred.  That detail is handled by the
     160                 : ** outer sqlite3_step() wrapper procedure.
     161                 : */
     162            1000 : static int sqlite3Step(Vdbe *p){
     163                 :   sqlite3 *db;
     164                 :   int rc;
     165                 : 
     166                 :   /* Assert that malloc() has not failed */
     167                 :   assert( !sqlite3MallocFailed() );
     168                 : 
     169            1000 :   if( p==0 || p->magic!=VDBE_MAGIC_RUN ){
     170               0 :     return SQLITE_MISUSE;
     171                 :   }
     172            1000 :   if( p->aborted ){
     173               0 :     return SQLITE_ABORT;
     174                 :   }
     175            1000 :   if( p->pc<=0 && p->expired ){
     176               0 :     if( p->rc==SQLITE_OK ){
     177               0 :       p->rc = SQLITE_SCHEMA;
     178                 :     }
     179               0 :     rc = SQLITE_ERROR;
     180               0 :     goto end_of_step;
     181                 :   }
     182            1000 :   db = p->db;
     183            1000 :   if( sqlite3SafetyOn(db) ){
     184               0 :     p->rc = SQLITE_MISUSE;
     185               0 :     return SQLITE_MISUSE;
     186                 :   }
     187            1000 :   if( p->pc<0 ){
     188                 :     /* If there are no other statements currently running, then
     189                 :     ** reset the interrupt flag.  This prevents a call to sqlite3_interrupt
     190                 :     ** from interrupting a statement that has not yet started.
     191                 :     */
     192             695 :     if( db->activeVdbeCnt==0 ){
     193             578 :       db->u1.isInterrupted = 0;
     194                 :     }
     195                 : 
     196                 : #ifndef SQLITE_OMIT_TRACE
     197                 :     /* Invoke the trace callback if there is one
     198                 :     */
     199             695 :     if( db->xTrace && !db->init.busy ){
     200                 :       assert( p->nOp>0 );
     201                 :       assert( p->aOp[p->nOp-1].opcode==OP_Noop );
     202                 :       assert( p->aOp[p->nOp-1].p3!=0 );
     203                 :       assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC );
     204               0 :       sqlite3SafetyOff(db);
     205               0 :       db->xTrace(db->pTraceArg, p->aOp[p->nOp-1].p3);
     206               0 :       if( sqlite3SafetyOn(db) ){
     207               0 :         p->rc = SQLITE_MISUSE;
     208               0 :         return SQLITE_MISUSE;
     209                 :       }
     210                 :     }
     211             695 :     if( db->xProfile && !db->init.busy ){
     212                 :       double rNow;
     213               0 :       sqlite3OsCurrentTime(&rNow);
     214               0 :       p->startTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0;
     215                 :     }
     216                 : #endif
     217                 : 
     218                 :     /* Print a copy of SQL as it is executed if the SQL_TRACE pragma is turned
     219                 :     ** on in debugging mode.
     220                 :     */
     221                 : #ifdef SQLITE_DEBUG
     222                 :     if( (db->flags & SQLITE_SqlTrace)!=0 ){
     223                 :       sqlite3DebugPrintf("SQL-trace: %s\n", p->aOp[p->nOp-1].p3);
     224                 :     }
     225                 : #endif /* SQLITE_DEBUG */
     226                 : 
     227             695 :     db->activeVdbeCnt++;
     228             695 :     p->pc = 0;
     229                 :   }
     230                 : #ifndef SQLITE_OMIT_EXPLAIN
     231            1000 :   if( p->explain ){
     232               0 :     rc = sqlite3VdbeList(p);
     233                 :   }else
     234                 : #endif /* SQLITE_OMIT_EXPLAIN */
     235                 :   {
     236            1000 :     rc = sqlite3VdbeExec(p);
     237                 :   }
     238                 : 
     239            1000 :   if( sqlite3SafetyOff(db) ){
     240               0 :     rc = SQLITE_MISUSE;
     241                 :   }
     242                 : 
     243                 : #ifndef SQLITE_OMIT_TRACE
     244                 :   /* Invoke the profile callback if there is one
     245                 :   */
     246            1000 :   if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy ){
     247                 :     double rNow;
     248                 :     u64 elapseTime;
     249                 : 
     250               0 :     sqlite3OsCurrentTime(&rNow);
     251               0 :     elapseTime = (rNow - (int)rNow)*3600.0*24.0*1000000000.0 - p->startTime;
     252                 :     assert( p->nOp>0 );
     253                 :     assert( p->aOp[p->nOp-1].opcode==OP_Noop );
     254                 :     assert( p->aOp[p->nOp-1].p3!=0 );
     255                 :     assert( p->aOp[p->nOp-1].p3type==P3_DYNAMIC );
     256               0 :     db->xProfile(db->pProfileArg, p->aOp[p->nOp-1].p3, elapseTime);
     257                 :   }
     258                 : #endif
     259                 : 
     260            1000 :   sqlite3Error(p->db, rc, 0);
     261            1000 :   p->rc = sqlite3ApiExit(p->db, p->rc);
     262            1000 : end_of_step:
     263                 :   assert( (rc&0xff)==rc );
     264            1000 :   if( p->zSql && (rc&0xff)<SQLITE_ROW ){
     265                 :     /* This behavior occurs if sqlite3_prepare_v2() was used to build
     266                 :     ** the prepared statement.  Return error codes directly */
     267               0 :     return p->rc;
     268                 :   }else{
     269                 :     /* This is for legacy sqlite3_prepare() builds and when the code
     270                 :     ** is SQLITE_ROW or SQLITE_DONE */
     271            1000 :     return rc;
     272                 :   }
     273                 : }
     274                 : 
     275                 : /*
     276                 : ** This is the top-level implementation of sqlite3_step().  Call
     277                 : ** sqlite3Step() to do most of the work.  If a schema error occurs,
     278                 : ** call sqlite3Reprepare() and try again.
     279                 : */
     280                 : #ifdef SQLITE_OMIT_PARSER
     281                 : int sqlite3_step(sqlite3_stmt *pStmt){
     282                 :   return sqlite3Step((Vdbe*)pStmt);
     283                 : }
     284                 : #else
     285            1000 : int sqlite3_step(sqlite3_stmt *pStmt){
     286            1000 :   int cnt = 0;
     287                 :   int rc;
     288            1000 :   Vdbe *v = (Vdbe*)pStmt;
     289            2000 :   while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
     290                 :          && cnt++ < 5
     291                 :          && sqlite3Reprepare(v) ){
     292               0 :     sqlite3_reset(pStmt);
     293               0 :     v->expired = 0;
     294                 :   }
     295            1000 :   return rc;
     296                 : }
     297                 : #endif
     298                 : 
     299                 : /*
     300                 : ** Extract the user data from a sqlite3_context structure and return a
     301                 : ** pointer to it.
     302                 : */
     303               5 : void *sqlite3_user_data(sqlite3_context *p){
     304                 :   assert( p && p->pFunc );
     305               5 :   return p->pFunc->pUserData;
     306                 : }
     307                 : 
     308                 : /*
     309                 : ** The following is the implementation of an SQL function that always
     310                 : ** fails with an error message stating that the function is used in the
     311                 : ** wrong context.  The sqlite3_overload_function() API might construct
     312                 : ** SQL function that use this routine so that the functions will exist
     313                 : ** for name resolution but are actually overloaded by the xFindFunction
     314                 : ** method of virtual tables.
     315                 : */
     316                 : void sqlite3InvalidFunction(
     317                 :   sqlite3_context *context,  /* The function calling context */
     318                 :   int argc,                  /* Number of arguments to the function */
     319                 :   sqlite3_value **argv       /* Value of each argument */
     320               0 : ){
     321               0 :   const char *zName = context->pFunc->zName;
     322                 :   char *zErr;
     323               0 :   zErr = sqlite3MPrintf(
     324                 :       "unable to use function %s in the requested context", zName);
     325               0 :   sqlite3_result_error(context, zErr, -1);
     326               0 :   sqliteFree(zErr);
     327               0 : }
     328                 : 
     329                 : /*
     330                 : ** Allocate or return the aggregate context for a user function.  A new
     331                 : ** context is allocated on the first call.  Subsequent calls return the
     332                 : ** same context that was returned on prior calls.
     333                 : */
     334              60 : void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){
     335              60 :   Mem *pMem = p->pMem;
     336                 :   assert( p && p->pFunc && p->pFunc->xStep );
     337              60 :   if( (pMem->flags & MEM_Agg)==0 ){
     338              15 :     if( nByte==0 ){
     339                 :       assert( pMem->flags==MEM_Null );
     340               4 :       pMem->z = 0;
     341                 :     }else{
     342              11 :       pMem->flags = MEM_Agg;
     343              11 :       pMem->xDel = sqlite3FreeX;
     344              11 :       pMem->u.pDef = p->pFunc;
     345              11 :       if( nByte<=NBFS ){
     346              11 :         pMem->z = pMem->zShort;
     347              11 :         memset(pMem->z, 0, nByte);
     348                 :       }else{
     349               0 :         pMem->z = sqliteMalloc( nByte );
     350                 :       }
     351                 :     }
     352                 :   }
     353              60 :   return (void*)pMem->z;
     354                 : }
     355                 : 
     356                 : /*
     357                 : ** Return the auxilary data pointer, if any, for the iArg'th argument to
     358                 : ** the user-function defined by pCtx.
     359                 : */
     360               0 : void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){
     361               0 :   VdbeFunc *pVdbeFunc = pCtx->pVdbeFunc;
     362               0 :   if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){
     363               0 :     return 0;
     364                 :   }
     365               0 :   return pVdbeFunc->apAux[iArg].pAux;
     366                 : }
     367                 : 
     368                 : /*
     369                 : ** Set the auxilary data pointer and delete function, for the iArg'th
     370                 : ** argument to the user-function defined by pCtx. Any previous value is
     371                 : ** deleted by calling the delete function specified when it was set.
     372                 : */
     373                 : void sqlite3_set_auxdata(
     374                 :   sqlite3_context *pCtx, 
     375                 :   int iArg, 
     376                 :   void *pAux, 
     377                 :   void (*xDelete)(void*)
     378               0 : ){
     379                 :   struct AuxData *pAuxData;
     380                 :   VdbeFunc *pVdbeFunc;
     381               0 :   if( iArg<0 ) return;
     382                 : 
     383               0 :   pVdbeFunc = pCtx->pVdbeFunc;
     384               0 :   if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){
     385               0 :     int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg;
     386               0 :     pVdbeFunc = sqliteRealloc(pVdbeFunc, nMalloc);
     387               0 :     if( !pVdbeFunc ) return;
     388               0 :     pCtx->pVdbeFunc = pVdbeFunc;
     389               0 :     memset(&pVdbeFunc->apAux[pVdbeFunc->nAux], 0, 
     390                 :              sizeof(struct AuxData)*(iArg+1-pVdbeFunc->nAux));
     391               0 :     pVdbeFunc->nAux = iArg+1;
     392               0 :     pVdbeFunc->pFunc = pCtx->pFunc;
     393                 :   }
     394                 : 
     395               0 :   pAuxData = &pVdbeFunc->apAux[iArg];
     396               0 :   if( pAuxData->pAux && pAuxData->xDelete ){
     397               0 :     pAuxData->xDelete(pAuxData->pAux);
     398                 :   }
     399               0 :   pAuxData->pAux = pAux;
     400               0 :   pAuxData->xDelete = xDelete;
     401                 : }
     402                 : 
     403                 : /*
     404                 : ** Return the number of times the Step function of a aggregate has been 
     405                 : ** called.
     406                 : **
     407                 : ** This function is deprecated.  Do not use it for new code.  It is
     408                 : ** provide only to avoid breaking legacy code.  New aggregate function
     409                 : ** implementations should keep their own counts within their aggregate
     410                 : ** context.
     411                 : */
     412               3 : int sqlite3_aggregate_count(sqlite3_context *p){
     413                 :   assert( p && p->pFunc && p->pFunc->xStep );
     414               3 :   return p->pMem->n;
     415                 : }
     416                 : 
     417                 : /*
     418                 : ** Return the number of columns in the result set for the statement pStmt.
     419                 : */
     420            1061 : int sqlite3_column_count(sqlite3_stmt *pStmt){
     421            1061 :   Vdbe *pVm = (Vdbe *)pStmt;
     422            1061 :   return pVm ? pVm->nResColumn : 0;
     423                 : }
     424                 : 
     425                 : /*
     426                 : ** Return the number of values available from the current row of the
     427                 : ** currently executing statement pStmt.
     428                 : */
     429            2655 : int sqlite3_data_count(sqlite3_stmt *pStmt){
     430            2655 :   Vdbe *pVm = (Vdbe *)pStmt;
     431            2655 :   if( pVm==0 || !pVm->resOnStack ) return 0;
     432            2655 :   return pVm->nResColumn;
     433                 : }
     434                 : 
     435                 : 
     436                 : /*
     437                 : ** Check to see if column iCol of the given statement is valid.  If
     438                 : ** it is, return a pointer to the Mem for the value of that column.
     439                 : ** If iCol is not valid, return a pointer to a Mem which has a value
     440                 : ** of NULL.
     441                 : */
     442            1998 : static Mem *columnMem(sqlite3_stmt *pStmt, int i){
     443            1998 :   Vdbe *pVm = (Vdbe *)pStmt;
     444            1998 :   int vals = sqlite3_data_count(pStmt);
     445            1998 :   if( i>=vals || i<0 ){
     446                 :     static const Mem nullMem = {{0}, 0.0, "", 0, MEM_Null, MEM_Null };
     447               0 :     sqlite3Error(pVm->db, SQLITE_RANGE, 0);
     448               0 :     return (Mem*)&nullMem;
     449                 :   }
     450            1998 :   return &pVm->pTos[(1-vals)+i];
     451                 : }
     452                 : 
     453                 : /*
     454                 : ** This function is called after invoking an sqlite3_value_XXX function on a 
     455                 : ** column value (i.e. a value returned by evaluating an SQL expression in the
     456                 : ** select list of a SELECT statement) that may cause a malloc() failure. If 
     457                 : ** malloc() has failed, the threads mallocFailed flag is cleared and the result
     458                 : ** code of statement pStmt set to SQLITE_NOMEM.
     459                 : **
     460                 : ** Specificly, this is called from within:
     461                 : **
     462                 : **     sqlite3_column_int()
     463                 : **     sqlite3_column_int64()
     464                 : **     sqlite3_column_text()
     465                 : **     sqlite3_column_text16()
     466                 : **     sqlite3_column_real()
     467                 : **     sqlite3_column_bytes()
     468                 : **     sqlite3_column_bytes16()
     469                 : **
     470                 : ** But not for sqlite3_column_blob(), which never calls malloc().
     471                 : */
     472                 : static void columnMallocFailure(sqlite3_stmt *pStmt)
     473            1312 : {
     474                 :   /* If malloc() failed during an encoding conversion within an
     475                 :   ** sqlite3_column_XXX API, then set the return code of the statement to
     476                 :   ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR
     477                 :   ** and _finalize() will return NOMEM.
     478                 :   */
     479            1312 :   Vdbe *p = (Vdbe *)pStmt;
     480            1312 :   p->rc = sqlite3ApiExit(0, p->rc);
     481            1312 : }
     482                 : 
     483                 : /**************************** sqlite3_column_  *******************************
     484                 : ** The following routines are used to access elements of the current row
     485                 : ** in the result set.
     486                 : */
     487               0 : const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){
     488                 :   const void *val;
     489                 :   sqlite3MallocDisallow();
     490               0 :   val = sqlite3_value_blob( columnMem(pStmt,i) );
     491                 :   sqlite3MallocAllow();
     492               0 :   return val;
     493                 : }
     494             512 : int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){
     495             512 :   int val = sqlite3_value_bytes( columnMem(pStmt,i) );
     496             512 :   columnMallocFailure(pStmt);
     497             512 :   return val;
     498                 : }
     499               0 : int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){
     500               0 :   int val = sqlite3_value_bytes16( columnMem(pStmt,i) );
     501               0 :   columnMallocFailure(pStmt);
     502               0 :   return val;
     503                 : }
     504               0 : double sqlite3_column_double(sqlite3_stmt *pStmt, int i){
     505               0 :   double val = sqlite3_value_double( columnMem(pStmt,i) );
     506               0 :   columnMallocFailure(pStmt);
     507               0 :   return val;
     508                 : }
     509               0 : int sqlite3_column_int(sqlite3_stmt *pStmt, int i){
     510               0 :   int val = sqlite3_value_int( columnMem(pStmt,i) );
     511               0 :   columnMallocFailure(pStmt);
     512               0 :   return val;
     513                 : }
     514               0 : sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){
     515               0 :   sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) );
     516               0 :   columnMallocFailure(pStmt);
     517               0 :   return val;
     518                 : }
     519             800 : const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){
     520             800 :   const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) );
     521             800 :   columnMallocFailure(pStmt);
     522             800 :   return val;
     523                 : }
     524               0 : sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){
     525               0 :   return columnMem(pStmt, i);
     526                 : }
     527                 : #ifndef SQLITE_OMIT_UTF16
     528               0 : const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){
     529               0 :   const void *val = sqlite3_value_text16( columnMem(pStmt,i) );
     530               0 :   columnMallocFailure(pStmt);
     531               0 :   return val;
     532                 : }
     533                 : #endif /* SQLITE_OMIT_UTF16 */
     534             686 : int sqlite3_column_type(sqlite3_stmt *pStmt, int i){
     535             686 :   return sqlite3_value_type( columnMem(pStmt,i) );
     536                 : }
     537                 : 
     538                 : /* The following function is experimental and subject to change or
     539                 : ** removal */
     540                 : /*int sqlite3_column_numeric_type(sqlite3_stmt *pStmt, int i){
     541                 : **  return sqlite3_value_numeric_type( columnMem(pStmt,i) );
     542                 : **}
     543                 : */
     544                 : 
     545                 : /*
     546                 : ** Convert the N-th element of pStmt->pColName[] into a string using
     547                 : ** xFunc() then return that string.  If N is out of range, return 0.
     548                 : **
     549                 : ** There are up to 5 names for each column.  useType determines which
     550                 : ** name is returned.  Here are the names:
     551                 : **
     552                 : **    0      The column name as it should be displayed for output
     553                 : **    1      The datatype name for the column
     554                 : **    2      The name of the database that the column derives from
     555                 : **    3      The name of the table that the column derives from
     556                 : **    4      The name of the table column that the result column derives from
     557                 : **
     558                 : ** If the result is not a simple column reference (if it is an expression
     559                 : ** or a constant) then useTypes 2, 3, and 4 return NULL.
     560                 : */
     561                 : static const void *columnName(
     562                 :   sqlite3_stmt *pStmt,
     563                 :   int N,
     564                 :   const void *(*xFunc)(Mem*),
     565                 :   int useType
     566             338 : ){
     567                 :   const void *ret;
     568             338 :   Vdbe *p = (Vdbe *)pStmt;
     569             338 :   int n = sqlite3_column_count(pStmt);
     570                 : 
     571             338 :   if( p==0 || N>=n || N<0 ){
     572               0 :     return 0;
     573                 :   }
     574             338 :   N += useType*n;
     575             338 :   ret = xFunc(&p->aColName[N]);
     576                 : 
     577                 :   /* A malloc may have failed inside of the xFunc() call. If this is the case,
     578                 :   ** clear the mallocFailed flag and return NULL.
     579                 :   */
     580             338 :   sqlite3ApiExit(0, 0);
     581             338 :   return ret;
     582                 : }
     583                 : 
     584                 : /*
     585                 : ** Return the name of the Nth column of the result set returned by SQL
     586                 : ** statement pStmt.
     587                 : */
     588             338 : const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){
     589             338 :   return columnName(
     590                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME);
     591                 : }
     592                 : #ifndef SQLITE_OMIT_UTF16
     593               0 : const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){
     594               0 :   return columnName(
     595                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME);
     596                 : }
     597                 : #endif
     598                 : 
     599                 : /*
     600                 : ** Return the column declaration type (if applicable) of the 'i'th column
     601                 : ** of the result set of SQL statement pStmt.
     602                 : */
     603               0 : const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){
     604               0 :   return columnName(
     605                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE);
     606                 : }
     607                 : #ifndef SQLITE_OMIT_UTF16
     608               0 : const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){
     609               0 :   return columnName(
     610                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE);
     611                 : }
     612                 : #endif /* SQLITE_OMIT_UTF16 */
     613                 : 
     614                 : #ifdef SQLITE_ENABLE_COLUMN_METADATA
     615                 : /*
     616                 : ** Return the name of the database from which a result column derives.
     617                 : ** NULL is returned if the result column is an expression or constant or
     618                 : ** anything else which is not an unabiguous reference to a database column.
     619                 : */
     620                 : const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){
     621                 :   return columnName(
     622                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE);
     623                 : }
     624                 : #ifndef SQLITE_OMIT_UTF16
     625                 : const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){
     626                 :   return columnName(
     627                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE);
     628                 : }
     629                 : #endif /* SQLITE_OMIT_UTF16 */
     630                 : 
     631                 : /*
     632                 : ** Return the name of the table from which a result column derives.
     633                 : ** NULL is returned if the result column is an expression or constant or
     634                 : ** anything else which is not an unabiguous reference to a database column.
     635                 : */
     636                 : const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){
     637                 :   return columnName(
     638                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE);
     639                 : }
     640                 : #ifndef SQLITE_OMIT_UTF16
     641                 : const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){
     642                 :   return columnName(
     643                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE);
     644                 : }
     645                 : #endif /* SQLITE_OMIT_UTF16 */
     646                 : 
     647                 : /*
     648                 : ** Return the name of the table column from which a result column derives.
     649                 : ** NULL is returned if the result column is an expression or constant or
     650                 : ** anything else which is not an unabiguous reference to a database column.
     651                 : */
     652                 : const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){
     653                 :   return columnName(
     654                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN);
     655                 : }
     656                 : #ifndef SQLITE_OMIT_UTF16
     657                 : const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){
     658                 :   return columnName(
     659                 :       pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN);
     660                 : }
     661                 : #endif /* SQLITE_OMIT_UTF16 */
     662                 : #endif /* SQLITE_ENABLE_COLUMN_METADATA */
     663                 : 
     664                 : 
     665                 : /******************************* sqlite3_bind_  ***************************
     666                 : ** 
     667                 : ** Routines used to attach values to wildcards in a compiled SQL statement.
     668                 : */
     669                 : /*
     670                 : ** Unbind the value bound to variable i in virtual machine p. This is the 
     671                 : ** the same as binding a NULL value to the column. If the "i" parameter is
     672                 : ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK.
     673                 : **
     674                 : ** The error code stored in database p->db is overwritten with the return
     675                 : ** value in any case.
     676                 : */
     677             156 : static int vdbeUnbind(Vdbe *p, int i){
     678                 :   Mem *pVar;
     679             156 :   if( p==0 || p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){
     680               0 :     if( p ) sqlite3Error(p->db, SQLITE_MISUSE, 0);
     681               0 :     return SQLITE_MISUSE;
     682                 :   }
     683             156 :   if( i<1 || i>p->nVar ){
     684               1 :     sqlite3Error(p->db, SQLITE_RANGE, 0);
     685               1 :     return SQLITE_RANGE;
     686                 :   }
     687             155 :   i--;
     688             155 :   pVar = &p->aVar[i];
     689             155 :   sqlite3VdbeMemRelease(pVar);
     690             155 :   pVar->flags = MEM_Null;
     691             155 :   sqlite3Error(p->db, SQLITE_OK, 0);
     692             155 :   return SQLITE_OK;
     693                 : }
     694                 : 
     695                 : /*
     696                 : ** Bind a text or BLOB value.
     697                 : */
     698                 : static int bindText(
     699                 :   sqlite3_stmt *pStmt, 
     700                 :   int i, 
     701                 :   const void *zData, 
     702                 :   int nData, 
     703                 :   void (*xDel)(void*),
     704                 :   int encoding
     705             154 : ){
     706             154 :   Vdbe *p = (Vdbe *)pStmt;
     707                 :   Mem *pVar;
     708                 :   int rc;
     709                 : 
     710             154 :   rc = vdbeUnbind(p, i);
     711             154 :   if( rc || zData==0 ){
     712               1 :     return rc;
     713                 :   }
     714             153 :   pVar = &p->aVar[i-1];
     715             153 :   rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
     716             153 :   if( rc==SQLITE_OK && encoding!=0 ){
     717             153 :     rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
     718                 :   }
     719                 : 
     720             153 :   sqlite3Error(((Vdbe *)pStmt)->db, rc, 0);
     721             153 :   return sqlite3ApiExit(((Vdbe *)pStmt)->db, rc);
     722                 : }
     723                 : 
     724                 : 
     725                 : /*
     726                 : ** Bind a blob value to an SQL statement variable.
     727                 : */
     728                 : int sqlite3_bind_blob(
     729                 :   sqlite3_stmt *pStmt, 
     730                 :   int i, 
     731                 :   const void *zData, 
     732                 :   int nData, 
     733                 :   void (*xDel)(void*)
     734               0 : ){
     735               0 :   return bindText(pStmt, i, zData, nData, xDel, 0);
     736                 : }
     737               0 : int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
     738                 :   int rc;
     739               0 :   Vdbe *p = (Vdbe *)pStmt;
     740               0 :   rc = vdbeUnbind(p, i);
     741               0 :   if( rc==SQLITE_OK ){
     742               0 :     sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
     743                 :   }
     744               0 :   return rc;
     745                 : }
     746               0 : int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
     747               0 :   return sqlite3_bind_int64(p, i, (i64)iValue);
     748                 : }
     749               0 : int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
     750                 :   int rc;
     751               0 :   Vdbe *p = (Vdbe *)pStmt;
     752               0 :   rc = vdbeUnbind(p, i);
     753               0 :   if( rc==SQLITE_OK ){
     754               0 :     sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
     755                 :   }
     756               0 :   return rc;
     757                 : }
     758               2 : int sqlite3_bind_null(sqlite3_stmt* p, int i){
     759               2 :   return vdbeUnbind((Vdbe *)p, i);
     760                 : }
     761                 : int sqlite3_bind_text( 
     762                 :   sqlite3_stmt *pStmt, 
     763                 :   int i, 
     764                 :   const char *zData, 
     765                 :   int nData, 
     766                 :   void (*xDel)(void*)
     767             154 : ){
     768             154 :   return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8);
     769                 : }
     770                 : #ifndef SQLITE_OMIT_UTF16
     771                 : int sqlite3_bind_text16(
     772                 :   sqlite3_stmt *pStmt, 
     773                 :   int i, 
     774                 :   const void *zData, 
     775                 :   int nData, 
     776                 :   void (*xDel)(void*)
     777               0 : ){
     778               0 :   return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE);
     779                 : }
     780                 : #endif /* SQLITE_OMIT_UTF16 */
     781               0 : int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
     782                 :   int rc;
     783               0 :   Vdbe *p = (Vdbe *)pStmt;
     784               0 :   rc = vdbeUnbind(p, i);
     785               0 :   if( rc==SQLITE_OK ){
     786               0 :     sqlite3VdbeMemCopy(&p->aVar[i-1], pValue);
     787                 :   }
     788               0 :   return rc;
     789                 : }
     790                 : 
     791                 : /*
     792                 : ** Return the number of wildcards that can be potentially bound to.
     793                 : ** This routine is added to support DBD::SQLite.  
     794                 : */
     795               0 : int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){
     796               0 :   Vdbe *p = (Vdbe*)pStmt;
     797               0 :   return p ? p->nVar : 0;
     798                 : }
     799                 : 
     800                 : /*
     801                 : ** Create a mapping from variable numbers to variable names
     802                 : ** in the Vdbe.azVar[] array, if such a mapping does not already
     803                 : ** exist.
     804                 : */
     805              45 : static void createVarMap(Vdbe *p){
     806              45 :   if( !p->okVar ){
     807                 :     int j;
     808                 :     Op *pOp;
     809             328 :     for(j=0, pOp=p->aOp; j<p->nOp; j++, pOp++){
     810             313 :       if( pOp->opcode==OP_Variable ){
     811                 :         assert( pOp->p1>0 && pOp->p1<=p->nVar );
     812              23 :         p->azVar[pOp->p1-1] = pOp->p3;
     813                 :       }
     814                 :     }
     815              15 :     p->okVar = 1;
     816                 :   }
     817              45 : }
     818                 : 
     819                 : /*
     820                 : ** Return the name of a wildcard parameter.  Return NULL if the index
     821                 : ** is out of range or if the wildcard is unnamed.
     822                 : **
     823                 : ** The result is always UTF-8.
     824                 : */
     825               0 : const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){
     826               0 :   Vdbe *p = (Vdbe*)pStmt;
     827               0 :   if( p==0 || i<1 || i>p->nVar ){
     828               0 :     return 0;
     829                 :   }
     830               0 :   createVarMap(p);
     831               0 :   return p->azVar[i-1];
     832                 : }
     833                 : 
     834                 : /*
     835                 : ** Given a wildcard parameter name, return the index of the variable
     836                 : ** with that name.  If there is no variable with the given name,
     837                 : ** return 0.
     838                 : */
     839              45 : int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){
     840              45 :   Vdbe *p = (Vdbe*)pStmt;
     841                 :   int i;
     842              45 :   if( p==0 ){
     843               0 :     return 0;
     844                 :   }
     845              45 :   createVarMap(p); 
     846              45 :   if( zName ){
     847              81 :     for(i=0; i<p->nVar; i++){
     848              80 :       const char *z = p->azVar[i];
     849              80 :       if( z && strcmp(z,zName)==0 ){
     850              44 :         return i+1;
     851                 :       }
     852                 :     }
     853                 :   }
     854               1 :   return 0;
     855                 : }
     856                 : 
     857                 : /*
     858                 : ** Transfer all bindings from the first statement over to the second.
     859                 : ** If the two statements contain a different number of bindings, then
     860                 : ** an SQLITE_ERROR is returned.
     861                 : */
     862               0 : int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
     863               0 :   Vdbe *pFrom = (Vdbe*)pFromStmt;
     864               0 :   Vdbe *pTo = (Vdbe*)pToStmt;
     865               0 :   int i, rc = SQLITE_OK;
     866               0 :   if( (pFrom->magic!=VDBE_MAGIC_RUN && pFrom->magic!=VDBE_MAGIC_HALT)
     867                 :     || (pTo->magic!=VDBE_MAGIC_RUN && pTo->magic!=VDBE_MAGIC_HALT) ){
     868               0 :     return SQLITE_MISUSE;
     869                 :   }
     870               0 :   if( pFrom->nVar!=pTo->nVar ){
     871               0 :     return SQLITE_ERROR;
     872                 :   }
     873               0 :   for(i=0; rc==SQLITE_OK && i<pFrom->nVar; i++){
     874                 :     sqlite3MallocDisallow();
     875               0 :     rc = sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]);
     876                 :     sqlite3MallocAllow();
     877                 :   }
     878                 :   assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
     879               0 :   return rc;
     880                 : }
     881                 : 
     882                 : /*
     883                 : ** Return the sqlite3* database handle to which the prepared statement given
     884                 : ** in the argument belongs.  This is the same database handle that was
     885                 : ** the first argument to the sqlite3_prepare() that was used to create
     886                 : ** the statement in the first place.
     887                 : */
     888               0 : sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
     889               0 :   return pStmt ? ((Vdbe*)pStmt)->db : 0;
     890                 : }

Generated by: LTP GCOV extension version 1.5

Generated at Thu, 19 Nov 2009 08:20:17 +0000 (5 days ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.