Annotation of embedaddon/sqlite3/src/vdbeapi.c, revision 1.1
1.1 ! misho 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:
! 19: #ifndef SQLITE_OMIT_DEPRECATED
! 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: int sqlite3_expired(sqlite3_stmt *pStmt){
! 29: Vdbe *p = (Vdbe*)pStmt;
! 30: return p==0 || p->expired;
! 31: }
! 32: #endif
! 33:
! 34: /*
! 35: ** Check on a Vdbe to make sure it has not been finalized. Log
! 36: ** an error and return true if it has been finalized (or is otherwise
! 37: ** invalid). Return false if it is ok.
! 38: */
! 39: static int vdbeSafety(Vdbe *p){
! 40: if( p->db==0 ){
! 41: sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement");
! 42: return 1;
! 43: }else{
! 44: return 0;
! 45: }
! 46: }
! 47: static int vdbeSafetyNotNull(Vdbe *p){
! 48: if( p==0 ){
! 49: sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement");
! 50: return 1;
! 51: }else{
! 52: return vdbeSafety(p);
! 53: }
! 54: }
! 55:
! 56: /*
! 57: ** The following routine destroys a virtual machine that is created by
! 58: ** the sqlite3_compile() routine. The integer returned is an SQLITE_
! 59: ** success/failure code that describes the result of executing the virtual
! 60: ** machine.
! 61: **
! 62: ** This routine sets the error code and string returned by
! 63: ** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
! 64: */
! 65: int sqlite3_finalize(sqlite3_stmt *pStmt){
! 66: int rc;
! 67: if( pStmt==0 ){
! 68: /* IMPLEMENTATION-OF: R-57228-12904 Invoking sqlite3_finalize() on a NULL
! 69: ** pointer is a harmless no-op. */
! 70: rc = SQLITE_OK;
! 71: }else{
! 72: Vdbe *v = (Vdbe*)pStmt;
! 73: sqlite3 *db = v->db;
! 74: #if SQLITE_THREADSAFE
! 75: sqlite3_mutex *mutex;
! 76: #endif
! 77: if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT;
! 78: #if SQLITE_THREADSAFE
! 79: mutex = v->db->mutex;
! 80: #endif
! 81: sqlite3_mutex_enter(mutex);
! 82: rc = sqlite3VdbeFinalize(v);
! 83: rc = sqlite3ApiExit(db, rc);
! 84: sqlite3_mutex_leave(mutex);
! 85: }
! 86: return rc;
! 87: }
! 88:
! 89: /*
! 90: ** Terminate the current execution of an SQL statement and reset it
! 91: ** back to its starting state so that it can be reused. A success code from
! 92: ** the prior execution is returned.
! 93: **
! 94: ** This routine sets the error code and string returned by
! 95: ** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
! 96: */
! 97: int sqlite3_reset(sqlite3_stmt *pStmt){
! 98: int rc;
! 99: if( pStmt==0 ){
! 100: rc = SQLITE_OK;
! 101: }else{
! 102: Vdbe *v = (Vdbe*)pStmt;
! 103: sqlite3_mutex_enter(v->db->mutex);
! 104: rc = sqlite3VdbeReset(v);
! 105: sqlite3VdbeRewind(v);
! 106: assert( (rc & (v->db->errMask))==rc );
! 107: rc = sqlite3ApiExit(v->db, rc);
! 108: sqlite3_mutex_leave(v->db->mutex);
! 109: }
! 110: return rc;
! 111: }
! 112:
! 113: /*
! 114: ** Set all the parameters in the compiled SQL statement to NULL.
! 115: */
! 116: int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
! 117: int i;
! 118: int rc = SQLITE_OK;
! 119: Vdbe *p = (Vdbe*)pStmt;
! 120: #if SQLITE_THREADSAFE
! 121: sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex;
! 122: #endif
! 123: sqlite3_mutex_enter(mutex);
! 124: for(i=0; i<p->nVar; i++){
! 125: sqlite3VdbeMemRelease(&p->aVar[i]);
! 126: p->aVar[i].flags = MEM_Null;
! 127: }
! 128: if( p->isPrepareV2 && p->expmask ){
! 129: p->expired = 1;
! 130: }
! 131: sqlite3_mutex_leave(mutex);
! 132: return rc;
! 133: }
! 134:
! 135:
! 136: /**************************** sqlite3_value_ *******************************
! 137: ** The following routines extract information from a Mem or sqlite3_value
! 138: ** structure.
! 139: */
! 140: const void *sqlite3_value_blob(sqlite3_value *pVal){
! 141: Mem *p = (Mem*)pVal;
! 142: if( p->flags & (MEM_Blob|MEM_Str) ){
! 143: sqlite3VdbeMemExpandBlob(p);
! 144: p->flags &= ~MEM_Str;
! 145: p->flags |= MEM_Blob;
! 146: return p->n ? p->z : 0;
! 147: }else{
! 148: return sqlite3_value_text(pVal);
! 149: }
! 150: }
! 151: int sqlite3_value_bytes(sqlite3_value *pVal){
! 152: return sqlite3ValueBytes(pVal, SQLITE_UTF8);
! 153: }
! 154: int sqlite3_value_bytes16(sqlite3_value *pVal){
! 155: return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE);
! 156: }
! 157: double sqlite3_value_double(sqlite3_value *pVal){
! 158: return sqlite3VdbeRealValue((Mem*)pVal);
! 159: }
! 160: int sqlite3_value_int(sqlite3_value *pVal){
! 161: return (int)sqlite3VdbeIntValue((Mem*)pVal);
! 162: }
! 163: sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
! 164: return sqlite3VdbeIntValue((Mem*)pVal);
! 165: }
! 166: const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
! 167: return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
! 168: }
! 169: #ifndef SQLITE_OMIT_UTF16
! 170: const void *sqlite3_value_text16(sqlite3_value* pVal){
! 171: return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE);
! 172: }
! 173: const void *sqlite3_value_text16be(sqlite3_value *pVal){
! 174: return sqlite3ValueText(pVal, SQLITE_UTF16BE);
! 175: }
! 176: const void *sqlite3_value_text16le(sqlite3_value *pVal){
! 177: return sqlite3ValueText(pVal, SQLITE_UTF16LE);
! 178: }
! 179: #endif /* SQLITE_OMIT_UTF16 */
! 180: int sqlite3_value_type(sqlite3_value* pVal){
! 181: return pVal->type;
! 182: }
! 183:
! 184: /**************************** sqlite3_result_ *******************************
! 185: ** The following routines are used by user-defined functions to specify
! 186: ** the function result.
! 187: **
! 188: ** The setStrOrError() funtion calls sqlite3VdbeMemSetStr() to store the
! 189: ** result as a string or blob but if the string or blob is too large, it
! 190: ** then sets the error code to SQLITE_TOOBIG
! 191: */
! 192: static void setResultStrOrError(
! 193: sqlite3_context *pCtx, /* Function context */
! 194: const char *z, /* String pointer */
! 195: int n, /* Bytes in string, or negative */
! 196: u8 enc, /* Encoding of z. 0 for BLOBs */
! 197: void (*xDel)(void*) /* Destructor function */
! 198: ){
! 199: if( sqlite3VdbeMemSetStr(&pCtx->s, z, n, enc, xDel)==SQLITE_TOOBIG ){
! 200: sqlite3_result_error_toobig(pCtx);
! 201: }
! 202: }
! 203: void sqlite3_result_blob(
! 204: sqlite3_context *pCtx,
! 205: const void *z,
! 206: int n,
! 207: void (*xDel)(void *)
! 208: ){
! 209: assert( n>=0 );
! 210: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 211: setResultStrOrError(pCtx, z, n, 0, xDel);
! 212: }
! 213: void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
! 214: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 215: sqlite3VdbeMemSetDouble(&pCtx->s, rVal);
! 216: }
! 217: void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
! 218: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 219: pCtx->isError = SQLITE_ERROR;
! 220: sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
! 221: }
! 222: #ifndef SQLITE_OMIT_UTF16
! 223: void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
! 224: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 225: pCtx->isError = SQLITE_ERROR;
! 226: sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
! 227: }
! 228: #endif
! 229: void sqlite3_result_int(sqlite3_context *pCtx, int iVal){
! 230: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 231: sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal);
! 232: }
! 233: void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){
! 234: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 235: sqlite3VdbeMemSetInt64(&pCtx->s, iVal);
! 236: }
! 237: void sqlite3_result_null(sqlite3_context *pCtx){
! 238: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 239: sqlite3VdbeMemSetNull(&pCtx->s);
! 240: }
! 241: void sqlite3_result_text(
! 242: sqlite3_context *pCtx,
! 243: const char *z,
! 244: int n,
! 245: void (*xDel)(void *)
! 246: ){
! 247: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 248: setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel);
! 249: }
! 250: #ifndef SQLITE_OMIT_UTF16
! 251: void sqlite3_result_text16(
! 252: sqlite3_context *pCtx,
! 253: const void *z,
! 254: int n,
! 255: void (*xDel)(void *)
! 256: ){
! 257: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 258: setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel);
! 259: }
! 260: void sqlite3_result_text16be(
! 261: sqlite3_context *pCtx,
! 262: const void *z,
! 263: int n,
! 264: void (*xDel)(void *)
! 265: ){
! 266: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 267: setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel);
! 268: }
! 269: void sqlite3_result_text16le(
! 270: sqlite3_context *pCtx,
! 271: const void *z,
! 272: int n,
! 273: void (*xDel)(void *)
! 274: ){
! 275: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 276: setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel);
! 277: }
! 278: #endif /* SQLITE_OMIT_UTF16 */
! 279: void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
! 280: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 281: sqlite3VdbeMemCopy(&pCtx->s, pValue);
! 282: }
! 283: void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){
! 284: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 285: sqlite3VdbeMemSetZeroBlob(&pCtx->s, n);
! 286: }
! 287: void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
! 288: pCtx->isError = errCode;
! 289: if( pCtx->s.flags & MEM_Null ){
! 290: sqlite3VdbeMemSetStr(&pCtx->s, sqlite3ErrStr(errCode), -1,
! 291: SQLITE_UTF8, SQLITE_STATIC);
! 292: }
! 293: }
! 294:
! 295: /* Force an SQLITE_TOOBIG error. */
! 296: void sqlite3_result_error_toobig(sqlite3_context *pCtx){
! 297: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 298: pCtx->isError = SQLITE_TOOBIG;
! 299: sqlite3VdbeMemSetStr(&pCtx->s, "string or blob too big", -1,
! 300: SQLITE_UTF8, SQLITE_STATIC);
! 301: }
! 302:
! 303: /* An SQLITE_NOMEM error. */
! 304: void sqlite3_result_error_nomem(sqlite3_context *pCtx){
! 305: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 306: sqlite3VdbeMemSetNull(&pCtx->s);
! 307: pCtx->isError = SQLITE_NOMEM;
! 308: pCtx->s.db->mallocFailed = 1;
! 309: }
! 310:
! 311: /*
! 312: ** This function is called after a transaction has been committed. It
! 313: ** invokes callbacks registered with sqlite3_wal_hook() as required.
! 314: */
! 315: static int doWalCallbacks(sqlite3 *db){
! 316: int rc = SQLITE_OK;
! 317: #ifndef SQLITE_OMIT_WAL
! 318: int i;
! 319: for(i=0; i<db->nDb; i++){
! 320: Btree *pBt = db->aDb[i].pBt;
! 321: if( pBt ){
! 322: int nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt));
! 323: if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){
! 324: rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zName, nEntry);
! 325: }
! 326: }
! 327: }
! 328: #endif
! 329: return rc;
! 330: }
! 331:
! 332: /*
! 333: ** Execute the statement pStmt, either until a row of data is ready, the
! 334: ** statement is completely executed or an error occurs.
! 335: **
! 336: ** This routine implements the bulk of the logic behind the sqlite_step()
! 337: ** API. The only thing omitted is the automatic recompile if a
! 338: ** schema change has occurred. That detail is handled by the
! 339: ** outer sqlite3_step() wrapper procedure.
! 340: */
! 341: static int sqlite3Step(Vdbe *p){
! 342: sqlite3 *db;
! 343: int rc;
! 344:
! 345: assert(p);
! 346: if( p->magic!=VDBE_MAGIC_RUN ){
! 347: /* We used to require that sqlite3_reset() be called before retrying
! 348: ** sqlite3_step() after any error or after SQLITE_DONE. But beginning
! 349: ** with version 3.7.0, we changed this so that sqlite3_reset() would
! 350: ** be called automatically instead of throwing the SQLITE_MISUSE error.
! 351: ** This "automatic-reset" change is not technically an incompatibility,
! 352: ** since any application that receives an SQLITE_MISUSE is broken by
! 353: ** definition.
! 354: **
! 355: ** Nevertheless, some published applications that were originally written
! 356: ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE
! 357: ** returns, and those were broken by the automatic-reset change. As a
! 358: ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the
! 359: ** legacy behavior of returning SQLITE_MISUSE for cases where the
! 360: ** previous sqlite3_step() returned something other than a SQLITE_LOCKED
! 361: ** or SQLITE_BUSY error.
! 362: */
! 363: #ifdef SQLITE_OMIT_AUTORESET
! 364: if( p->rc==SQLITE_BUSY || p->rc==SQLITE_LOCKED ){
! 365: sqlite3_reset((sqlite3_stmt*)p);
! 366: }else{
! 367: return SQLITE_MISUSE_BKPT;
! 368: }
! 369: #else
! 370: sqlite3_reset((sqlite3_stmt*)p);
! 371: #endif
! 372: }
! 373:
! 374: /* Check that malloc() has not failed. If it has, return early. */
! 375: db = p->db;
! 376: if( db->mallocFailed ){
! 377: p->rc = SQLITE_NOMEM;
! 378: return SQLITE_NOMEM;
! 379: }
! 380:
! 381: if( p->pc<=0 && p->expired ){
! 382: p->rc = SQLITE_SCHEMA;
! 383: rc = SQLITE_ERROR;
! 384: goto end_of_step;
! 385: }
! 386: if( p->pc<0 ){
! 387: /* If there are no other statements currently running, then
! 388: ** reset the interrupt flag. This prevents a call to sqlite3_interrupt
! 389: ** from interrupting a statement that has not yet started.
! 390: */
! 391: if( db->activeVdbeCnt==0 ){
! 392: db->u1.isInterrupted = 0;
! 393: }
! 394:
! 395: assert( db->writeVdbeCnt>0 || db->autoCommit==0 || db->nDeferredCons==0 );
! 396:
! 397: #ifndef SQLITE_OMIT_TRACE
! 398: if( db->xProfile && !db->init.busy ){
! 399: sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime);
! 400: }
! 401: #endif
! 402:
! 403: db->activeVdbeCnt++;
! 404: if( p->readOnly==0 ) db->writeVdbeCnt++;
! 405: p->pc = 0;
! 406: }
! 407: #ifndef SQLITE_OMIT_EXPLAIN
! 408: if( p->explain ){
! 409: rc = sqlite3VdbeList(p);
! 410: }else
! 411: #endif /* SQLITE_OMIT_EXPLAIN */
! 412: {
! 413: db->vdbeExecCnt++;
! 414: rc = sqlite3VdbeExec(p);
! 415: db->vdbeExecCnt--;
! 416: }
! 417:
! 418: #ifndef SQLITE_OMIT_TRACE
! 419: /* Invoke the profile callback if there is one
! 420: */
! 421: if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){
! 422: sqlite3_int64 iNow;
! 423: sqlite3OsCurrentTimeInt64(db->pVfs, &iNow);
! 424: db->xProfile(db->pProfileArg, p->zSql, (iNow - p->startTime)*1000000);
! 425: }
! 426: #endif
! 427:
! 428: if( rc==SQLITE_DONE ){
! 429: assert( p->rc==SQLITE_OK );
! 430: p->rc = doWalCallbacks(db);
! 431: if( p->rc!=SQLITE_OK ){
! 432: rc = SQLITE_ERROR;
! 433: }
! 434: }
! 435:
! 436: db->errCode = rc;
! 437: if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){
! 438: p->rc = SQLITE_NOMEM;
! 439: }
! 440: end_of_step:
! 441: /* At this point local variable rc holds the value that should be
! 442: ** returned if this statement was compiled using the legacy
! 443: ** sqlite3_prepare() interface. According to the docs, this can only
! 444: ** be one of the values in the first assert() below. Variable p->rc
! 445: ** contains the value that would be returned if sqlite3_finalize()
! 446: ** were called on statement p.
! 447: */
! 448: assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR
! 449: || rc==SQLITE_BUSY || rc==SQLITE_MISUSE
! 450: );
! 451: assert( p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE );
! 452: if( p->isPrepareV2 && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
! 453: /* If this statement was prepared using sqlite3_prepare_v2(), and an
! 454: ** error has occured, then return the error code in p->rc to the
! 455: ** caller. Set the error code in the database handle to the same value.
! 456: */
! 457: rc = sqlite3VdbeTransferError(p);
! 458: }
! 459: return (rc&db->errMask);
! 460: }
! 461:
! 462: /*
! 463: ** The maximum number of times that a statement will try to reparse
! 464: ** itself before giving up and returning SQLITE_SCHEMA.
! 465: */
! 466: #ifndef SQLITE_MAX_SCHEMA_RETRY
! 467: # define SQLITE_MAX_SCHEMA_RETRY 5
! 468: #endif
! 469:
! 470: /*
! 471: ** This is the top-level implementation of sqlite3_step(). Call
! 472: ** sqlite3Step() to do most of the work. If a schema error occurs,
! 473: ** call sqlite3Reprepare() and try again.
! 474: */
! 475: int sqlite3_step(sqlite3_stmt *pStmt){
! 476: int rc = SQLITE_OK; /* Result from sqlite3Step() */
! 477: int rc2 = SQLITE_OK; /* Result from sqlite3Reprepare() */
! 478: Vdbe *v = (Vdbe*)pStmt; /* the prepared statement */
! 479: int cnt = 0; /* Counter to prevent infinite loop of reprepares */
! 480: sqlite3 *db; /* The database connection */
! 481:
! 482: if( vdbeSafetyNotNull(v) ){
! 483: return SQLITE_MISUSE_BKPT;
! 484: }
! 485: db = v->db;
! 486: sqlite3_mutex_enter(db->mutex);
! 487: while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
! 488: && cnt++ < SQLITE_MAX_SCHEMA_RETRY
! 489: && (rc2 = rc = sqlite3Reprepare(v))==SQLITE_OK ){
! 490: sqlite3_reset(pStmt);
! 491: assert( v->expired==0 );
! 492: }
! 493: if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){
! 494: /* This case occurs after failing to recompile an sql statement.
! 495: ** The error message from the SQL compiler has already been loaded
! 496: ** into the database handle. This block copies the error message
! 497: ** from the database handle into the statement and sets the statement
! 498: ** program counter to 0 to ensure that when the statement is
! 499: ** finalized or reset the parser error message is available via
! 500: ** sqlite3_errmsg() and sqlite3_errcode().
! 501: */
! 502: const char *zErr = (const char *)sqlite3_value_text(db->pErr);
! 503: sqlite3DbFree(db, v->zErrMsg);
! 504: if( !db->mallocFailed ){
! 505: v->zErrMsg = sqlite3DbStrDup(db, zErr);
! 506: v->rc = rc2;
! 507: } else {
! 508: v->zErrMsg = 0;
! 509: v->rc = rc = SQLITE_NOMEM;
! 510: }
! 511: }
! 512: rc = sqlite3ApiExit(db, rc);
! 513: sqlite3_mutex_leave(db->mutex);
! 514: return rc;
! 515: }
! 516:
! 517: /*
! 518: ** Extract the user data from a sqlite3_context structure and return a
! 519: ** pointer to it.
! 520: */
! 521: void *sqlite3_user_data(sqlite3_context *p){
! 522: assert( p && p->pFunc );
! 523: return p->pFunc->pUserData;
! 524: }
! 525:
! 526: /*
! 527: ** Extract the user data from a sqlite3_context structure and return a
! 528: ** pointer to it.
! 529: **
! 530: ** IMPLEMENTATION-OF: R-46798-50301 The sqlite3_context_db_handle() interface
! 531: ** returns a copy of the pointer to the database connection (the 1st
! 532: ** parameter) of the sqlite3_create_function() and
! 533: ** sqlite3_create_function16() routines that originally registered the
! 534: ** application defined function.
! 535: */
! 536: sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
! 537: assert( p && p->pFunc );
! 538: return p->s.db;
! 539: }
! 540:
! 541: /*
! 542: ** The following is the implementation of an SQL function that always
! 543: ** fails with an error message stating that the function is used in the
! 544: ** wrong context. The sqlite3_overload_function() API might construct
! 545: ** SQL function that use this routine so that the functions will exist
! 546: ** for name resolution but are actually overloaded by the xFindFunction
! 547: ** method of virtual tables.
! 548: */
! 549: void sqlite3InvalidFunction(
! 550: sqlite3_context *context, /* The function calling context */
! 551: int NotUsed, /* Number of arguments to the function */
! 552: sqlite3_value **NotUsed2 /* Value of each argument */
! 553: ){
! 554: const char *zName = context->pFunc->zName;
! 555: char *zErr;
! 556: UNUSED_PARAMETER2(NotUsed, NotUsed2);
! 557: zErr = sqlite3_mprintf(
! 558: "unable to use function %s in the requested context", zName);
! 559: sqlite3_result_error(context, zErr, -1);
! 560: sqlite3_free(zErr);
! 561: }
! 562:
! 563: /*
! 564: ** Allocate or return the aggregate context for a user function. A new
! 565: ** context is allocated on the first call. Subsequent calls return the
! 566: ** same context that was returned on prior calls.
! 567: */
! 568: void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){
! 569: Mem *pMem;
! 570: assert( p && p->pFunc && p->pFunc->xStep );
! 571: assert( sqlite3_mutex_held(p->s.db->mutex) );
! 572: pMem = p->pMem;
! 573: testcase( nByte<0 );
! 574: if( (pMem->flags & MEM_Agg)==0 ){
! 575: if( nByte<=0 ){
! 576: sqlite3VdbeMemReleaseExternal(pMem);
! 577: pMem->flags = MEM_Null;
! 578: pMem->z = 0;
! 579: }else{
! 580: sqlite3VdbeMemGrow(pMem, nByte, 0);
! 581: pMem->flags = MEM_Agg;
! 582: pMem->u.pDef = p->pFunc;
! 583: if( pMem->z ){
! 584: memset(pMem->z, 0, nByte);
! 585: }
! 586: }
! 587: }
! 588: return (void*)pMem->z;
! 589: }
! 590:
! 591: /*
! 592: ** Return the auxilary data pointer, if any, for the iArg'th argument to
! 593: ** the user-function defined by pCtx.
! 594: */
! 595: void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){
! 596: VdbeFunc *pVdbeFunc;
! 597:
! 598: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 599: pVdbeFunc = pCtx->pVdbeFunc;
! 600: if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){
! 601: return 0;
! 602: }
! 603: return pVdbeFunc->apAux[iArg].pAux;
! 604: }
! 605:
! 606: /*
! 607: ** Set the auxilary data pointer and delete function, for the iArg'th
! 608: ** argument to the user-function defined by pCtx. Any previous value is
! 609: ** deleted by calling the delete function specified when it was set.
! 610: */
! 611: void sqlite3_set_auxdata(
! 612: sqlite3_context *pCtx,
! 613: int iArg,
! 614: void *pAux,
! 615: void (*xDelete)(void*)
! 616: ){
! 617: struct AuxData *pAuxData;
! 618: VdbeFunc *pVdbeFunc;
! 619: if( iArg<0 ) goto failed;
! 620:
! 621: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
! 622: pVdbeFunc = pCtx->pVdbeFunc;
! 623: if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){
! 624: int nAux = (pVdbeFunc ? pVdbeFunc->nAux : 0);
! 625: int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg;
! 626: pVdbeFunc = sqlite3DbRealloc(pCtx->s.db, pVdbeFunc, nMalloc);
! 627: if( !pVdbeFunc ){
! 628: goto failed;
! 629: }
! 630: pCtx->pVdbeFunc = pVdbeFunc;
! 631: memset(&pVdbeFunc->apAux[nAux], 0, sizeof(struct AuxData)*(iArg+1-nAux));
! 632: pVdbeFunc->nAux = iArg+1;
! 633: pVdbeFunc->pFunc = pCtx->pFunc;
! 634: }
! 635:
! 636: pAuxData = &pVdbeFunc->apAux[iArg];
! 637: if( pAuxData->pAux && pAuxData->xDelete ){
! 638: pAuxData->xDelete(pAuxData->pAux);
! 639: }
! 640: pAuxData->pAux = pAux;
! 641: pAuxData->xDelete = xDelete;
! 642: return;
! 643:
! 644: failed:
! 645: if( xDelete ){
! 646: xDelete(pAux);
! 647: }
! 648: }
! 649:
! 650: #ifndef SQLITE_OMIT_DEPRECATED
! 651: /*
! 652: ** Return the number of times the Step function of a aggregate has been
! 653: ** called.
! 654: **
! 655: ** This function is deprecated. Do not use it for new code. It is
! 656: ** provide only to avoid breaking legacy code. New aggregate function
! 657: ** implementations should keep their own counts within their aggregate
! 658: ** context.
! 659: */
! 660: int sqlite3_aggregate_count(sqlite3_context *p){
! 661: assert( p && p->pMem && p->pFunc && p->pFunc->xStep );
! 662: return p->pMem->n;
! 663: }
! 664: #endif
! 665:
! 666: /*
! 667: ** Return the number of columns in the result set for the statement pStmt.
! 668: */
! 669: int sqlite3_column_count(sqlite3_stmt *pStmt){
! 670: Vdbe *pVm = (Vdbe *)pStmt;
! 671: return pVm ? pVm->nResColumn : 0;
! 672: }
! 673:
! 674: /*
! 675: ** Return the number of values available from the current row of the
! 676: ** currently executing statement pStmt.
! 677: */
! 678: int sqlite3_data_count(sqlite3_stmt *pStmt){
! 679: Vdbe *pVm = (Vdbe *)pStmt;
! 680: if( pVm==0 || pVm->pResultSet==0 ) return 0;
! 681: return pVm->nResColumn;
! 682: }
! 683:
! 684:
! 685: /*
! 686: ** Check to see if column iCol of the given statement is valid. If
! 687: ** it is, return a pointer to the Mem for the value of that column.
! 688: ** If iCol is not valid, return a pointer to a Mem which has a value
! 689: ** of NULL.
! 690: */
! 691: static Mem *columnMem(sqlite3_stmt *pStmt, int i){
! 692: Vdbe *pVm;
! 693: Mem *pOut;
! 694:
! 695: pVm = (Vdbe *)pStmt;
! 696: if( pVm && pVm->pResultSet!=0 && i<pVm->nResColumn && i>=0 ){
! 697: sqlite3_mutex_enter(pVm->db->mutex);
! 698: pOut = &pVm->pResultSet[i];
! 699: }else{
! 700: /* If the value passed as the second argument is out of range, return
! 701: ** a pointer to the following static Mem object which contains the
! 702: ** value SQL NULL. Even though the Mem structure contains an element
! 703: ** of type i64, on certain architectures (x86) with certain compiler
! 704: ** switches (-Os), gcc may align this Mem object on a 4-byte boundary
! 705: ** instead of an 8-byte one. This all works fine, except that when
! 706: ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s
! 707: ** that a Mem structure is located on an 8-byte boundary. To prevent
! 708: ** these assert()s from failing, when building with SQLITE_DEBUG defined
! 709: ** using gcc, we force nullMem to be 8-byte aligned using the magical
! 710: ** __attribute__((aligned(8))) macro. */
! 711: static const Mem nullMem
! 712: #if defined(SQLITE_DEBUG) && defined(__GNUC__)
! 713: __attribute__((aligned(8)))
! 714: #endif
! 715: = {0, "", (double)0, {0}, 0, MEM_Null, SQLITE_NULL, 0,
! 716: #ifdef SQLITE_DEBUG
! 717: 0, 0, /* pScopyFrom, pFiller */
! 718: #endif
! 719: 0, 0 };
! 720:
! 721: if( pVm && ALWAYS(pVm->db) ){
! 722: sqlite3_mutex_enter(pVm->db->mutex);
! 723: sqlite3Error(pVm->db, SQLITE_RANGE, 0);
! 724: }
! 725: pOut = (Mem*)&nullMem;
! 726: }
! 727: return pOut;
! 728: }
! 729:
! 730: /*
! 731: ** This function is called after invoking an sqlite3_value_XXX function on a
! 732: ** column value (i.e. a value returned by evaluating an SQL expression in the
! 733: ** select list of a SELECT statement) that may cause a malloc() failure. If
! 734: ** malloc() has failed, the threads mallocFailed flag is cleared and the result
! 735: ** code of statement pStmt set to SQLITE_NOMEM.
! 736: **
! 737: ** Specifically, this is called from within:
! 738: **
! 739: ** sqlite3_column_int()
! 740: ** sqlite3_column_int64()
! 741: ** sqlite3_column_text()
! 742: ** sqlite3_column_text16()
! 743: ** sqlite3_column_real()
! 744: ** sqlite3_column_bytes()
! 745: ** sqlite3_column_bytes16()
! 746: ** sqiite3_column_blob()
! 747: */
! 748: static void columnMallocFailure(sqlite3_stmt *pStmt)
! 749: {
! 750: /* If malloc() failed during an encoding conversion within an
! 751: ** sqlite3_column_XXX API, then set the return code of the statement to
! 752: ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR
! 753: ** and _finalize() will return NOMEM.
! 754: */
! 755: Vdbe *p = (Vdbe *)pStmt;
! 756: if( p ){
! 757: p->rc = sqlite3ApiExit(p->db, p->rc);
! 758: sqlite3_mutex_leave(p->db->mutex);
! 759: }
! 760: }
! 761:
! 762: /**************************** sqlite3_column_ *******************************
! 763: ** The following routines are used to access elements of the current row
! 764: ** in the result set.
! 765: */
! 766: const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){
! 767: const void *val;
! 768: val = sqlite3_value_blob( columnMem(pStmt,i) );
! 769: /* Even though there is no encoding conversion, value_blob() might
! 770: ** need to call malloc() to expand the result of a zeroblob()
! 771: ** expression.
! 772: */
! 773: columnMallocFailure(pStmt);
! 774: return val;
! 775: }
! 776: int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){
! 777: int val = sqlite3_value_bytes( columnMem(pStmt,i) );
! 778: columnMallocFailure(pStmt);
! 779: return val;
! 780: }
! 781: int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){
! 782: int val = sqlite3_value_bytes16( columnMem(pStmt,i) );
! 783: columnMallocFailure(pStmt);
! 784: return val;
! 785: }
! 786: double sqlite3_column_double(sqlite3_stmt *pStmt, int i){
! 787: double val = sqlite3_value_double( columnMem(pStmt,i) );
! 788: columnMallocFailure(pStmt);
! 789: return val;
! 790: }
! 791: int sqlite3_column_int(sqlite3_stmt *pStmt, int i){
! 792: int val = sqlite3_value_int( columnMem(pStmt,i) );
! 793: columnMallocFailure(pStmt);
! 794: return val;
! 795: }
! 796: sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){
! 797: sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) );
! 798: columnMallocFailure(pStmt);
! 799: return val;
! 800: }
! 801: const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){
! 802: const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) );
! 803: columnMallocFailure(pStmt);
! 804: return val;
! 805: }
! 806: sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){
! 807: Mem *pOut = columnMem(pStmt, i);
! 808: if( pOut->flags&MEM_Static ){
! 809: pOut->flags &= ~MEM_Static;
! 810: pOut->flags |= MEM_Ephem;
! 811: }
! 812: columnMallocFailure(pStmt);
! 813: return (sqlite3_value *)pOut;
! 814: }
! 815: #ifndef SQLITE_OMIT_UTF16
! 816: const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){
! 817: const void *val = sqlite3_value_text16( columnMem(pStmt,i) );
! 818: columnMallocFailure(pStmt);
! 819: return val;
! 820: }
! 821: #endif /* SQLITE_OMIT_UTF16 */
! 822: int sqlite3_column_type(sqlite3_stmt *pStmt, int i){
! 823: int iType = sqlite3_value_type( columnMem(pStmt,i) );
! 824: columnMallocFailure(pStmt);
! 825: return iType;
! 826: }
! 827:
! 828: /* The following function is experimental and subject to change or
! 829: ** removal */
! 830: /*int sqlite3_column_numeric_type(sqlite3_stmt *pStmt, int i){
! 831: ** return sqlite3_value_numeric_type( columnMem(pStmt,i) );
! 832: **}
! 833: */
! 834:
! 835: /*
! 836: ** Convert the N-th element of pStmt->pColName[] into a string using
! 837: ** xFunc() then return that string. If N is out of range, return 0.
! 838: **
! 839: ** There are up to 5 names for each column. useType determines which
! 840: ** name is returned. Here are the names:
! 841: **
! 842: ** 0 The column name as it should be displayed for output
! 843: ** 1 The datatype name for the column
! 844: ** 2 The name of the database that the column derives from
! 845: ** 3 The name of the table that the column derives from
! 846: ** 4 The name of the table column that the result column derives from
! 847: **
! 848: ** If the result is not a simple column reference (if it is an expression
! 849: ** or a constant) then useTypes 2, 3, and 4 return NULL.
! 850: */
! 851: static const void *columnName(
! 852: sqlite3_stmt *pStmt,
! 853: int N,
! 854: const void *(*xFunc)(Mem*),
! 855: int useType
! 856: ){
! 857: const void *ret = 0;
! 858: Vdbe *p = (Vdbe *)pStmt;
! 859: int n;
! 860: sqlite3 *db = p->db;
! 861:
! 862: assert( db!=0 );
! 863: n = sqlite3_column_count(pStmt);
! 864: if( N<n && N>=0 ){
! 865: N += useType*n;
! 866: sqlite3_mutex_enter(db->mutex);
! 867: assert( db->mallocFailed==0 );
! 868: ret = xFunc(&p->aColName[N]);
! 869: /* A malloc may have failed inside of the xFunc() call. If this
! 870: ** is the case, clear the mallocFailed flag and return NULL.
! 871: */
! 872: if( db->mallocFailed ){
! 873: db->mallocFailed = 0;
! 874: ret = 0;
! 875: }
! 876: sqlite3_mutex_leave(db->mutex);
! 877: }
! 878: return ret;
! 879: }
! 880:
! 881: /*
! 882: ** Return the name of the Nth column of the result set returned by SQL
! 883: ** statement pStmt.
! 884: */
! 885: const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){
! 886: return columnName(
! 887: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME);
! 888: }
! 889: #ifndef SQLITE_OMIT_UTF16
! 890: const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){
! 891: return columnName(
! 892: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME);
! 893: }
! 894: #endif
! 895:
! 896: /*
! 897: ** Constraint: If you have ENABLE_COLUMN_METADATA then you must
! 898: ** not define OMIT_DECLTYPE.
! 899: */
! 900: #if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA)
! 901: # error "Must not define both SQLITE_OMIT_DECLTYPE \
! 902: and SQLITE_ENABLE_COLUMN_METADATA"
! 903: #endif
! 904:
! 905: #ifndef SQLITE_OMIT_DECLTYPE
! 906: /*
! 907: ** Return the column declaration type (if applicable) of the 'i'th column
! 908: ** of the result set of SQL statement pStmt.
! 909: */
! 910: const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){
! 911: return columnName(
! 912: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE);
! 913: }
! 914: #ifndef SQLITE_OMIT_UTF16
! 915: const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){
! 916: return columnName(
! 917: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE);
! 918: }
! 919: #endif /* SQLITE_OMIT_UTF16 */
! 920: #endif /* SQLITE_OMIT_DECLTYPE */
! 921:
! 922: #ifdef SQLITE_ENABLE_COLUMN_METADATA
! 923: /*
! 924: ** Return the name of the database from which a result column derives.
! 925: ** NULL is returned if the result column is an expression or constant or
! 926: ** anything else which is not an unabiguous reference to a database column.
! 927: */
! 928: const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){
! 929: return columnName(
! 930: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE);
! 931: }
! 932: #ifndef SQLITE_OMIT_UTF16
! 933: const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){
! 934: return columnName(
! 935: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE);
! 936: }
! 937: #endif /* SQLITE_OMIT_UTF16 */
! 938:
! 939: /*
! 940: ** Return the name of the table from which a result column derives.
! 941: ** NULL is returned if the result column is an expression or constant or
! 942: ** anything else which is not an unabiguous reference to a database column.
! 943: */
! 944: const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){
! 945: return columnName(
! 946: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE);
! 947: }
! 948: #ifndef SQLITE_OMIT_UTF16
! 949: const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){
! 950: return columnName(
! 951: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE);
! 952: }
! 953: #endif /* SQLITE_OMIT_UTF16 */
! 954:
! 955: /*
! 956: ** Return the name of the table column from which a result column derives.
! 957: ** NULL is returned if the result column is an expression or constant or
! 958: ** anything else which is not an unabiguous reference to a database column.
! 959: */
! 960: const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){
! 961: return columnName(
! 962: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN);
! 963: }
! 964: #ifndef SQLITE_OMIT_UTF16
! 965: const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){
! 966: return columnName(
! 967: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN);
! 968: }
! 969: #endif /* SQLITE_OMIT_UTF16 */
! 970: #endif /* SQLITE_ENABLE_COLUMN_METADATA */
! 971:
! 972:
! 973: /******************************* sqlite3_bind_ ***************************
! 974: **
! 975: ** Routines used to attach values to wildcards in a compiled SQL statement.
! 976: */
! 977: /*
! 978: ** Unbind the value bound to variable i in virtual machine p. This is the
! 979: ** the same as binding a NULL value to the column. If the "i" parameter is
! 980: ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK.
! 981: **
! 982: ** A successful evaluation of this routine acquires the mutex on p.
! 983: ** the mutex is released if any kind of error occurs.
! 984: **
! 985: ** The error code stored in database p->db is overwritten with the return
! 986: ** value in any case.
! 987: */
! 988: static int vdbeUnbind(Vdbe *p, int i){
! 989: Mem *pVar;
! 990: if( vdbeSafetyNotNull(p) ){
! 991: return SQLITE_MISUSE_BKPT;
! 992: }
! 993: sqlite3_mutex_enter(p->db->mutex);
! 994: if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){
! 995: sqlite3Error(p->db, SQLITE_MISUSE, 0);
! 996: sqlite3_mutex_leave(p->db->mutex);
! 997: sqlite3_log(SQLITE_MISUSE,
! 998: "bind on a busy prepared statement: [%s]", p->zSql);
! 999: return SQLITE_MISUSE_BKPT;
! 1000: }
! 1001: if( i<1 || i>p->nVar ){
! 1002: sqlite3Error(p->db, SQLITE_RANGE, 0);
! 1003: sqlite3_mutex_leave(p->db->mutex);
! 1004: return SQLITE_RANGE;
! 1005: }
! 1006: i--;
! 1007: pVar = &p->aVar[i];
! 1008: sqlite3VdbeMemRelease(pVar);
! 1009: pVar->flags = MEM_Null;
! 1010: sqlite3Error(p->db, SQLITE_OK, 0);
! 1011:
! 1012: /* If the bit corresponding to this variable in Vdbe.expmask is set, then
! 1013: ** binding a new value to this variable invalidates the current query plan.
! 1014: **
! 1015: ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host
! 1016: ** parameter in the WHERE clause might influence the choice of query plan
! 1017: ** for a statement, then the statement will be automatically recompiled,
! 1018: ** as if there had been a schema change, on the first sqlite3_step() call
! 1019: ** following any change to the bindings of that parameter.
! 1020: */
! 1021: if( p->isPrepareV2 &&
! 1022: ((i<32 && p->expmask & ((u32)1 << i)) || p->expmask==0xffffffff)
! 1023: ){
! 1024: p->expired = 1;
! 1025: }
! 1026: return SQLITE_OK;
! 1027: }
! 1028:
! 1029: /*
! 1030: ** Bind a text or BLOB value.
! 1031: */
! 1032: static int bindText(
! 1033: sqlite3_stmt *pStmt, /* The statement to bind against */
! 1034: int i, /* Index of the parameter to bind */
! 1035: const void *zData, /* Pointer to the data to be bound */
! 1036: int nData, /* Number of bytes of data to be bound */
! 1037: void (*xDel)(void*), /* Destructor for the data */
! 1038: u8 encoding /* Encoding for the data */
! 1039: ){
! 1040: Vdbe *p = (Vdbe *)pStmt;
! 1041: Mem *pVar;
! 1042: int rc;
! 1043:
! 1044: rc = vdbeUnbind(p, i);
! 1045: if( rc==SQLITE_OK ){
! 1046: if( zData!=0 ){
! 1047: pVar = &p->aVar[i-1];
! 1048: rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
! 1049: if( rc==SQLITE_OK && encoding!=0 ){
! 1050: rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
! 1051: }
! 1052: sqlite3Error(p->db, rc, 0);
! 1053: rc = sqlite3ApiExit(p->db, rc);
! 1054: }
! 1055: sqlite3_mutex_leave(p->db->mutex);
! 1056: }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){
! 1057: xDel((void*)zData);
! 1058: }
! 1059: return rc;
! 1060: }
! 1061:
! 1062:
! 1063: /*
! 1064: ** Bind a blob value to an SQL statement variable.
! 1065: */
! 1066: int sqlite3_bind_blob(
! 1067: sqlite3_stmt *pStmt,
! 1068: int i,
! 1069: const void *zData,
! 1070: int nData,
! 1071: void (*xDel)(void*)
! 1072: ){
! 1073: return bindText(pStmt, i, zData, nData, xDel, 0);
! 1074: }
! 1075: int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
! 1076: int rc;
! 1077: Vdbe *p = (Vdbe *)pStmt;
! 1078: rc = vdbeUnbind(p, i);
! 1079: if( rc==SQLITE_OK ){
! 1080: sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
! 1081: sqlite3_mutex_leave(p->db->mutex);
! 1082: }
! 1083: return rc;
! 1084: }
! 1085: int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
! 1086: return sqlite3_bind_int64(p, i, (i64)iValue);
! 1087: }
! 1088: int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
! 1089: int rc;
! 1090: Vdbe *p = (Vdbe *)pStmt;
! 1091: rc = vdbeUnbind(p, i);
! 1092: if( rc==SQLITE_OK ){
! 1093: sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
! 1094: sqlite3_mutex_leave(p->db->mutex);
! 1095: }
! 1096: return rc;
! 1097: }
! 1098: int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){
! 1099: int rc;
! 1100: Vdbe *p = (Vdbe*)pStmt;
! 1101: rc = vdbeUnbind(p, i);
! 1102: if( rc==SQLITE_OK ){
! 1103: sqlite3_mutex_leave(p->db->mutex);
! 1104: }
! 1105: return rc;
! 1106: }
! 1107: int sqlite3_bind_text(
! 1108: sqlite3_stmt *pStmt,
! 1109: int i,
! 1110: const char *zData,
! 1111: int nData,
! 1112: void (*xDel)(void*)
! 1113: ){
! 1114: return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8);
! 1115: }
! 1116: #ifndef SQLITE_OMIT_UTF16
! 1117: int sqlite3_bind_text16(
! 1118: sqlite3_stmt *pStmt,
! 1119: int i,
! 1120: const void *zData,
! 1121: int nData,
! 1122: void (*xDel)(void*)
! 1123: ){
! 1124: return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE);
! 1125: }
! 1126: #endif /* SQLITE_OMIT_UTF16 */
! 1127: int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
! 1128: int rc;
! 1129: switch( pValue->type ){
! 1130: case SQLITE_INTEGER: {
! 1131: rc = sqlite3_bind_int64(pStmt, i, pValue->u.i);
! 1132: break;
! 1133: }
! 1134: case SQLITE_FLOAT: {
! 1135: rc = sqlite3_bind_double(pStmt, i, pValue->r);
! 1136: break;
! 1137: }
! 1138: case SQLITE_BLOB: {
! 1139: if( pValue->flags & MEM_Zero ){
! 1140: rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero);
! 1141: }else{
! 1142: rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT);
! 1143: }
! 1144: break;
! 1145: }
! 1146: case SQLITE_TEXT: {
! 1147: rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT,
! 1148: pValue->enc);
! 1149: break;
! 1150: }
! 1151: default: {
! 1152: rc = sqlite3_bind_null(pStmt, i);
! 1153: break;
! 1154: }
! 1155: }
! 1156: return rc;
! 1157: }
! 1158: int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
! 1159: int rc;
! 1160: Vdbe *p = (Vdbe *)pStmt;
! 1161: rc = vdbeUnbind(p, i);
! 1162: if( rc==SQLITE_OK ){
! 1163: sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
! 1164: sqlite3_mutex_leave(p->db->mutex);
! 1165: }
! 1166: return rc;
! 1167: }
! 1168:
! 1169: /*
! 1170: ** Return the number of wildcards that can be potentially bound to.
! 1171: ** This routine is added to support DBD::SQLite.
! 1172: */
! 1173: int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){
! 1174: Vdbe *p = (Vdbe*)pStmt;
! 1175: return p ? p->nVar : 0;
! 1176: }
! 1177:
! 1178: /*
! 1179: ** Return the name of a wildcard parameter. Return NULL if the index
! 1180: ** is out of range or if the wildcard is unnamed.
! 1181: **
! 1182: ** The result is always UTF-8.
! 1183: */
! 1184: const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){
! 1185: Vdbe *p = (Vdbe*)pStmt;
! 1186: if( p==0 || i<1 || i>p->nzVar ){
! 1187: return 0;
! 1188: }
! 1189: return p->azVar[i-1];
! 1190: }
! 1191:
! 1192: /*
! 1193: ** Given a wildcard parameter name, return the index of the variable
! 1194: ** with that name. If there is no variable with the given name,
! 1195: ** return 0.
! 1196: */
! 1197: int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){
! 1198: int i;
! 1199: if( p==0 ){
! 1200: return 0;
! 1201: }
! 1202: if( zName ){
! 1203: for(i=0; i<p->nzVar; i++){
! 1204: const char *z = p->azVar[i];
! 1205: if( z && memcmp(z,zName,nName)==0 && z[nName]==0 ){
! 1206: return i+1;
! 1207: }
! 1208: }
! 1209: }
! 1210: return 0;
! 1211: }
! 1212: int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){
! 1213: return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName));
! 1214: }
! 1215:
! 1216: /*
! 1217: ** Transfer all bindings from the first statement over to the second.
! 1218: */
! 1219: int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
! 1220: Vdbe *pFrom = (Vdbe*)pFromStmt;
! 1221: Vdbe *pTo = (Vdbe*)pToStmt;
! 1222: int i;
! 1223: assert( pTo->db==pFrom->db );
! 1224: assert( pTo->nVar==pFrom->nVar );
! 1225: sqlite3_mutex_enter(pTo->db->mutex);
! 1226: for(i=0; i<pFrom->nVar; i++){
! 1227: sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]);
! 1228: }
! 1229: sqlite3_mutex_leave(pTo->db->mutex);
! 1230: return SQLITE_OK;
! 1231: }
! 1232:
! 1233: #ifndef SQLITE_OMIT_DEPRECATED
! 1234: /*
! 1235: ** Deprecated external interface. Internal/core SQLite code
! 1236: ** should call sqlite3TransferBindings.
! 1237: **
! 1238: ** Is is misuse to call this routine with statements from different
! 1239: ** database connections. But as this is a deprecated interface, we
! 1240: ** will not bother to check for that condition.
! 1241: **
! 1242: ** If the two statements contain a different number of bindings, then
! 1243: ** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise
! 1244: ** SQLITE_OK is returned.
! 1245: */
! 1246: int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
! 1247: Vdbe *pFrom = (Vdbe*)pFromStmt;
! 1248: Vdbe *pTo = (Vdbe*)pToStmt;
! 1249: if( pFrom->nVar!=pTo->nVar ){
! 1250: return SQLITE_ERROR;
! 1251: }
! 1252: if( pTo->isPrepareV2 && pTo->expmask ){
! 1253: pTo->expired = 1;
! 1254: }
! 1255: if( pFrom->isPrepareV2 && pFrom->expmask ){
! 1256: pFrom->expired = 1;
! 1257: }
! 1258: return sqlite3TransferBindings(pFromStmt, pToStmt);
! 1259: }
! 1260: #endif
! 1261:
! 1262: /*
! 1263: ** Return the sqlite3* database handle to which the prepared statement given
! 1264: ** in the argument belongs. This is the same database handle that was
! 1265: ** the first argument to the sqlite3_prepare() that was used to create
! 1266: ** the statement in the first place.
! 1267: */
! 1268: sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
! 1269: return pStmt ? ((Vdbe*)pStmt)->db : 0;
! 1270: }
! 1271:
! 1272: /*
! 1273: ** Return true if the prepared statement is guaranteed to not modify the
! 1274: ** database.
! 1275: */
! 1276: int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){
! 1277: return pStmt ? ((Vdbe*)pStmt)->readOnly : 1;
! 1278: }
! 1279:
! 1280: /*
! 1281: ** Return true if the prepared statement is in need of being reset.
! 1282: */
! 1283: int sqlite3_stmt_busy(sqlite3_stmt *pStmt){
! 1284: Vdbe *v = (Vdbe*)pStmt;
! 1285: return v!=0 && v->pc>0 && v->magic==VDBE_MAGIC_RUN;
! 1286: }
! 1287:
! 1288: /*
! 1289: ** Return a pointer to the next prepared statement after pStmt associated
! 1290: ** with database connection pDb. If pStmt is NULL, return the first
! 1291: ** prepared statement for the database connection. Return NULL if there
! 1292: ** are no more.
! 1293: */
! 1294: sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){
! 1295: sqlite3_stmt *pNext;
! 1296: sqlite3_mutex_enter(pDb->mutex);
! 1297: if( pStmt==0 ){
! 1298: pNext = (sqlite3_stmt*)pDb->pVdbe;
! 1299: }else{
! 1300: pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext;
! 1301: }
! 1302: sqlite3_mutex_leave(pDb->mutex);
! 1303: return pNext;
! 1304: }
! 1305:
! 1306: /*
! 1307: ** Return the value of a status counter for a prepared statement
! 1308: */
! 1309: int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
! 1310: Vdbe *pVdbe = (Vdbe*)pStmt;
! 1311: int v = pVdbe->aCounter[op-1];
! 1312: if( resetFlag ) pVdbe->aCounter[op-1] = 0;
! 1313: return v;
! 1314: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>