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