[205] | 1 | /*
|
---|
| 2 | ** 2003 September 6
|
---|
| 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 | ** This file contains code used for creating, destroying, and populating
|
---|
| 13 | ** a VDBE (or an "sqlite_vm" as it is known to the outside world.) Prior
|
---|
| 14 | ** to version 2.8.7, all this code was combined into the vdbe.c source file.
|
---|
| 15 | ** But that file was getting too big so this subroutines were split out.
|
---|
| 16 | */
|
---|
| 17 | #include "sqliteInt.h"
|
---|
| 18 | #include "os.h"
|
---|
| 19 | #include <ctype.h>
|
---|
| 20 | #include "vdbeInt.h"
|
---|
| 21 |
|
---|
| 22 |
|
---|
| 23 | /*
|
---|
| 24 | ** When debugging the code generator in a symbolic debugger, one can
|
---|
| 25 | ** set the sqlite_vdbe_addop_trace to 1 and all opcodes will be printed
|
---|
| 26 | ** as they are added to the instruction stream.
|
---|
| 27 | */
|
---|
| 28 | #ifndef NDEBUG
|
---|
| 29 | int sqlite_vdbe_addop_trace = 0;
|
---|
| 30 | #endif
|
---|
| 31 |
|
---|
| 32 |
|
---|
| 33 | /*
|
---|
| 34 | ** Create a new virtual database engine.
|
---|
| 35 | */
|
---|
| 36 | Vdbe *sqliteVdbeCreate(sqlite *db){
|
---|
| 37 | Vdbe *p;
|
---|
| 38 | p = sqliteMalloc( sizeof(Vdbe) );
|
---|
| 39 | if( p==0 ) return 0;
|
---|
| 40 | p->db = db;
|
---|
| 41 | if( db->pVdbe ){
|
---|
| 42 | db->pVdbe->pPrev = p;
|
---|
| 43 | }
|
---|
| 44 | p->pNext = db->pVdbe;
|
---|
| 45 | p->pPrev = 0;
|
---|
| 46 | db->pVdbe = p;
|
---|
| 47 | p->magic = VDBE_MAGIC_INIT;
|
---|
| 48 | return p;
|
---|
| 49 | }
|
---|
| 50 |
|
---|
| 51 | /*
|
---|
| 52 | ** Turn tracing on or off
|
---|
| 53 | */
|
---|
| 54 | void sqliteVdbeTrace(Vdbe *p, FILE *trace){
|
---|
| 55 | p->trace = trace;
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | /*
|
---|
| 59 | ** Add a new instruction to the list of instructions current in the
|
---|
| 60 | ** VDBE. Return the address of the new instruction.
|
---|
| 61 | **
|
---|
| 62 | ** Parameters:
|
---|
| 63 | **
|
---|
| 64 | ** p Pointer to the VDBE
|
---|
| 65 | **
|
---|
| 66 | ** op The opcode for this instruction
|
---|
| 67 | **
|
---|
| 68 | ** p1, p2 First two of the three possible operands.
|
---|
| 69 | **
|
---|
| 70 | ** Use the sqliteVdbeResolveLabel() function to fix an address and
|
---|
| 71 | ** the sqliteVdbeChangeP3() function to change the value of the P3
|
---|
| 72 | ** operand.
|
---|
| 73 | */
|
---|
| 74 | int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){
|
---|
| 75 | int i;
|
---|
| 76 | VdbeOp *pOp;
|
---|
| 77 |
|
---|
| 78 | i = p->nOp;
|
---|
| 79 | p->nOp++;
|
---|
| 80 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 81 | if( i>=p->nOpAlloc ){
|
---|
| 82 | int oldSize = p->nOpAlloc;
|
---|
| 83 | Op *aNew;
|
---|
| 84 | p->nOpAlloc = p->nOpAlloc*2 + 100;
|
---|
| 85 | aNew = sqliteRealloc(p->aOp, p->nOpAlloc*sizeof(Op));
|
---|
| 86 | if( aNew==0 ){
|
---|
| 87 | p->nOpAlloc = oldSize;
|
---|
| 88 | return 0;
|
---|
| 89 | }
|
---|
| 90 | p->aOp = aNew;
|
---|
| 91 | memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op));
|
---|
| 92 | }
|
---|
| 93 | pOp = &p->aOp[i];
|
---|
| 94 | pOp->opcode = op;
|
---|
| 95 | pOp->p1 = p1;
|
---|
| 96 | if( p2<0 && (-1-p2)<p->nLabel && p->aLabel[-1-p2]>=0 ){
|
---|
| 97 | p2 = p->aLabel[-1-p2];
|
---|
| 98 | }
|
---|
| 99 | pOp->p2 = p2;
|
---|
| 100 | pOp->p3 = 0;
|
---|
| 101 | pOp->p3type = P3_NOTUSED;
|
---|
| 102 | #ifndef NDEBUG
|
---|
| 103 | if( sqlite_vdbe_addop_trace ) sqliteVdbePrintOp(0, i, &p->aOp[i]);
|
---|
| 104 | #endif
|
---|
| 105 | return i;
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | /*
|
---|
| 109 | ** Add an opcode that includes the p3 value.
|
---|
| 110 | */
|
---|
| 111 | int sqliteVdbeOp3(Vdbe *p, int op, int p1, int p2, const char *zP3, int p3type){
|
---|
| 112 | int addr = sqliteVdbeAddOp(p, op, p1, p2);
|
---|
| 113 | sqliteVdbeChangeP3(p, addr, zP3, p3type);
|
---|
| 114 | return addr;
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | /*
|
---|
| 118 | ** Add multiple opcodes. The list is terminated by an opcode of 0.
|
---|
| 119 | */
|
---|
| 120 | int sqliteVdbeCode(Vdbe *p, ...){
|
---|
| 121 | int addr;
|
---|
| 122 | va_list ap;
|
---|
| 123 | int opcode, p1, p2;
|
---|
| 124 | va_start(ap, p);
|
---|
| 125 | addr = p->nOp;
|
---|
| 126 | while( (opcode = va_arg(ap,int))!=0 ){
|
---|
| 127 | p1 = va_arg(ap,int);
|
---|
| 128 | p2 = va_arg(ap,int);
|
---|
| 129 | sqliteVdbeAddOp(p, opcode, p1, p2);
|
---|
| 130 | }
|
---|
| 131 | va_end(ap);
|
---|
| 132 | return addr;
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 |
|
---|
| 136 |
|
---|
| 137 | /*
|
---|
| 138 | ** Create a new symbolic label for an instruction that has yet to be
|
---|
| 139 | ** coded. The symbolic label is really just a negative number. The
|
---|
| 140 | ** label can be used as the P2 value of an operation. Later, when
|
---|
| 141 | ** the label is resolved to a specific address, the VDBE will scan
|
---|
| 142 | ** through its operation list and change all values of P2 which match
|
---|
| 143 | ** the label into the resolved address.
|
---|
| 144 | **
|
---|
| 145 | ** The VDBE knows that a P2 value is a label because labels are
|
---|
| 146 | ** always negative and P2 values are suppose to be non-negative.
|
---|
| 147 | ** Hence, a negative P2 value is a label that has yet to be resolved.
|
---|
| 148 | */
|
---|
| 149 | int sqliteVdbeMakeLabel(Vdbe *p){
|
---|
| 150 | int i;
|
---|
| 151 | i = p->nLabel++;
|
---|
| 152 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 153 | if( i>=p->nLabelAlloc ){
|
---|
| 154 | int *aNew;
|
---|
| 155 | p->nLabelAlloc = p->nLabelAlloc*2 + 10;
|
---|
| 156 | aNew = sqliteRealloc( p->aLabel, p->nLabelAlloc*sizeof(p->aLabel[0]));
|
---|
| 157 | if( aNew==0 ){
|
---|
| 158 | sqliteFree(p->aLabel);
|
---|
| 159 | }
|
---|
| 160 | p->aLabel = aNew;
|
---|
| 161 | }
|
---|
| 162 | if( p->aLabel==0 ){
|
---|
| 163 | p->nLabel = 0;
|
---|
| 164 | p->nLabelAlloc = 0;
|
---|
| 165 | return 0;
|
---|
| 166 | }
|
---|
| 167 | p->aLabel[i] = -1;
|
---|
| 168 | return -1-i;
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | /*
|
---|
| 172 | ** Resolve label "x" to be the address of the next instruction to
|
---|
| 173 | ** be inserted. The parameter "x" must have been obtained from
|
---|
| 174 | ** a prior call to sqliteVdbeMakeLabel().
|
---|
| 175 | */
|
---|
| 176 | void sqliteVdbeResolveLabel(Vdbe *p, int x){
|
---|
| 177 | int j;
|
---|
| 178 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 179 | if( x<0 && (-x)<=p->nLabel && p->aOp ){
|
---|
| 180 | if( p->aLabel[-1-x]==p->nOp ) return;
|
---|
| 181 | assert( p->aLabel[-1-x]<0 );
|
---|
| 182 | p->aLabel[-1-x] = p->nOp;
|
---|
| 183 | for(j=0; j<p->nOp; j++){
|
---|
| 184 | if( p->aOp[j].p2==x ) p->aOp[j].p2 = p->nOp;
|
---|
| 185 | }
|
---|
| 186 | }
|
---|
| 187 | }
|
---|
| 188 |
|
---|
| 189 | /*
|
---|
| 190 | ** Return the address of the next instruction to be inserted.
|
---|
| 191 | */
|
---|
| 192 | int sqliteVdbeCurrentAddr(Vdbe *p){
|
---|
| 193 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 194 | return p->nOp;
|
---|
| 195 | }
|
---|
| 196 |
|
---|
| 197 | /*
|
---|
| 198 | ** Add a whole list of operations to the operation stack. Return the
|
---|
| 199 | ** address of the first operation added.
|
---|
| 200 | */
|
---|
| 201 | int sqliteVdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){
|
---|
| 202 | int addr;
|
---|
| 203 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 204 | if( p->nOp + nOp >= p->nOpAlloc ){
|
---|
| 205 | int oldSize = p->nOpAlloc;
|
---|
| 206 | Op *aNew;
|
---|
| 207 | p->nOpAlloc = p->nOpAlloc*2 + nOp + 10;
|
---|
| 208 | aNew = sqliteRealloc(p->aOp, p->nOpAlloc*sizeof(Op));
|
---|
| 209 | if( aNew==0 ){
|
---|
| 210 | p->nOpAlloc = oldSize;
|
---|
| 211 | return 0;
|
---|
| 212 | }
|
---|
| 213 | p->aOp = aNew;
|
---|
| 214 | memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op));
|
---|
| 215 | }
|
---|
| 216 | addr = p->nOp;
|
---|
| 217 | if( nOp>0 ){
|
---|
| 218 | int i;
|
---|
| 219 | VdbeOpList const *pIn = aOp;
|
---|
| 220 | for(i=0; i<nOp; i++, pIn++){
|
---|
| 221 | int p2 = pIn->p2;
|
---|
| 222 | VdbeOp *pOut = &p->aOp[i+addr];
|
---|
| 223 | pOut->opcode = pIn->opcode;
|
---|
| 224 | pOut->p1 = pIn->p1;
|
---|
| 225 | pOut->p2 = p2<0 ? addr + ADDR(p2) : p2;
|
---|
| 226 | pOut->p3 = pIn->p3;
|
---|
| 227 | pOut->p3type = pIn->p3 ? P3_STATIC : P3_NOTUSED;
|
---|
| 228 | #ifndef NDEBUG
|
---|
| 229 | if( sqlite_vdbe_addop_trace ){
|
---|
| 230 | sqliteVdbePrintOp(0, i+addr, &p->aOp[i+addr]);
|
---|
| 231 | }
|
---|
| 232 | #endif
|
---|
| 233 | }
|
---|
| 234 | p->nOp += nOp;
|
---|
| 235 | }
|
---|
| 236 | return addr;
|
---|
| 237 | }
|
---|
| 238 |
|
---|
| 239 | /*
|
---|
| 240 | ** Change the value of the P1 operand for a specific instruction.
|
---|
| 241 | ** This routine is useful when a large program is loaded from a
|
---|
| 242 | ** static array using sqliteVdbeAddOpList but we want to make a
|
---|
| 243 | ** few minor changes to the program.
|
---|
| 244 | */
|
---|
| 245 | void sqliteVdbeChangeP1(Vdbe *p, int addr, int val){
|
---|
| 246 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 247 | if( p && addr>=0 && p->nOp>addr && p->aOp ){
|
---|
| 248 | p->aOp[addr].p1 = val;
|
---|
| 249 | }
|
---|
| 250 | }
|
---|
| 251 |
|
---|
| 252 | /*
|
---|
| 253 | ** Change the value of the P2 operand for a specific instruction.
|
---|
| 254 | ** This routine is useful for setting a jump destination.
|
---|
| 255 | */
|
---|
| 256 | void sqliteVdbeChangeP2(Vdbe *p, int addr, int val){
|
---|
| 257 | assert( val>=0 );
|
---|
| 258 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 259 | if( p && addr>=0 && p->nOp>addr && p->aOp ){
|
---|
| 260 | p->aOp[addr].p2 = val;
|
---|
| 261 | }
|
---|
| 262 | }
|
---|
| 263 |
|
---|
| 264 | /*
|
---|
| 265 | ** Change the value of the P3 operand for a specific instruction.
|
---|
| 266 | ** This routine is useful when a large program is loaded from a
|
---|
| 267 | ** static array using sqliteVdbeAddOpList but we want to make a
|
---|
| 268 | ** few minor changes to the program.
|
---|
| 269 | **
|
---|
| 270 | ** If n>=0 then the P3 operand is dynamic, meaning that a copy of
|
---|
| 271 | ** the string is made into memory obtained from sqliteMalloc().
|
---|
| 272 | ** A value of n==0 means copy bytes of zP3 up to and including the
|
---|
| 273 | ** first null byte. If n>0 then copy n+1 bytes of zP3.
|
---|
| 274 | **
|
---|
| 275 | ** If n==P3_STATIC it means that zP3 is a pointer to a constant static
|
---|
| 276 | ** string and we can just copy the pointer. n==P3_POINTER means zP3 is
|
---|
| 277 | ** a pointer to some object other than a string.
|
---|
| 278 | **
|
---|
| 279 | ** If addr<0 then change P3 on the most recently inserted instruction.
|
---|
| 280 | */
|
---|
| 281 | void sqliteVdbeChangeP3(Vdbe *p, int addr, const char *zP3, int n){
|
---|
| 282 | Op *pOp;
|
---|
| 283 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 284 | if( p==0 || p->aOp==0 ) return;
|
---|
| 285 | if( addr<0 || addr>=p->nOp ){
|
---|
| 286 | addr = p->nOp - 1;
|
---|
| 287 | if( addr<0 ) return;
|
---|
| 288 | }
|
---|
| 289 | pOp = &p->aOp[addr];
|
---|
| 290 | if( pOp->p3 && pOp->p3type==P3_DYNAMIC ){
|
---|
| 291 | sqliteFree(pOp->p3);
|
---|
| 292 | pOp->p3 = 0;
|
---|
| 293 | }
|
---|
| 294 | if( zP3==0 ){
|
---|
| 295 | pOp->p3 = 0;
|
---|
| 296 | pOp->p3type = P3_NOTUSED;
|
---|
| 297 | }else if( n<0 ){
|
---|
| 298 | pOp->p3 = (char*)zP3;
|
---|
| 299 | pOp->p3type = n;
|
---|
| 300 | }else{
|
---|
| 301 | sqliteSetNString(&pOp->p3, zP3, n, 0);
|
---|
| 302 | pOp->p3type = P3_DYNAMIC;
|
---|
| 303 | }
|
---|
| 304 | }
|
---|
| 305 |
|
---|
| 306 | /*
|
---|
| 307 | ** If the P3 operand to the specified instruction appears
|
---|
| 308 | ** to be a quoted string token, then this procedure removes
|
---|
| 309 | ** the quotes.
|
---|
| 310 | **
|
---|
| 311 | ** The quoting operator can be either a grave ascent (ASCII 0x27)
|
---|
| 312 | ** or a double quote character (ASCII 0x22). Two quotes in a row
|
---|
| 313 | ** resolve to be a single actual quote character within the string.
|
---|
| 314 | */
|
---|
| 315 | void sqliteVdbeDequoteP3(Vdbe *p, int addr){
|
---|
| 316 | Op *pOp;
|
---|
| 317 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 318 | if( p->aOp==0 ) return;
|
---|
| 319 | if( addr<0 || addr>=p->nOp ){
|
---|
| 320 | addr = p->nOp - 1;
|
---|
| 321 | if( addr<0 ) return;
|
---|
| 322 | }
|
---|
| 323 | pOp = &p->aOp[addr];
|
---|
| 324 | if( pOp->p3==0 || pOp->p3[0]==0 ) return;
|
---|
| 325 | if( pOp->p3type==P3_POINTER ) return;
|
---|
| 326 | if( pOp->p3type!=P3_DYNAMIC ){
|
---|
| 327 | pOp->p3 = sqliteStrDup(pOp->p3);
|
---|
| 328 | pOp->p3type = P3_DYNAMIC;
|
---|
| 329 | }
|
---|
| 330 | sqliteDequote(pOp->p3);
|
---|
| 331 | }
|
---|
| 332 |
|
---|
| 333 | /*
|
---|
| 334 | ** On the P3 argument of the given instruction, change all
|
---|
| 335 | ** strings of whitespace characters into a single space and
|
---|
| 336 | ** delete leading and trailing whitespace.
|
---|
| 337 | */
|
---|
| 338 | void sqliteVdbeCompressSpace(Vdbe *p, int addr){
|
---|
| 339 | unsigned char *z;
|
---|
| 340 | int i, j;
|
---|
| 341 | Op *pOp;
|
---|
| 342 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 343 | if( p->aOp==0 || addr<0 || addr>=p->nOp ) return;
|
---|
| 344 | pOp = &p->aOp[addr];
|
---|
| 345 | if( pOp->p3type==P3_POINTER ){
|
---|
| 346 | return;
|
---|
| 347 | }
|
---|
| 348 | if( pOp->p3type!=P3_DYNAMIC ){
|
---|
| 349 | pOp->p3 = sqliteStrDup(pOp->p3);
|
---|
| 350 | pOp->p3type = P3_DYNAMIC;
|
---|
| 351 | }
|
---|
| 352 | z = (unsigned char*)pOp->p3;
|
---|
| 353 | if( z==0 ) return;
|
---|
| 354 | i = j = 0;
|
---|
| 355 | while( isspace(z[i]) ){ i++; }
|
---|
| 356 | while( z[i] ){
|
---|
| 357 | if( isspace(z[i]) ){
|
---|
| 358 | z[j++] = ' ';
|
---|
| 359 | while( isspace(z[++i]) ){}
|
---|
| 360 | }else{
|
---|
| 361 | z[j++] = z[i++];
|
---|
| 362 | }
|
---|
| 363 | }
|
---|
| 364 | while( j>0 && isspace(z[j-1]) ){ j--; }
|
---|
| 365 | z[j] = 0;
|
---|
| 366 | }
|
---|
| 367 |
|
---|
| 368 | /*
|
---|
| 369 | ** Search for the current program for the given opcode and P2
|
---|
| 370 | ** value. Return the address plus 1 if found and 0 if not found.
|
---|
| 371 | */
|
---|
| 372 | int sqliteVdbeFindOp(Vdbe *p, int op, int p2){
|
---|
| 373 | int i;
|
---|
| 374 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 375 | for(i=0; i<p->nOp; i++){
|
---|
| 376 | if( p->aOp[i].opcode==op && p->aOp[i].p2==p2 ) return i+1;
|
---|
| 377 | }
|
---|
| 378 | return 0;
|
---|
| 379 | }
|
---|
| 380 |
|
---|
| 381 | /*
|
---|
| 382 | ** Return the opcode for a given address.
|
---|
| 383 | */
|
---|
| 384 | VdbeOp *sqliteVdbeGetOp(Vdbe *p, int addr){
|
---|
| 385 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 386 | assert( addr>=0 && addr<p->nOp );
|
---|
| 387 | return &p->aOp[addr];
|
---|
| 388 | }
|
---|
| 389 |
|
---|
| 390 | /*
|
---|
| 391 | ** The following group or routines are employed by installable functions
|
---|
| 392 | ** to return their results.
|
---|
| 393 | **
|
---|
| 394 | ** The sqlite_set_result_string() routine can be used to return a string
|
---|
| 395 | ** value or to return a NULL. To return a NULL, pass in NULL for zResult.
|
---|
| 396 | ** A copy is made of the string before this routine returns so it is safe
|
---|
| 397 | ** to pass in an ephemeral string.
|
---|
| 398 | **
|
---|
| 399 | ** sqlite_set_result_error() works like sqlite_set_result_string() except
|
---|
| 400 | ** that it signals a fatal error. The string argument, if any, is the
|
---|
| 401 | ** error message. If the argument is NULL a generic substitute error message
|
---|
| 402 | ** is used.
|
---|
| 403 | **
|
---|
| 404 | ** The sqlite_set_result_int() and sqlite_set_result_double() set the return
|
---|
| 405 | ** value of the user function to an integer or a double.
|
---|
| 406 | **
|
---|
| 407 | ** These routines are defined here in vdbe.c because they depend on knowing
|
---|
| 408 | ** the internals of the sqlite_func structure which is only defined in
|
---|
| 409 | ** this source file.
|
---|
| 410 | */
|
---|
| 411 | char *sqlite_set_result_string(sqlite_func *p, const char *zResult, int n){
|
---|
| 412 | assert( !p->isStep );
|
---|
| 413 | if( p->s.flags & MEM_Dyn ){
|
---|
| 414 | sqliteFree(p->s.z);
|
---|
| 415 | }
|
---|
| 416 | if( zResult==0 ){
|
---|
| 417 | p->s.flags = MEM_Null;
|
---|
| 418 | n = 0;
|
---|
| 419 | p->s.z = 0;
|
---|
| 420 | p->s.n = 0;
|
---|
| 421 | }else{
|
---|
| 422 | if( n<0 ) n = strlen(zResult);
|
---|
| 423 | if( n<NBFS-1 ){
|
---|
| 424 | memcpy(p->s.zShort, zResult, n);
|
---|
| 425 | p->s.zShort[n] = 0;
|
---|
| 426 | p->s.flags = MEM_Str | MEM_Short;
|
---|
| 427 | p->s.z = p->s.zShort;
|
---|
| 428 | }else{
|
---|
| 429 | p->s.z = sqliteMallocRaw( n+1 );
|
---|
| 430 | if( p->s.z ){
|
---|
| 431 | memcpy(p->s.z, zResult, n);
|
---|
| 432 | p->s.z[n] = 0;
|
---|
| 433 | }
|
---|
| 434 | p->s.flags = MEM_Str | MEM_Dyn;
|
---|
| 435 | }
|
---|
| 436 | p->s.n = n+1;
|
---|
| 437 | }
|
---|
| 438 | return p->s.z;
|
---|
| 439 | }
|
---|
| 440 | void sqlite_set_result_int(sqlite_func *p, int iResult){
|
---|
| 441 | assert( !p->isStep );
|
---|
| 442 | if( p->s.flags & MEM_Dyn ){
|
---|
| 443 | sqliteFree(p->s.z);
|
---|
| 444 | }
|
---|
| 445 | p->s.i = iResult;
|
---|
| 446 | p->s.flags = MEM_Int;
|
---|
| 447 | }
|
---|
| 448 | void sqlite_set_result_double(sqlite_func *p, double rResult){
|
---|
| 449 | assert( !p->isStep );
|
---|
| 450 | if( p->s.flags & MEM_Dyn ){
|
---|
| 451 | sqliteFree(p->s.z);
|
---|
| 452 | }
|
---|
| 453 | p->s.r = rResult;
|
---|
| 454 | p->s.flags = MEM_Real;
|
---|
| 455 | }
|
---|
| 456 | void sqlite_set_result_error(sqlite_func *p, const char *zMsg, int n){
|
---|
| 457 | assert( !p->isStep );
|
---|
| 458 | sqlite_set_result_string(p, zMsg, n);
|
---|
| 459 | p->isError = 1;
|
---|
| 460 | }
|
---|
| 461 |
|
---|
| 462 | /*
|
---|
| 463 | ** Extract the user data from a sqlite_func structure and return a
|
---|
| 464 | ** pointer to it.
|
---|
| 465 | */
|
---|
| 466 | void *sqlite_user_data(sqlite_func *p){
|
---|
| 467 | assert( p && p->pFunc );
|
---|
| 468 | return p->pFunc->pUserData;
|
---|
| 469 | }
|
---|
| 470 |
|
---|
| 471 | /*
|
---|
| 472 | ** Allocate or return the aggregate context for a user function. A new
|
---|
| 473 | ** context is allocated on the first call. Subsequent calls return the
|
---|
| 474 | ** same context that was returned on prior calls.
|
---|
| 475 | **
|
---|
| 476 | ** This routine is defined here in vdbe.c because it depends on knowing
|
---|
| 477 | ** the internals of the sqlite_func structure which is only defined in
|
---|
| 478 | ** this source file.
|
---|
| 479 | */
|
---|
| 480 | void *sqlite_aggregate_context(sqlite_func *p, int nByte){
|
---|
| 481 | assert( p && p->pFunc && p->pFunc->xStep );
|
---|
| 482 | if( p->pAgg==0 ){
|
---|
| 483 | if( nByte<=NBFS ){
|
---|
| 484 | p->pAgg = (void*)p->s.z;
|
---|
| 485 | memset(p->pAgg, 0, nByte);
|
---|
| 486 | }else{
|
---|
| 487 | p->pAgg = sqliteMalloc( nByte );
|
---|
| 488 | }
|
---|
| 489 | }
|
---|
| 490 | return p->pAgg;
|
---|
| 491 | }
|
---|
| 492 |
|
---|
| 493 | /*
|
---|
| 494 | ** Return the number of times the Step function of a aggregate has been
|
---|
| 495 | ** called.
|
---|
| 496 | **
|
---|
| 497 | ** This routine is defined here in vdbe.c because it depends on knowing
|
---|
| 498 | ** the internals of the sqlite_func structure which is only defined in
|
---|
| 499 | ** this source file.
|
---|
| 500 | */
|
---|
| 501 | int sqlite_aggregate_count(sqlite_func *p){
|
---|
| 502 | assert( p && p->pFunc && p->pFunc->xStep );
|
---|
| 503 | return p->cnt;
|
---|
| 504 | }
|
---|
| 505 |
|
---|
| 506 | #if !defined(NDEBUG) || defined(VDBE_PROFILE)
|
---|
| 507 | /*
|
---|
| 508 | ** Print a single opcode. This routine is used for debugging only.
|
---|
| 509 | */
|
---|
| 510 | void sqliteVdbePrintOp(FILE *pOut, int pc, Op *pOp){
|
---|
| 511 | char *zP3;
|
---|
| 512 | char zPtr[40];
|
---|
| 513 | if( pOp->p3type==P3_POINTER ){
|
---|
| 514 | sprintf(zPtr, "ptr(%#lx)", (long)pOp->p3);
|
---|
| 515 | zP3 = zPtr;
|
---|
| 516 | }else{
|
---|
| 517 | zP3 = pOp->p3;
|
---|
| 518 | }
|
---|
| 519 | if( pOut==0 ) pOut = stdout;
|
---|
| 520 | fprintf(pOut,"%4d %-12s %4d %4d %s\n",
|
---|
| 521 | pc, sqliteOpcodeNames[pOp->opcode], pOp->p1, pOp->p2, zP3 ? zP3 : "");
|
---|
| 522 | fflush(pOut);
|
---|
| 523 | }
|
---|
| 524 | #endif
|
---|
| 525 |
|
---|
| 526 | /*
|
---|
| 527 | ** Give a listing of the program in the virtual machine.
|
---|
| 528 | **
|
---|
| 529 | ** The interface is the same as sqliteVdbeExec(). But instead of
|
---|
| 530 | ** running the code, it invokes the callback once for each instruction.
|
---|
| 531 | ** This feature is used to implement "EXPLAIN".
|
---|
| 532 | */
|
---|
| 533 | int sqliteVdbeList(
|
---|
| 534 | Vdbe *p /* The VDBE */
|
---|
| 535 | ){
|
---|
| 536 | sqlite *db = p->db;
|
---|
| 537 | int i;
|
---|
| 538 | int rc = SQLITE_OK;
|
---|
| 539 | static char *azColumnNames[] = {
|
---|
| 540 | "addr", "opcode", "p1", "p2", "p3",
|
---|
| 541 | "int", "text", "int", "int", "text",
|
---|
| 542 | 0
|
---|
| 543 | };
|
---|
| 544 |
|
---|
| 545 | assert( p->popStack==0 );
|
---|
| 546 | assert( p->explain );
|
---|
| 547 | p->azColName = azColumnNames;
|
---|
| 548 | p->azResColumn = p->zArgv;
|
---|
| 549 | for(i=0; i<5; i++) p->zArgv[i] = p->aStack[i].zShort;
|
---|
| 550 | i = p->pc;
|
---|
| 551 | if( i>=p->nOp ){
|
---|
| 552 | p->rc = SQLITE_OK;
|
---|
| 553 | rc = SQLITE_DONE;
|
---|
| 554 | }else if( db->flags & SQLITE_Interrupt ){
|
---|
| 555 | db->flags &= ~SQLITE_Interrupt;
|
---|
| 556 | if( db->magic!=SQLITE_MAGIC_BUSY ){
|
---|
| 557 | p->rc = SQLITE_MISUSE;
|
---|
| 558 | }else{
|
---|
| 559 | p->rc = SQLITE_INTERRUPT;
|
---|
| 560 | }
|
---|
| 561 | rc = SQLITE_ERROR;
|
---|
| 562 | sqliteSetString(&p->zErrMsg, sqlite_error_string(p->rc), (char*)0);
|
---|
| 563 | }else{
|
---|
| 564 | sprintf(p->zArgv[0],"%d",i);
|
---|
| 565 | sprintf(p->zArgv[2],"%d", p->aOp[i].p1);
|
---|
| 566 | sprintf(p->zArgv[3],"%d", p->aOp[i].p2);
|
---|
| 567 | if( p->aOp[i].p3type==P3_POINTER ){
|
---|
| 568 | sprintf(p->aStack[4].zShort, "ptr(%#lx)", (long)p->aOp[i].p3);
|
---|
| 569 | p->zArgv[4] = p->aStack[4].zShort;
|
---|
| 570 | }else{
|
---|
| 571 | p->zArgv[4] = p->aOp[i].p3;
|
---|
| 572 | }
|
---|
| 573 | p->zArgv[1] = sqliteOpcodeNames[p->aOp[i].opcode];
|
---|
| 574 | p->pc = i+1;
|
---|
| 575 | p->azResColumn = p->zArgv;
|
---|
| 576 | p->nResColumn = 5;
|
---|
| 577 | p->rc = SQLITE_OK;
|
---|
| 578 | rc = SQLITE_ROW;
|
---|
| 579 | }
|
---|
| 580 | return rc;
|
---|
| 581 | }
|
---|
| 582 |
|
---|
| 583 | /*
|
---|
| 584 | ** Prepare a virtual machine for execution. This involves things such
|
---|
| 585 | ** as allocating stack space and initializing the program counter.
|
---|
| 586 | ** After the VDBE has be prepped, it can be executed by one or more
|
---|
| 587 | ** calls to sqliteVdbeExec().
|
---|
| 588 | */
|
---|
| 589 | void sqliteVdbeMakeReady(
|
---|
| 590 | Vdbe *p, /* The VDBE */
|
---|
| 591 | int nVar, /* Number of '?' see in the SQL statement */
|
---|
| 592 | int isExplain /* True if the EXPLAIN keywords is present */
|
---|
| 593 | ){
|
---|
| 594 | int n;
|
---|
| 595 |
|
---|
| 596 | assert( p!=0 );
|
---|
| 597 | assert( p->magic==VDBE_MAGIC_INIT );
|
---|
| 598 |
|
---|
| 599 | /* Add a HALT instruction to the very end of the program.
|
---|
| 600 | */
|
---|
| 601 | if( p->nOp==0 || (p->aOp && p->aOp[p->nOp-1].opcode!=OP_Halt) ){
|
---|
| 602 | sqliteVdbeAddOp(p, OP_Halt, 0, 0);
|
---|
| 603 | }
|
---|
| 604 |
|
---|
| 605 | /* No instruction ever pushes more than a single element onto the
|
---|
| 606 | ** stack. And the stack never grows on successive executions of the
|
---|
| 607 | ** same loop. So the total number of instructions is an upper bound
|
---|
| 608 | ** on the maximum stack depth required.
|
---|
| 609 | **
|
---|
| 610 | ** Allocation all the stack space we will ever need.
|
---|
| 611 | */
|
---|
| 612 | if( p->aStack==0 ){
|
---|
| 613 | p->nVar = nVar;
|
---|
| 614 | assert( nVar>=0 );
|
---|
| 615 | n = isExplain ? 10 : p->nOp;
|
---|
| 616 | p->aStack = sqliteMalloc(
|
---|
| 617 | n*(sizeof(p->aStack[0]) + 2*sizeof(char*)) /* aStack and zArgv */
|
---|
| 618 | + p->nVar*(sizeof(char*)+sizeof(int)+1) /* azVar, anVar, abVar */
|
---|
| 619 | );
|
---|
| 620 | p->zArgv = (char**)&p->aStack[n];
|
---|
| 621 | p->azColName = (char**)&p->zArgv[n];
|
---|
| 622 | p->azVar = (char**)&p->azColName[n];
|
---|
| 623 | p->anVar = (int*)&p->azVar[p->nVar];
|
---|
| 624 | p->abVar = (u8*)&p->anVar[p->nVar];
|
---|
| 625 | }
|
---|
| 626 |
|
---|
| 627 | sqliteHashInit(&p->agg.hash, SQLITE_HASH_BINARY, 0);
|
---|
| 628 | p->agg.pSearch = 0;
|
---|
| 629 | #ifdef MEMORY_DEBUG
|
---|
| 630 | if( sqliteOsFileExists("vdbe_trace") ){
|
---|
| 631 | p->trace = stdout;
|
---|
| 632 | }
|
---|
| 633 | #endif
|
---|
| 634 | p->pTos = &p->aStack[-1];
|
---|
| 635 | p->pc = 0;
|
---|
| 636 | p->rc = SQLITE_OK;
|
---|
| 637 | p->uniqueCnt = 0;
|
---|
| 638 | p->returnDepth = 0;
|
---|
| 639 | p->errorAction = OE_Abort;
|
---|
| 640 | p->undoTransOnError = 0;
|
---|
| 641 | p->popStack = 0;
|
---|
| 642 | p->explain |= isExplain;
|
---|
| 643 | p->magic = VDBE_MAGIC_RUN;
|
---|
| 644 | #ifdef VDBE_PROFILE
|
---|
| 645 | {
|
---|
| 646 | int i;
|
---|
| 647 | for(i=0; i<p->nOp; i++){
|
---|
| 648 | p->aOp[i].cnt = 0;
|
---|
| 649 | p->aOp[i].cycles = 0;
|
---|
| 650 | }
|
---|
| 651 | }
|
---|
| 652 | #endif
|
---|
| 653 | }
|
---|
| 654 |
|
---|
| 655 |
|
---|
| 656 | /*
|
---|
| 657 | ** Remove any elements that remain on the sorter for the VDBE given.
|
---|
| 658 | */
|
---|
| 659 | void sqliteVdbeSorterReset(Vdbe *p){
|
---|
| 660 | while( p->pSort ){
|
---|
| 661 | Sorter *pSorter = p->pSort;
|
---|
| 662 | p->pSort = pSorter->pNext;
|
---|
| 663 | sqliteFree(pSorter->zKey);
|
---|
| 664 | sqliteFree(pSorter->pData);
|
---|
| 665 | sqliteFree(pSorter);
|
---|
| 666 | }
|
---|
| 667 | }
|
---|
| 668 |
|
---|
| 669 | /*
|
---|
| 670 | ** Reset an Agg structure. Delete all its contents.
|
---|
| 671 | **
|
---|
| 672 | ** For installable aggregate functions, if the step function has been
|
---|
| 673 | ** called, make sure the finalizer function has also been called. The
|
---|
| 674 | ** finalizer might need to free memory that was allocated as part of its
|
---|
| 675 | ** private context. If the finalizer has not been called yet, call it
|
---|
| 676 | ** now.
|
---|
| 677 | */
|
---|
| 678 | void sqliteVdbeAggReset(Agg *pAgg){
|
---|
| 679 | int i;
|
---|
| 680 | HashElem *p;
|
---|
| 681 | for(p = sqliteHashFirst(&pAgg->hash); p; p = sqliteHashNext(p)){
|
---|
| 682 | AggElem *pElem = sqliteHashData(p);
|
---|
| 683 | assert( pAgg->apFunc!=0 );
|
---|
| 684 | for(i=0; i<pAgg->nMem; i++){
|
---|
| 685 | Mem *pMem = &pElem->aMem[i];
|
---|
| 686 | if( pAgg->apFunc[i] && (pMem->flags & MEM_AggCtx)!=0 ){
|
---|
| 687 | sqlite_func ctx;
|
---|
| 688 | ctx.pFunc = pAgg->apFunc[i];
|
---|
| 689 | ctx.s.flags = MEM_Null;
|
---|
| 690 | ctx.pAgg = pMem->z;
|
---|
| 691 | ctx.cnt = pMem->i;
|
---|
| 692 | ctx.isStep = 0;
|
---|
| 693 | ctx.isError = 0;
|
---|
| 694 | (*pAgg->apFunc[i]->xFinalize)(&ctx);
|
---|
| 695 | if( pMem->z!=0 && pMem->z!=pMem->zShort ){
|
---|
| 696 | sqliteFree(pMem->z);
|
---|
| 697 | }
|
---|
| 698 | if( ctx.s.flags & MEM_Dyn ){
|
---|
| 699 | sqliteFree(ctx.s.z);
|
---|
| 700 | }
|
---|
| 701 | }else if( pMem->flags & MEM_Dyn ){
|
---|
| 702 | sqliteFree(pMem->z);
|
---|
| 703 | }
|
---|
| 704 | }
|
---|
| 705 | sqliteFree(pElem);
|
---|
| 706 | }
|
---|
| 707 | sqliteHashClear(&pAgg->hash);
|
---|
| 708 | sqliteFree(pAgg->apFunc);
|
---|
| 709 | pAgg->apFunc = 0;
|
---|
| 710 | pAgg->pCurrent = 0;
|
---|
| 711 | pAgg->pSearch = 0;
|
---|
| 712 | pAgg->nMem = 0;
|
---|
| 713 | }
|
---|
| 714 |
|
---|
| 715 | /*
|
---|
| 716 | ** Delete a keylist
|
---|
| 717 | */
|
---|
| 718 | void sqliteVdbeKeylistFree(Keylist *p){
|
---|
| 719 | while( p ){
|
---|
| 720 | Keylist *pNext = p->pNext;
|
---|
| 721 | sqliteFree(p);
|
---|
| 722 | p = pNext;
|
---|
| 723 | }
|
---|
| 724 | }
|
---|
| 725 |
|
---|
| 726 | /*
|
---|
| 727 | ** Close a cursor and release all the resources that cursor happens
|
---|
| 728 | ** to hold.
|
---|
| 729 | */
|
---|
| 730 | void sqliteVdbeCleanupCursor(Cursor *pCx){
|
---|
| 731 | if( pCx->pCursor ){
|
---|
| 732 | sqliteBtreeCloseCursor(pCx->pCursor);
|
---|
| 733 | }
|
---|
| 734 | if( pCx->pBt ){
|
---|
| 735 | sqliteBtreeClose(pCx->pBt);
|
---|
| 736 | }
|
---|
| 737 | sqliteFree(pCx->pData);
|
---|
| 738 | memset(pCx, 0, sizeof(Cursor));
|
---|
| 739 | }
|
---|
| 740 |
|
---|
| 741 | /*
|
---|
| 742 | ** Close all cursors
|
---|
| 743 | */
|
---|
| 744 | static void closeAllCursors(Vdbe *p){
|
---|
| 745 | int i;
|
---|
| 746 | for(i=0; i<p->nCursor; i++){
|
---|
| 747 | sqliteVdbeCleanupCursor(&p->aCsr[i]);
|
---|
| 748 | }
|
---|
| 749 | sqliteFree(p->aCsr);
|
---|
| 750 | p->aCsr = 0;
|
---|
| 751 | p->nCursor = 0;
|
---|
| 752 | }
|
---|
| 753 |
|
---|
| 754 | /*
|
---|
| 755 | ** Clean up the VM after execution.
|
---|
| 756 | **
|
---|
| 757 | ** This routine will automatically close any cursors, lists, and/or
|
---|
| 758 | ** sorters that were left open. It also deletes the values of
|
---|
| 759 | ** variables in the azVariable[] array.
|
---|
| 760 | */
|
---|
| 761 | static void Cleanup(Vdbe *p){
|
---|
| 762 | int i;
|
---|
| 763 | if( p->aStack ){
|
---|
| 764 | Mem *pTos = p->pTos;
|
---|
| 765 | while( pTos>=p->aStack ){
|
---|
| 766 | if( pTos->flags & MEM_Dyn ){
|
---|
| 767 | sqliteFree(pTos->z);
|
---|
| 768 | }
|
---|
| 769 | pTos--;
|
---|
| 770 | }
|
---|
| 771 | p->pTos = pTos;
|
---|
| 772 | }
|
---|
| 773 | closeAllCursors(p);
|
---|
| 774 | if( p->aMem ){
|
---|
| 775 | for(i=0; i<p->nMem; i++){
|
---|
| 776 | if( p->aMem[i].flags & MEM_Dyn ){
|
---|
| 777 | sqliteFree(p->aMem[i].z);
|
---|
| 778 | }
|
---|
| 779 | }
|
---|
| 780 | }
|
---|
| 781 | sqliteFree(p->aMem);
|
---|
| 782 | p->aMem = 0;
|
---|
| 783 | p->nMem = 0;
|
---|
| 784 | if( p->pList ){
|
---|
| 785 | sqliteVdbeKeylistFree(p->pList);
|
---|
| 786 | p->pList = 0;
|
---|
| 787 | }
|
---|
| 788 | sqliteVdbeSorterReset(p);
|
---|
| 789 | if( p->pFile ){
|
---|
| 790 | if( p->pFile!=stdin ) fclose(p->pFile);
|
---|
| 791 | p->pFile = 0;
|
---|
| 792 | }
|
---|
| 793 | if( p->azField ){
|
---|
| 794 | sqliteFree(p->azField);
|
---|
| 795 | p->azField = 0;
|
---|
| 796 | }
|
---|
| 797 | p->nField = 0;
|
---|
| 798 | if( p->zLine ){
|
---|
| 799 | sqliteFree(p->zLine);
|
---|
| 800 | p->zLine = 0;
|
---|
| 801 | }
|
---|
| 802 | p->nLineAlloc = 0;
|
---|
| 803 | sqliteVdbeAggReset(&p->agg);
|
---|
| 804 | if( p->aSet ){
|
---|
| 805 | for(i=0; i<p->nSet; i++){
|
---|
| 806 | sqliteHashClear(&p->aSet[i].hash);
|
---|
| 807 | }
|
---|
| 808 | }
|
---|
| 809 | sqliteFree(p->aSet);
|
---|
| 810 | p->aSet = 0;
|
---|
| 811 | p->nSet = 0;
|
---|
| 812 | if( p->keylistStack ){
|
---|
| 813 | int ii;
|
---|
| 814 | for(ii = 0; ii < p->keylistStackDepth; ii++){
|
---|
| 815 | sqliteVdbeKeylistFree(p->keylistStack[ii]);
|
---|
| 816 | }
|
---|
| 817 | sqliteFree(p->keylistStack);
|
---|
| 818 | p->keylistStackDepth = 0;
|
---|
| 819 | p->keylistStack = 0;
|
---|
| 820 | }
|
---|
| 821 | sqliteFree(p->contextStack);
|
---|
| 822 | p->contextStack = 0;
|
---|
| 823 | sqliteFree(p->zErrMsg);
|
---|
| 824 | p->zErrMsg = 0;
|
---|
| 825 | }
|
---|
| 826 |
|
---|
| 827 | /*
|
---|
| 828 | ** Clean up a VDBE after execution but do not delete the VDBE just yet.
|
---|
| 829 | ** Write any error messages into *pzErrMsg. Return the result code.
|
---|
| 830 | **
|
---|
| 831 | ** After this routine is run, the VDBE should be ready to be executed
|
---|
| 832 | ** again.
|
---|
| 833 | */
|
---|
| 834 | int sqliteVdbeReset(Vdbe *p, char **pzErrMsg){
|
---|
| 835 | sqlite *db = p->db;
|
---|
| 836 | int i;
|
---|
| 837 |
|
---|
| 838 | if( p->magic!=VDBE_MAGIC_RUN && p->magic!=VDBE_MAGIC_HALT ){
|
---|
| 839 | sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), (char*)0);
|
---|
| 840 | return SQLITE_MISUSE;
|
---|
| 841 | }
|
---|
| 842 | if( p->zErrMsg ){
|
---|
| 843 | if( pzErrMsg && *pzErrMsg==0 ){
|
---|
| 844 | *pzErrMsg = p->zErrMsg;
|
---|
| 845 | }else{
|
---|
| 846 | sqliteFree(p->zErrMsg);
|
---|
| 847 | }
|
---|
| 848 | p->zErrMsg = 0;
|
---|
| 849 | }else if( p->rc ){
|
---|
| 850 | sqliteSetString(pzErrMsg, sqlite_error_string(p->rc), (char*)0);
|
---|
| 851 | }
|
---|
| 852 | Cleanup(p);
|
---|
| 853 | if( p->rc!=SQLITE_OK ){
|
---|
| 854 | switch( p->errorAction ){
|
---|
| 855 | case OE_Abort: {
|
---|
| 856 | if( !p->undoTransOnError ){
|
---|
| 857 | for(i=0; i<db->nDb; i++){
|
---|
| 858 | if( db->aDb[i].pBt ){
|
---|
| 859 | sqliteBtreeRollbackCkpt(db->aDb[i].pBt);
|
---|
| 860 | }
|
---|
| 861 | }
|
---|
| 862 | break;
|
---|
| 863 | }
|
---|
| 864 | /* Fall through to ROLLBACK */
|
---|
| 865 | }
|
---|
| 866 | case OE_Rollback: {
|
---|
| 867 | sqliteRollbackAll(db);
|
---|
| 868 | db->flags &= ~SQLITE_InTrans;
|
---|
| 869 | db->onError = OE_Default;
|
---|
| 870 | break;
|
---|
| 871 | }
|
---|
| 872 | default: {
|
---|
| 873 | if( p->undoTransOnError ){
|
---|
| 874 | sqliteRollbackAll(db);
|
---|
| 875 | db->flags &= ~SQLITE_InTrans;
|
---|
| 876 | db->onError = OE_Default;
|
---|
| 877 | }
|
---|
| 878 | break;
|
---|
| 879 | }
|
---|
| 880 | }
|
---|
| 881 | sqliteRollbackInternalChanges(db);
|
---|
| 882 | }
|
---|
| 883 | for(i=0; i<db->nDb; i++){
|
---|
| 884 | if( db->aDb[i].pBt && db->aDb[i].inTrans==2 ){
|
---|
| 885 | sqliteBtreeCommitCkpt(db->aDb[i].pBt);
|
---|
| 886 | db->aDb[i].inTrans = 1;
|
---|
| 887 | }
|
---|
| 888 | }
|
---|
| 889 | assert( p->pTos<&p->aStack[p->pc] || sqlite_malloc_failed==1 );
|
---|
| 890 | #ifdef VDBE_PROFILE
|
---|
| 891 | {
|
---|
| 892 | FILE *out = fopen("vdbe_profile.out", "a");
|
---|
| 893 | if( out ){
|
---|
| 894 | int i;
|
---|
| 895 | fprintf(out, "---- ");
|
---|
| 896 | for(i=0; i<p->nOp; i++){
|
---|
| 897 | fprintf(out, "%02x", p->aOp[i].opcode);
|
---|
| 898 | }
|
---|
| 899 | fprintf(out, "\n");
|
---|
| 900 | for(i=0; i<p->nOp; i++){
|
---|
| 901 | fprintf(out, "%6d %10lld %8lld ",
|
---|
| 902 | p->aOp[i].cnt,
|
---|
| 903 | p->aOp[i].cycles,
|
---|
| 904 | p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0
|
---|
| 905 | );
|
---|
| 906 | sqliteVdbePrintOp(out, i, &p->aOp[i]);
|
---|
| 907 | }
|
---|
| 908 | fclose(out);
|
---|
| 909 | }
|
---|
| 910 | }
|
---|
| 911 | #endif
|
---|
| 912 | p->magic = VDBE_MAGIC_INIT;
|
---|
| 913 | return p->rc;
|
---|
| 914 | }
|
---|
| 915 |
|
---|
| 916 | /*
|
---|
| 917 | ** Clean up and delete a VDBE after execution. Return an integer which is
|
---|
| 918 | ** the result code. Write any error message text into *pzErrMsg.
|
---|
| 919 | */
|
---|
| 920 | int sqliteVdbeFinalize(Vdbe *p, char **pzErrMsg){
|
---|
| 921 | int rc;
|
---|
| 922 | sqlite *db;
|
---|
| 923 |
|
---|
| 924 | if( p->magic!=VDBE_MAGIC_RUN && p->magic!=VDBE_MAGIC_HALT ){
|
---|
| 925 | sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), (char*)0);
|
---|
| 926 | return SQLITE_MISUSE;
|
---|
| 927 | }
|
---|
| 928 | db = p->db;
|
---|
| 929 | rc = sqliteVdbeReset(p, pzErrMsg);
|
---|
| 930 | sqliteVdbeDelete(p);
|
---|
| 931 | if( db->want_to_close && db->pVdbe==0 ){
|
---|
| 932 | sqlite_close(db);
|
---|
| 933 | }
|
---|
| 934 | if( rc==SQLITE_SCHEMA ){
|
---|
| 935 | sqliteResetInternalSchema(db, 0);
|
---|
| 936 | }
|
---|
| 937 | return rc;
|
---|
| 938 | }
|
---|
| 939 |
|
---|
| 940 | /*
|
---|
| 941 | ** Set the values of all variables. Variable $1 in the original SQL will
|
---|
| 942 | ** be the string azValue[0]. $2 will have the value azValue[1]. And
|
---|
| 943 | ** so forth. If a value is out of range (for example $3 when nValue==2)
|
---|
| 944 | ** then its value will be NULL.
|
---|
| 945 | **
|
---|
| 946 | ** This routine overrides any prior call.
|
---|
| 947 | */
|
---|
| 948 | int sqlite_bind(sqlite_vm *pVm, int i, const char *zVal, int len, int copy){
|
---|
| 949 | Vdbe *p = (Vdbe*)pVm;
|
---|
| 950 | if( p->magic!=VDBE_MAGIC_RUN || p->pc!=0 ){
|
---|
| 951 | return SQLITE_MISUSE;
|
---|
| 952 | }
|
---|
| 953 | if( i<1 || i>p->nVar ){
|
---|
| 954 | return SQLITE_RANGE;
|
---|
| 955 | }
|
---|
| 956 | i--;
|
---|
| 957 | if( p->abVar[i] ){
|
---|
| 958 | sqliteFree(p->azVar[i]);
|
---|
| 959 | }
|
---|
| 960 | if( zVal==0 ){
|
---|
| 961 | copy = 0;
|
---|
| 962 | len = 0;
|
---|
| 963 | }
|
---|
| 964 | if( len<0 ){
|
---|
| 965 | len = strlen(zVal)+1;
|
---|
| 966 | }
|
---|
| 967 | if( copy ){
|
---|
| 968 | p->azVar[i] = sqliteMalloc( len );
|
---|
| 969 | if( p->azVar[i] ) memcpy(p->azVar[i], zVal, len);
|
---|
| 970 | }else{
|
---|
| 971 | p->azVar[i] = (char*)zVal;
|
---|
| 972 | }
|
---|
| 973 | p->abVar[i] = copy;
|
---|
| 974 | p->anVar[i] = len;
|
---|
| 975 | return SQLITE_OK;
|
---|
| 976 | }
|
---|
| 977 |
|
---|
| 978 |
|
---|
| 979 | /*
|
---|
| 980 | ** Delete an entire VDBE.
|
---|
| 981 | */
|
---|
| 982 | void sqliteVdbeDelete(Vdbe *p){
|
---|
| 983 | int i;
|
---|
| 984 | if( p==0 ) return;
|
---|
| 985 | Cleanup(p);
|
---|
| 986 | if( p->pPrev ){
|
---|
| 987 | p->pPrev->pNext = p->pNext;
|
---|
| 988 | }else{
|
---|
| 989 | assert( p->db->pVdbe==p );
|
---|
| 990 | p->db->pVdbe = p->pNext;
|
---|
| 991 | }
|
---|
| 992 | if( p->pNext ){
|
---|
| 993 | p->pNext->pPrev = p->pPrev;
|
---|
| 994 | }
|
---|
| 995 | p->pPrev = p->pNext = 0;
|
---|
| 996 | if( p->nOpAlloc==0 ){
|
---|
| 997 | p->aOp = 0;
|
---|
| 998 | p->nOp = 0;
|
---|
| 999 | }
|
---|
| 1000 | for(i=0; i<p->nOp; i++){
|
---|
| 1001 | if( p->aOp[i].p3type==P3_DYNAMIC ){
|
---|
| 1002 | sqliteFree(p->aOp[i].p3);
|
---|
| 1003 | }
|
---|
| 1004 | }
|
---|
| 1005 | for(i=0; i<p->nVar; i++){
|
---|
| 1006 | if( p->abVar[i] ) sqliteFree(p->azVar[i]);
|
---|
| 1007 | }
|
---|
| 1008 | sqliteFree(p->aOp);
|
---|
| 1009 | sqliteFree(p->aLabel);
|
---|
| 1010 | sqliteFree(p->aStack);
|
---|
| 1011 | p->magic = VDBE_MAGIC_DEAD;
|
---|
| 1012 | sqliteFree(p);
|
---|
| 1013 | }
|
---|
| 1014 |
|
---|
| 1015 | /*
|
---|
| 1016 | ** Convert an integer in between the native integer format and
|
---|
| 1017 | ** the bigEndian format used as the record number for tables.
|
---|
| 1018 | **
|
---|
| 1019 | ** The bigEndian format (most significant byte first) is used for
|
---|
| 1020 | ** record numbers so that records will sort into the correct order
|
---|
| 1021 | ** even though memcmp() is used to compare the keys. On machines
|
---|
| 1022 | ** whose native integer format is little endian (ex: i486) the
|
---|
| 1023 | ** order of bytes is reversed. On native big-endian machines
|
---|
| 1024 | ** (ex: Alpha, Sparc, Motorola) the byte order is the same.
|
---|
| 1025 | **
|
---|
| 1026 | ** This function is its own inverse. In other words
|
---|
| 1027 | **
|
---|
| 1028 | ** X == byteSwap(byteSwap(X))
|
---|
| 1029 | */
|
---|
| 1030 | int sqliteVdbeByteSwap(int x){
|
---|
| 1031 | union {
|
---|
| 1032 | char zBuf[sizeof(int)];
|
---|
| 1033 | int i;
|
---|
| 1034 | } ux;
|
---|
| 1035 | ux.zBuf[3] = x&0xff;
|
---|
| 1036 | ux.zBuf[2] = (x>>8)&0xff;
|
---|
| 1037 | ux.zBuf[1] = (x>>16)&0xff;
|
---|
| 1038 | ux.zBuf[0] = (x>>24)&0xff;
|
---|
| 1039 | return ux.i;
|
---|
| 1040 | }
|
---|
| 1041 |
|
---|
| 1042 | /*
|
---|
| 1043 | ** If a MoveTo operation is pending on the given cursor, then do that
|
---|
| 1044 | ** MoveTo now. Return an error code. If no MoveTo is pending, this
|
---|
| 1045 | ** routine does nothing and returns SQLITE_OK.
|
---|
| 1046 | */
|
---|
| 1047 | int sqliteVdbeCursorMoveto(Cursor *p){
|
---|
| 1048 | if( p->deferredMoveto ){
|
---|
| 1049 | int res;
|
---|
| 1050 | extern int sqlite_search_count;
|
---|
| 1051 | sqliteBtreeMoveto(p->pCursor, (char*)&p->movetoTarget, sizeof(int), &res);
|
---|
| 1052 | p->lastRecno = keyToInt(p->movetoTarget);
|
---|
| 1053 | p->recnoIsValid = res==0;
|
---|
| 1054 | if( res<0 ){
|
---|
| 1055 | sqliteBtreeNext(p->pCursor, &res);
|
---|
| 1056 | }
|
---|
| 1057 | sqlite_search_count++;
|
---|
| 1058 | p->deferredMoveto = 0;
|
---|
| 1059 | }
|
---|
| 1060 | return SQLITE_OK;
|
---|
| 1061 | }
|
---|