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