1 | /*
|
---|
2 | ** 2001 September 15
|
---|
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 | ** The code in this file implements execution method of the
|
---|
13 | ** Virtual Database Engine (VDBE). A separate file ("vdbeaux.c")
|
---|
14 | ** handles housekeeping details such as creating and deleting
|
---|
15 | ** VDBE instances. This file is solely interested in executing
|
---|
16 | ** the VDBE program.
|
---|
17 | **
|
---|
18 | ** In the external interface, an "sqlite_vm*" is an opaque pointer
|
---|
19 | ** to a VDBE.
|
---|
20 | **
|
---|
21 | ** The SQL parser generates a program which is then executed by
|
---|
22 | ** the VDBE to do the work of the SQL statement. VDBE programs are
|
---|
23 | ** similar in form to assembly language. The program consists of
|
---|
24 | ** a linear sequence of operations. Each operation has an opcode
|
---|
25 | ** and 3 operands. Operands P1 and P2 are integers. Operand P3
|
---|
26 | ** is a null-terminated string. The P2 operand must be non-negative.
|
---|
27 | ** Opcodes will typically ignore one or more operands. Many opcodes
|
---|
28 | ** ignore all three operands.
|
---|
29 | **
|
---|
30 | ** Computation results are stored on a stack. Each entry on the
|
---|
31 | ** stack is either an integer, a null-terminated string, a floating point
|
---|
32 | ** number, or the SQL "NULL" value. An inplicit conversion from one
|
---|
33 | ** type to the other occurs as necessary.
|
---|
34 | **
|
---|
35 | ** Most of the code in this file is taken up by the sqliteVdbeExec()
|
---|
36 | ** function which does the work of interpreting a VDBE program.
|
---|
37 | ** But other routines are also provided to help in building up
|
---|
38 | ** a program instruction by instruction.
|
---|
39 | **
|
---|
40 | ** Various scripts scan this source file in order to generate HTML
|
---|
41 | ** documentation, headers files, or other derived files. The formatting
|
---|
42 | ** of the code in this file is, therefore, important. See other comments
|
---|
43 | ** in this file for details. If in doubt, do not deviate from existing
|
---|
44 | ** commenting and indentation practices when changing or adding code.
|
---|
45 | **
|
---|
46 | ** $Id: vdbe.c,v 1.268.2.4 2004/10/01 15:11:13 drh Exp $
|
---|
47 | */
|
---|
48 | #include "sqliteInt.h"
|
---|
49 | #include "os.h"
|
---|
50 | #include <ctype.h>
|
---|
51 | #include "vdbeInt.h"
|
---|
52 |
|
---|
53 | /*
|
---|
54 | ** The following global variable is incremented every time a cursor
|
---|
55 | ** moves, either by the OP_MoveTo or the OP_Next opcode. The test
|
---|
56 | ** procedures use this information to make sure that indices are
|
---|
57 | ** working correctly. This variable has no function other than to
|
---|
58 | ** help verify the correct operation of the library.
|
---|
59 | */
|
---|
60 | int sqlite_search_count = 0;
|
---|
61 |
|
---|
62 | /*
|
---|
63 | ** When this global variable is positive, it gets decremented once before
|
---|
64 | ** each instruction in the VDBE. When reaches zero, the SQLITE_Interrupt
|
---|
65 | ** of the db.flags field is set in order to simulate an interrupt.
|
---|
66 | **
|
---|
67 | ** This facility is used for testing purposes only. It does not function
|
---|
68 | ** in an ordinary build.
|
---|
69 | */
|
---|
70 | int sqlite_interrupt_count = 0;
|
---|
71 |
|
---|
72 | /*
|
---|
73 | ** Advance the virtual machine to the next output row.
|
---|
74 | **
|
---|
75 | ** The return vale will be either SQLITE_BUSY, SQLITE_DONE,
|
---|
76 | ** SQLITE_ROW, SQLITE_ERROR, or SQLITE_MISUSE.
|
---|
77 | **
|
---|
78 | ** SQLITE_BUSY means that the virtual machine attempted to open
|
---|
79 | ** a locked database and there is no busy callback registered.
|
---|
80 | ** Call sqlite_step() again to retry the open. *pN is set to 0
|
---|
81 | ** and *pazColName and *pazValue are both set to NULL.
|
---|
82 | **
|
---|
83 | ** SQLITE_DONE means that the virtual machine has finished
|
---|
84 | ** executing. sqlite_step() should not be called again on this
|
---|
85 | ** virtual machine. *pN and *pazColName are set appropriately
|
---|
86 | ** but *pazValue is set to NULL.
|
---|
87 | **
|
---|
88 | ** SQLITE_ROW means that the virtual machine has generated another
|
---|
89 | ** row of the result set. *pN is set to the number of columns in
|
---|
90 | ** the row. *pazColName is set to the names of the columns followed
|
---|
91 | ** by the column datatypes. *pazValue is set to the values of each
|
---|
92 | ** column in the row. The value of the i-th column is (*pazValue)[i].
|
---|
93 | ** The name of the i-th column is (*pazColName)[i] and the datatype
|
---|
94 | ** of the i-th column is (*pazColName)[i+*pN].
|
---|
95 | **
|
---|
96 | ** SQLITE_ERROR means that a run-time error (such as a constraint
|
---|
97 | ** violation) has occurred. The details of the error will be returned
|
---|
98 | ** by the next call to sqlite_finalize(). sqlite_step() should not
|
---|
99 | ** be called again on the VM.
|
---|
100 | **
|
---|
101 | ** SQLITE_MISUSE means that the this routine was called inappropriately.
|
---|
102 | ** Perhaps it was called on a virtual machine that had already been
|
---|
103 | ** finalized or on one that had previously returned SQLITE_ERROR or
|
---|
104 | ** SQLITE_DONE. Or it could be the case the the same database connection
|
---|
105 | ** is being used simulataneously by two or more threads.
|
---|
106 | */
|
---|
107 | int sqlite_step(
|
---|
108 | sqlite_vm *pVm, /* The virtual machine to execute */
|
---|
109 | int *pN, /* OUT: Number of columns in result */
|
---|
110 | const char ***pazValue, /* OUT: Column data */
|
---|
111 | const char ***pazColName /* OUT: Column names and datatypes */
|
---|
112 | ){
|
---|
113 | Vdbe *p = (Vdbe*)pVm;
|
---|
114 | sqlite *db;
|
---|
115 | int rc;
|
---|
116 |
|
---|
117 | if( p->magic!=VDBE_MAGIC_RUN ){
|
---|
118 | return SQLITE_MISUSE;
|
---|
119 | }
|
---|
120 | db = p->db;
|
---|
121 | if( sqliteSafetyOn(db) ){
|
---|
122 | p->rc = SQLITE_MISUSE;
|
---|
123 | return SQLITE_MISUSE;
|
---|
124 | }
|
---|
125 | if( p->explain ){
|
---|
126 | rc = sqliteVdbeList(p);
|
---|
127 | }else{
|
---|
128 | rc = sqliteVdbeExec(p);
|
---|
129 | }
|
---|
130 | if( rc==SQLITE_DONE || rc==SQLITE_ROW ){
|
---|
131 | if( pazColName ) *pazColName = (const char**)p->azColName;
|
---|
132 | if( pN ) *pN = p->nResColumn;
|
---|
133 | }else{
|
---|
134 | if( pazColName) *pazColName = 0;
|
---|
135 | if( pN ) *pN = 0;
|
---|
136 | }
|
---|
137 | if( pazValue ){
|
---|
138 | if( rc==SQLITE_ROW ){
|
---|
139 | *pazValue = (const char**)p->azResColumn;
|
---|
140 | }else{
|
---|
141 | *pazValue = 0;
|
---|
142 | }
|
---|
143 | }
|
---|
144 | if( sqliteSafetyOff(db) ){
|
---|
145 | return SQLITE_MISUSE;
|
---|
146 | }
|
---|
147 | return rc;
|
---|
148 | }
|
---|
149 |
|
---|
150 | /*
|
---|
151 | ** Insert a new aggregate element and make it the element that
|
---|
152 | ** has focus.
|
---|
153 | **
|
---|
154 | ** Return 0 on success and 1 if memory is exhausted.
|
---|
155 | */
|
---|
156 | static int AggInsert(Agg *p, char *zKey, int nKey){
|
---|
157 | AggElem *pElem, *pOld;
|
---|
158 | int i;
|
---|
159 | Mem *pMem;
|
---|
160 | pElem = sqliteMalloc( sizeof(AggElem) + nKey +
|
---|
161 | (p->nMem-1)*sizeof(pElem->aMem[0]) );
|
---|
162 | if( pElem==0 ) return 1;
|
---|
163 | pElem->zKey = (char*)&pElem->aMem[p->nMem];
|
---|
164 | memcpy(pElem->zKey, zKey, nKey);
|
---|
165 | pElem->nKey = nKey;
|
---|
166 | pOld = sqliteHashInsert(&p->hash, pElem->zKey, pElem->nKey, pElem);
|
---|
167 | if( pOld!=0 ){
|
---|
168 | assert( pOld==pElem ); /* Malloc failed on insert */
|
---|
169 | sqliteFree(pOld);
|
---|
170 | return 0;
|
---|
171 | }
|
---|
172 | for(i=0, pMem=pElem->aMem; i<p->nMem; i++, pMem++){
|
---|
173 | pMem->flags = MEM_Null;
|
---|
174 | }
|
---|
175 | p->pCurrent = pElem;
|
---|
176 | return 0;
|
---|
177 | }
|
---|
178 |
|
---|
179 | /*
|
---|
180 | ** Get the AggElem currently in focus
|
---|
181 | */
|
---|
182 | #define AggInFocus(P) ((P).pCurrent ? (P).pCurrent : _AggInFocus(&(P)))
|
---|
183 | static AggElem *_AggInFocus(Agg *p){
|
---|
184 | HashElem *pElem = sqliteHashFirst(&p->hash);
|
---|
185 | if( pElem==0 ){
|
---|
186 | AggInsert(p,"",1);
|
---|
187 | pElem = sqliteHashFirst(&p->hash);
|
---|
188 | }
|
---|
189 | return pElem ? sqliteHashData(pElem) : 0;
|
---|
190 | }
|
---|
191 |
|
---|
192 | /*
|
---|
193 | ** Convert the given stack entity into a string if it isn't one
|
---|
194 | ** already.
|
---|
195 | */
|
---|
196 | #define Stringify(P) if(((P)->flags & MEM_Str)==0){hardStringify(P);}
|
---|
197 | static int hardStringify(Mem *pStack){
|
---|
198 | int fg = pStack->flags;
|
---|
199 | if( fg & MEM_Real ){
|
---|
200 | sqlite_snprintf(sizeof(pStack->zShort),pStack->zShort,"%.15g",pStack->r);
|
---|
201 | }else if( fg & MEM_Int ){
|
---|
202 | sqlite_snprintf(sizeof(pStack->zShort),pStack->zShort,"%d",pStack->i);
|
---|
203 | }else{
|
---|
204 | pStack->zShort[0] = 0;
|
---|
205 | }
|
---|
206 | pStack->z = pStack->zShort;
|
---|
207 | pStack->n = strlen(pStack->zShort)+1;
|
---|
208 | pStack->flags = MEM_Str | MEM_Short;
|
---|
209 | return 0;
|
---|
210 | }
|
---|
211 |
|
---|
212 | /*
|
---|
213 | ** Convert the given stack entity into a string that has been obtained
|
---|
214 | ** from sqliteMalloc(). This is different from Stringify() above in that
|
---|
215 | ** Stringify() will use the NBFS bytes of static string space if the string
|
---|
216 | ** will fit but this routine always mallocs for space.
|
---|
217 | ** Return non-zero if we run out of memory.
|
---|
218 | */
|
---|
219 | #define Dynamicify(P) (((P)->flags & MEM_Dyn)==0 ? hardDynamicify(P):0)
|
---|
220 | static int hardDynamicify(Mem *pStack){
|
---|
221 | int fg = pStack->flags;
|
---|
222 | char *z;
|
---|
223 | if( (fg & MEM_Str)==0 ){
|
---|
224 | hardStringify(pStack);
|
---|
225 | }
|
---|
226 | assert( (fg & MEM_Dyn)==0 );
|
---|
227 | z = sqliteMallocRaw( pStack->n );
|
---|
228 | if( z==0 ) return 1;
|
---|
229 | memcpy(z, pStack->z, pStack->n);
|
---|
230 | pStack->z = z;
|
---|
231 | pStack->flags |= MEM_Dyn;
|
---|
232 | return 0;
|
---|
233 | }
|
---|
234 |
|
---|
235 | /*
|
---|
236 | ** An ephemeral string value (signified by the MEM_Ephem flag) contains
|
---|
237 | ** a pointer to a dynamically allocated string where some other entity
|
---|
238 | ** is responsible for deallocating that string. Because the stack entry
|
---|
239 | ** does not control the string, it might be deleted without the stack
|
---|
240 | ** entry knowing it.
|
---|
241 | **
|
---|
242 | ** This routine converts an ephemeral string into a dynamically allocated
|
---|
243 | ** string that the stack entry itself controls. In other words, it
|
---|
244 | ** converts an MEM_Ephem string into an MEM_Dyn string.
|
---|
245 | */
|
---|
246 | #define Deephemeralize(P) \
|
---|
247 | if( ((P)->flags&MEM_Ephem)!=0 && hardDeephem(P) ){ goto no_mem;}
|
---|
248 | static int hardDeephem(Mem *pStack){
|
---|
249 | char *z;
|
---|
250 | assert( (pStack->flags & MEM_Ephem)!=0 );
|
---|
251 | z = sqliteMallocRaw( pStack->n );
|
---|
252 | if( z==0 ) return 1;
|
---|
253 | memcpy(z, pStack->z, pStack->n);
|
---|
254 | pStack->z = z;
|
---|
255 | pStack->flags &= ~MEM_Ephem;
|
---|
256 | pStack->flags |= MEM_Dyn;
|
---|
257 | return 0;
|
---|
258 | }
|
---|
259 |
|
---|
260 | /*
|
---|
261 | ** Release the memory associated with the given stack level. This
|
---|
262 | ** leaves the Mem.flags field in an inconsistent state.
|
---|
263 | */
|
---|
264 | #define Release(P) if((P)->flags&MEM_Dyn){ sqliteFree((P)->z); }
|
---|
265 |
|
---|
266 | /*
|
---|
267 | ** Pop the stack N times.
|
---|
268 | */
|
---|
269 | static void popStack(Mem **ppTos, int N){
|
---|
270 | Mem *pTos = *ppTos;
|
---|
271 | while( N>0 ){
|
---|
272 | N--;
|
---|
273 | Release(pTos);
|
---|
274 | pTos--;
|
---|
275 | }
|
---|
276 | *ppTos = pTos;
|
---|
277 | }
|
---|
278 |
|
---|
279 | /*
|
---|
280 | ** Return TRUE if zNum is a 32-bit signed integer and write
|
---|
281 | ** the value of the integer into *pNum. If zNum is not an integer
|
---|
282 | ** or is an integer that is too large to be expressed with just 32
|
---|
283 | ** bits, then return false.
|
---|
284 | **
|
---|
285 | ** Under Linux (RedHat 7.2) this routine is much faster than atoi()
|
---|
286 | ** for converting strings into integers.
|
---|
287 | */
|
---|
288 | static int toInt(const char *zNum, int *pNum){
|
---|
289 | int v = 0;
|
---|
290 | int neg;
|
---|
291 | int i, c;
|
---|
292 | if( *zNum=='-' ){
|
---|
293 | neg = 1;
|
---|
294 | zNum++;
|
---|
295 | }else if( *zNum=='+' ){
|
---|
296 | neg = 0;
|
---|
297 | zNum++;
|
---|
298 | }else{
|
---|
299 | neg = 0;
|
---|
300 | }
|
---|
301 | for(i=0; (c=zNum[i])>='0' && c<='9'; i++){
|
---|
302 | v = v*10 + c - '0';
|
---|
303 | }
|
---|
304 | *pNum = neg ? -v : v;
|
---|
305 | return c==0 && i>0 && (i<10 || (i==10 && memcmp(zNum,"2147483647",10)<=0));
|
---|
306 | }
|
---|
307 |
|
---|
308 | /*
|
---|
309 | ** Convert the given stack entity into a integer if it isn't one
|
---|
310 | ** already.
|
---|
311 | **
|
---|
312 | ** Any prior string or real representation is invalidated.
|
---|
313 | ** NULLs are converted into 0.
|
---|
314 | */
|
---|
315 | #define Integerify(P) if(((P)->flags&MEM_Int)==0){ hardIntegerify(P); }
|
---|
316 | static void hardIntegerify(Mem *pStack){
|
---|
317 | if( pStack->flags & MEM_Real ){
|
---|
318 | pStack->i = (int)pStack->r;
|
---|
319 | Release(pStack);
|
---|
320 | }else if( pStack->flags & MEM_Str ){
|
---|
321 | toInt(pStack->z, &pStack->i);
|
---|
322 | Release(pStack);
|
---|
323 | }else{
|
---|
324 | pStack->i = 0;
|
---|
325 | }
|
---|
326 | pStack->flags = MEM_Int;
|
---|
327 | }
|
---|
328 |
|
---|
329 | /*
|
---|
330 | ** Get a valid Real representation for the given stack element.
|
---|
331 | **
|
---|
332 | ** Any prior string or integer representation is retained.
|
---|
333 | ** NULLs are converted into 0.0.
|
---|
334 | */
|
---|
335 | #define Realify(P) if(((P)->flags&MEM_Real)==0){ hardRealify(P); }
|
---|
336 | static void hardRealify(Mem *pStack){
|
---|
337 | if( pStack->flags & MEM_Str ){
|
---|
338 | pStack->r = sqliteAtoF(pStack->z, 0);
|
---|
339 | }else if( pStack->flags & MEM_Int ){
|
---|
340 | pStack->r = pStack->i;
|
---|
341 | }else{
|
---|
342 | pStack->r = 0.0;
|
---|
343 | }
|
---|
344 | pStack->flags |= MEM_Real;
|
---|
345 | }
|
---|
346 |
|
---|
347 | /*
|
---|
348 | ** The parameters are pointers to the head of two sorted lists
|
---|
349 | ** of Sorter structures. Merge these two lists together and return
|
---|
350 | ** a single sorted list. This routine forms the core of the merge-sort
|
---|
351 | ** algorithm.
|
---|
352 | **
|
---|
353 | ** In the case of a tie, left sorts in front of right.
|
---|
354 | */
|
---|
355 | static Sorter *Merge(Sorter *pLeft, Sorter *pRight){
|
---|
356 | Sorter sHead;
|
---|
357 | Sorter *pTail;
|
---|
358 | pTail = &sHead;
|
---|
359 | pTail->pNext = 0;
|
---|
360 | while( pLeft && pRight ){
|
---|
361 | int c = sqliteSortCompare(pLeft->zKey, pRight->zKey);
|
---|
362 | if( c<=0 ){
|
---|
363 | pTail->pNext = pLeft;
|
---|
364 | pLeft = pLeft->pNext;
|
---|
365 | }else{
|
---|
366 | pTail->pNext = pRight;
|
---|
367 | pRight = pRight->pNext;
|
---|
368 | }
|
---|
369 | pTail = pTail->pNext;
|
---|
370 | }
|
---|
371 | if( pLeft ){
|
---|
372 | pTail->pNext = pLeft;
|
---|
373 | }else if( pRight ){
|
---|
374 | pTail->pNext = pRight;
|
---|
375 | }
|
---|
376 | return sHead.pNext;
|
---|
377 | }
|
---|
378 |
|
---|
379 | /*
|
---|
380 | ** The following routine works like a replacement for the standard
|
---|
381 | ** library routine fgets(). The difference is in how end-of-line (EOL)
|
---|
382 | ** is handled. Standard fgets() uses LF for EOL under unix, CRLF
|
---|
383 | ** under windows, and CR under mac. This routine accepts any of these
|
---|
384 | ** character sequences as an EOL mark. The EOL mark is replaced by
|
---|
385 | ** a single LF character in zBuf.
|
---|
386 | */
|
---|
387 | static char *vdbe_fgets(char *zBuf, int nBuf, FILE *in){
|
---|
388 | int i, c;
|
---|
389 | for(i=0; i<nBuf-1 && (c=getc(in))!=EOF; i++){
|
---|
390 | zBuf[i] = c;
|
---|
391 | if( c=='\r' || c=='\n' ){
|
---|
392 | if( c=='\r' ){
|
---|
393 | zBuf[i] = '\n';
|
---|
394 | c = getc(in);
|
---|
395 | if( c!=EOF && c!='\n' ) ungetc(c, in);
|
---|
396 | }
|
---|
397 | i++;
|
---|
398 | break;
|
---|
399 | }
|
---|
400 | }
|
---|
401 | zBuf[i] = 0;
|
---|
402 | return i>0 ? zBuf : 0;
|
---|
403 | }
|
---|
404 |
|
---|
405 | /*
|
---|
406 | ** Make sure there is space in the Vdbe structure to hold at least
|
---|
407 | ** mxCursor cursors. If there is not currently enough space, then
|
---|
408 | ** allocate more.
|
---|
409 | **
|
---|
410 | ** If a memory allocation error occurs, return 1. Return 0 if
|
---|
411 | ** everything works.
|
---|
412 | */
|
---|
413 | static int expandCursorArraySize(Vdbe *p, int mxCursor){
|
---|
414 | if( mxCursor>=p->nCursor ){
|
---|
415 | Cursor *aCsr = sqliteRealloc( p->aCsr, (mxCursor+1)*sizeof(Cursor) );
|
---|
416 | if( aCsr==0 ) return 1;
|
---|
417 | p->aCsr = aCsr;
|
---|
418 | memset(&p->aCsr[p->nCursor], 0, sizeof(Cursor)*(mxCursor+1-p->nCursor));
|
---|
419 | p->nCursor = mxCursor+1;
|
---|
420 | }
|
---|
421 | return 0;
|
---|
422 | }
|
---|
423 |
|
---|
424 | #ifdef VDBE_PROFILE
|
---|
425 | /*
|
---|
426 | ** The following routine only works on pentium-class processors.
|
---|
427 | ** It uses the RDTSC opcode to read cycle count value out of the
|
---|
428 | ** processor and returns that value. This can be used for high-res
|
---|
429 | ** profiling.
|
---|
430 | */
|
---|
431 | __inline__ unsigned long long int hwtime(void){
|
---|
432 | unsigned long long int x;
|
---|
433 | __asm__("rdtsc\n\t"
|
---|
434 | "mov %%edx, %%ecx\n\t"
|
---|
435 | :"=A" (x));
|
---|
436 | return x;
|
---|
437 | }
|
---|
438 | #endif
|
---|
439 |
|
---|
440 | /*
|
---|
441 | ** The CHECK_FOR_INTERRUPT macro defined here looks to see if the
|
---|
442 | ** sqlite_interrupt() routine has been called. If it has been, then
|
---|
443 | ** processing of the VDBE program is interrupted.
|
---|
444 | **
|
---|
445 | ** This macro added to every instruction that does a jump in order to
|
---|
446 | ** implement a loop. This test used to be on every single instruction,
|
---|
447 | ** but that meant we more testing that we needed. By only testing the
|
---|
448 | ** flag on jump instructions, we get a (small) speed improvement.
|
---|
449 | */
|
---|
450 | #define CHECK_FOR_INTERRUPT \
|
---|
451 | if( db->flags & SQLITE_Interrupt ) goto abort_due_to_interrupt;
|
---|
452 |
|
---|
453 |
|
---|
454 | /*
|
---|
455 | ** Execute as much of a VDBE program as we can then return.
|
---|
456 | **
|
---|
457 | ** sqliteVdbeMakeReady() must be called before this routine in order to
|
---|
458 | ** close the program with a final OP_Halt and to set up the callbacks
|
---|
459 | ** and the error message pointer.
|
---|
460 | **
|
---|
461 | ** Whenever a row or result data is available, this routine will either
|
---|
462 | ** invoke the result callback (if there is one) or return with
|
---|
463 | ** SQLITE_ROW.
|
---|
464 | **
|
---|
465 | ** If an attempt is made to open a locked database, then this routine
|
---|
466 | ** will either invoke the busy callback (if there is one) or it will
|
---|
467 | ** return SQLITE_BUSY.
|
---|
468 | **
|
---|
469 | ** If an error occurs, an error message is written to memory obtained
|
---|
470 | ** from sqliteMalloc() and p->zErrMsg is made to point to that memory.
|
---|
471 | ** The error code is stored in p->rc and this routine returns SQLITE_ERROR.
|
---|
472 | **
|
---|
473 | ** If the callback ever returns non-zero, then the program exits
|
---|
474 | ** immediately. There will be no error message but the p->rc field is
|
---|
475 | ** set to SQLITE_ABORT and this routine will return SQLITE_ERROR.
|
---|
476 | **
|
---|
477 | ** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this
|
---|
478 | ** routine to return SQLITE_ERROR.
|
---|
479 | **
|
---|
480 | ** Other fatal errors return SQLITE_ERROR.
|
---|
481 | **
|
---|
482 | ** After this routine has finished, sqliteVdbeFinalize() should be
|
---|
483 | ** used to clean up the mess that was left behind.
|
---|
484 | */
|
---|
485 | int sqliteVdbeExec(
|
---|
486 | Vdbe *p /* The VDBE */
|
---|
487 | ){
|
---|
488 | int pc; /* The program counter */
|
---|
489 | Op *pOp; /* Current operation */
|
---|
490 | int rc = SQLITE_OK; /* Value to return */
|
---|
491 | sqlite *db = p->db; /* The database */
|
---|
492 | Mem *pTos; /* Top entry in the operand stack */
|
---|
493 | char zBuf[100]; /* Space to sprintf() an integer */
|
---|
494 | #ifdef VDBE_PROFILE
|
---|
495 | unsigned long long start; /* CPU clock count at start of opcode */
|
---|
496 | int origPc; /* Program counter at start of opcode */
|
---|
497 | #endif
|
---|
498 | #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
|
---|
499 | int nProgressOps = 0; /* Opcodes executed since progress callback. */
|
---|
500 | #endif
|
---|
501 |
|
---|
502 | if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE;
|
---|
503 | assert( db->magic==SQLITE_MAGIC_BUSY );
|
---|
504 | assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
|
---|
505 | p->rc = SQLITE_OK;
|
---|
506 | assert( p->explain==0 );
|
---|
507 | if( sqlite_malloc_failed ) goto no_mem;
|
---|
508 | pTos = p->pTos;
|
---|
509 | if( p->popStack ){
|
---|
510 | popStack(&pTos, p->popStack);
|
---|
511 | p->popStack = 0;
|
---|
512 | }
|
---|
513 | CHECK_FOR_INTERRUPT;
|
---|
514 | for(pc=p->pc; rc==SQLITE_OK; pc++){
|
---|
515 | assert( pc>=0 && pc<p->nOp );
|
---|
516 | assert( pTos<=&p->aStack[pc] );
|
---|
517 | #ifdef VDBE_PROFILE
|
---|
518 | origPc = pc;
|
---|
519 | start = hwtime();
|
---|
520 | #endif
|
---|
521 | pOp = &p->aOp[pc];
|
---|
522 |
|
---|
523 | /* Only allow tracing if NDEBUG is not defined.
|
---|
524 | */
|
---|
525 | #ifndef NDEBUG
|
---|
526 | if( p->trace ){
|
---|
527 | sqliteVdbePrintOp(p->trace, pc, pOp);
|
---|
528 | }
|
---|
529 | #endif
|
---|
530 |
|
---|
531 | /* Check to see if we need to simulate an interrupt. This only happens
|
---|
532 | ** if we have a special test build.
|
---|
533 | */
|
---|
534 | #ifdef SQLITE_TEST
|
---|
535 | if( sqlite_interrupt_count>0 ){
|
---|
536 | sqlite_interrupt_count--;
|
---|
537 | if( sqlite_interrupt_count==0 ){
|
---|
538 | sqlite_interrupt(db);
|
---|
539 | }
|
---|
540 | }
|
---|
541 | #endif
|
---|
542 |
|
---|
543 | #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
|
---|
544 | /* Call the progress callback if it is configured and the required number
|
---|
545 | ** of VDBE ops have been executed (either since this invocation of
|
---|
546 | ** sqliteVdbeExec() or since last time the progress callback was called).
|
---|
547 | ** If the progress callback returns non-zero, exit the virtual machine with
|
---|
548 | ** a return code SQLITE_ABORT.
|
---|
549 | */
|
---|
550 | if( db->xProgress ){
|
---|
551 | if( db->nProgressOps==nProgressOps ){
|
---|
552 | if( db->xProgress(db->pProgressArg)!=0 ){
|
---|
553 | rc = SQLITE_ABORT;
|
---|
554 | continue; /* skip to the next iteration of the for loop */
|
---|
555 | }
|
---|
556 | nProgressOps = 0;
|
---|
557 | }
|
---|
558 | nProgressOps++;
|
---|
559 | }
|
---|
560 | #endif
|
---|
561 |
|
---|
562 | switch( pOp->opcode ){
|
---|
563 |
|
---|
564 | /*****************************************************************************
|
---|
565 | ** What follows is a massive switch statement where each case implements a
|
---|
566 | ** separate instruction in the virtual machine. If we follow the usual
|
---|
567 | ** indentation conventions, each case should be indented by 6 spaces. But
|
---|
568 | ** that is a lot of wasted space on the left margin. So the code within
|
---|
569 | ** the switch statement will break with convention and be flush-left. Another
|
---|
570 | ** big comment (similar to this one) will mark the point in the code where
|
---|
571 | ** we transition back to normal indentation.
|
---|
572 | **
|
---|
573 | ** The formatting of each case is important. The makefile for SQLite
|
---|
574 | ** generates two C files "opcodes.h" and "opcodes.c" by scanning this
|
---|
575 | ** file looking for lines that begin with "case OP_". The opcodes.h files
|
---|
576 | ** will be filled with #defines that give unique integer values to each
|
---|
577 | ** opcode and the opcodes.c file is filled with an array of strings where
|
---|
578 | ** each string is the symbolic name for the corresponding opcode.
|
---|
579 | **
|
---|
580 | ** Documentation about VDBE opcodes is generated by scanning this file
|
---|
581 | ** for lines of that contain "Opcode:". That line and all subsequent
|
---|
582 | ** comment lines are used in the generation of the opcode.html documentation
|
---|
583 | ** file.
|
---|
584 | **
|
---|
585 | ** SUMMARY:
|
---|
586 | **
|
---|
587 | ** Formatting is important to scripts that scan this file.
|
---|
588 | ** Do not deviate from the formatting style currently in use.
|
---|
589 | **
|
---|
590 | *****************************************************************************/
|
---|
591 |
|
---|
592 | /* Opcode: Goto * P2 *
|
---|
593 | **
|
---|
594 | ** An unconditional jump to address P2.
|
---|
595 | ** The next instruction executed will be
|
---|
596 | ** the one at index P2 from the beginning of
|
---|
597 | ** the program.
|
---|
598 | */
|
---|
599 | case OP_Goto: {
|
---|
600 | CHECK_FOR_INTERRUPT;
|
---|
601 | pc = pOp->p2 - 1;
|
---|
602 | break;
|
---|
603 | }
|
---|
604 |
|
---|
605 | /* Opcode: Gosub * P2 *
|
---|
606 | **
|
---|
607 | ** Push the current address plus 1 onto the return address stack
|
---|
608 | ** and then jump to address P2.
|
---|
609 | **
|
---|
610 | ** The return address stack is of limited depth. If too many
|
---|
611 | ** OP_Gosub operations occur without intervening OP_Returns, then
|
---|
612 | ** the return address stack will fill up and processing will abort
|
---|
613 | ** with a fatal error.
|
---|
614 | */
|
---|
615 | case OP_Gosub: {
|
---|
616 | if( p->returnDepth>=sizeof(p->returnStack)/sizeof(p->returnStack[0]) ){
|
---|
617 | sqliteSetString(&p->zErrMsg, "return address stack overflow", (char*)0);
|
---|
618 | p->rc = SQLITE_INTERNAL;
|
---|
619 | return SQLITE_ERROR;
|
---|
620 | }
|
---|
621 | p->returnStack[p->returnDepth++] = pc+1;
|
---|
622 | pc = pOp->p2 - 1;
|
---|
623 | break;
|
---|
624 | }
|
---|
625 |
|
---|
626 | /* Opcode: Return * * *
|
---|
627 | **
|
---|
628 | ** Jump immediately to the next instruction after the last unreturned
|
---|
629 | ** OP_Gosub. If an OP_Return has occurred for all OP_Gosubs, then
|
---|
630 | ** processing aborts with a fatal error.
|
---|
631 | */
|
---|
632 | case OP_Return: {
|
---|
633 | if( p->returnDepth<=0 ){
|
---|
634 | sqliteSetString(&p->zErrMsg, "return address stack underflow", (char*)0);
|
---|
635 | p->rc = SQLITE_INTERNAL;
|
---|
636 | return SQLITE_ERROR;
|
---|
637 | }
|
---|
638 | p->returnDepth--;
|
---|
639 | pc = p->returnStack[p->returnDepth] - 1;
|
---|
640 | break;
|
---|
641 | }
|
---|
642 |
|
---|
643 | /* Opcode: Halt P1 P2 *
|
---|
644 | **
|
---|
645 | ** Exit immediately. All open cursors, Lists, Sorts, etc are closed
|
---|
646 | ** automatically.
|
---|
647 | **
|
---|
648 | ** P1 is the result code returned by sqlite_exec(). For a normal
|
---|
649 | ** halt, this should be SQLITE_OK (0). For errors, it can be some
|
---|
650 | ** other value. If P1!=0 then P2 will determine whether or not to
|
---|
651 | ** rollback the current transaction. Do not rollback if P2==OE_Fail.
|
---|
652 | ** Do the rollback if P2==OE_Rollback. If P2==OE_Abort, then back
|
---|
653 | ** out all changes that have occurred during this execution of the
|
---|
654 | ** VDBE, but do not rollback the transaction.
|
---|
655 | **
|
---|
656 | ** There is an implied "Halt 0 0 0" instruction inserted at the very end of
|
---|
657 | ** every program. So a jump past the last instruction of the program
|
---|
658 | ** is the same as executing Halt.
|
---|
659 | */
|
---|
660 | case OP_Halt: {
|
---|
661 | p->magic = VDBE_MAGIC_HALT;
|
---|
662 | p->pTos = pTos;
|
---|
663 | if( pOp->p1!=SQLITE_OK ){
|
---|
664 | p->rc = pOp->p1;
|
---|
665 | p->errorAction = pOp->p2;
|
---|
666 | if( pOp->p3 ){
|
---|
667 | sqliteSetString(&p->zErrMsg, pOp->p3, (char*)0);
|
---|
668 | }
|
---|
669 | return SQLITE_ERROR;
|
---|
670 | }else{
|
---|
671 | p->rc = SQLITE_OK;
|
---|
672 | return SQLITE_DONE;
|
---|
673 | }
|
---|
674 | }
|
---|
675 |
|
---|
676 | /* Opcode: Integer P1 * P3
|
---|
677 | **
|
---|
678 | ** The integer value P1 is pushed onto the stack. If P3 is not zero
|
---|
679 | ** then it is assumed to be a string representation of the same integer.
|
---|
680 | */
|
---|
681 | case OP_Integer: {
|
---|
682 | pTos++;
|
---|
683 | pTos->i = pOp->p1;
|
---|
684 | pTos->flags = MEM_Int;
|
---|
685 | if( pOp->p3 ){
|
---|
686 | pTos->z = pOp->p3;
|
---|
687 | pTos->flags |= MEM_Str | MEM_Static;
|
---|
688 | pTos->n = strlen(pOp->p3)+1;
|
---|
689 | }
|
---|
690 | break;
|
---|
691 | }
|
---|
692 |
|
---|
693 | /* Opcode: String * * P3
|
---|
694 | **
|
---|
695 | ** The string value P3 is pushed onto the stack. If P3==0 then a
|
---|
696 | ** NULL is pushed onto the stack.
|
---|
697 | */
|
---|
698 | case OP_String: {
|
---|
699 | char *z = pOp->p3;
|
---|
700 | pTos++;
|
---|
701 | if( z==0 ){
|
---|
702 | pTos->flags = MEM_Null;
|
---|
703 | }else{
|
---|
704 | pTos->z = z;
|
---|
705 | pTos->n = strlen(z) + 1;
|
---|
706 | pTos->flags = MEM_Str | MEM_Static;
|
---|
707 | }
|
---|
708 | break;
|
---|
709 | }
|
---|
710 |
|
---|
711 | /* Opcode: Variable P1 * *
|
---|
712 | **
|
---|
713 | ** Push the value of variable P1 onto the stack. A variable is
|
---|
714 | ** an unknown in the original SQL string as handed to sqlite_compile().
|
---|
715 | ** Any occurance of the '?' character in the original SQL is considered
|
---|
716 | ** a variable. Variables in the SQL string are number from left to
|
---|
717 | ** right beginning with 1. The values of variables are set using the
|
---|
718 | ** sqlite_bind() API.
|
---|
719 | */
|
---|
720 | case OP_Variable: {
|
---|
721 | int j = pOp->p1 - 1;
|
---|
722 | pTos++;
|
---|
723 | if( j>=0 && j<p->nVar && p->azVar[j]!=0 ){
|
---|
724 | pTos->z = p->azVar[j];
|
---|
725 | pTos->n = p->anVar[j];
|
---|
726 | pTos->flags = MEM_Str | MEM_Static;
|
---|
727 | }else{
|
---|
728 | pTos->flags = MEM_Null;
|
---|
729 | }
|
---|
730 | break;
|
---|
731 | }
|
---|
732 |
|
---|
733 | /* Opcode: Pop P1 * *
|
---|
734 | **
|
---|
735 | ** P1 elements are popped off of the top of stack and discarded.
|
---|
736 | */
|
---|
737 | case OP_Pop: {
|
---|
738 | assert( pOp->p1>=0 );
|
---|
739 | popStack(&pTos, pOp->p1);
|
---|
740 | assert( pTos>=&p->aStack[-1] );
|
---|
741 | break;
|
---|
742 | }
|
---|
743 |
|
---|
744 | /* Opcode: Dup P1 P2 *
|
---|
745 | **
|
---|
746 | ** A copy of the P1-th element of the stack
|
---|
747 | ** is made and pushed onto the top of the stack.
|
---|
748 | ** The top of the stack is element 0. So the
|
---|
749 | ** instruction "Dup 0 0 0" will make a copy of the
|
---|
750 | ** top of the stack.
|
---|
751 | **
|
---|
752 | ** If the content of the P1-th element is a dynamically
|
---|
753 | ** allocated string, then a new copy of that string
|
---|
754 | ** is made if P2==0. If P2!=0, then just a pointer
|
---|
755 | ** to the string is copied.
|
---|
756 | **
|
---|
757 | ** Also see the Pull instruction.
|
---|
758 | */
|
---|
759 | case OP_Dup: {
|
---|
760 | Mem *pFrom = &pTos[-pOp->p1];
|
---|
761 | assert( pFrom<=pTos && pFrom>=p->aStack );
|
---|
762 | pTos++;
|
---|
763 | memcpy(pTos, pFrom, sizeof(*pFrom)-NBFS);
|
---|
764 | if( pTos->flags & MEM_Str ){
|
---|
765 | if( pOp->p2 && (pTos->flags & (MEM_Dyn|MEM_Ephem)) ){
|
---|
766 | pTos->flags &= ~MEM_Dyn;
|
---|
767 | pTos->flags |= MEM_Ephem;
|
---|
768 | }else if( pTos->flags & MEM_Short ){
|
---|
769 | memcpy(pTos->zShort, pFrom->zShort, pTos->n);
|
---|
770 | pTos->z = pTos->zShort;
|
---|
771 | }else if( (pTos->flags & MEM_Static)==0 ){
|
---|
772 | pTos->z = sqliteMallocRaw(pFrom->n);
|
---|
773 | if( sqlite_malloc_failed ) goto no_mem;
|
---|
774 | memcpy(pTos->z, pFrom->z, pFrom->n);
|
---|
775 | pTos->flags &= ~(MEM_Static|MEM_Ephem|MEM_Short);
|
---|
776 | pTos->flags |= MEM_Dyn;
|
---|
777 | }
|
---|
778 | }
|
---|
779 | break;
|
---|
780 | }
|
---|
781 |
|
---|
782 | /* Opcode: Pull P1 * *
|
---|
783 | **
|
---|
784 | ** The P1-th element is removed from its current location on
|
---|
785 | ** the stack and pushed back on top of the stack. The
|
---|
786 | ** top of the stack is element 0, so "Pull 0 0 0" is
|
---|
787 | ** a no-op. "Pull 1 0 0" swaps the top two elements of
|
---|
788 | ** the stack.
|
---|
789 | **
|
---|
790 | ** See also the Dup instruction.
|
---|
791 | */
|
---|
792 | case OP_Pull: {
|
---|
793 | Mem *pFrom = &pTos[-pOp->p1];
|
---|
794 | int i;
|
---|
795 | Mem ts;
|
---|
796 |
|
---|
797 | ts = *pFrom;
|
---|
798 | Deephemeralize(pTos);
|
---|
799 | for(i=0; i<pOp->p1; i++, pFrom++){
|
---|
800 | Deephemeralize(&pFrom[1]);
|
---|
801 | *pFrom = pFrom[1];
|
---|
802 | assert( (pFrom->flags & MEM_Ephem)==0 );
|
---|
803 | if( pFrom->flags & MEM_Short ){
|
---|
804 | assert( pFrom->flags & MEM_Str );
|
---|
805 | assert( pFrom->z==pFrom[1].zShort );
|
---|
806 | pFrom->z = pFrom->zShort;
|
---|
807 | }
|
---|
808 | }
|
---|
809 | *pTos = ts;
|
---|
810 | if( pTos->flags & MEM_Short ){
|
---|
811 | assert( pTos->flags & MEM_Str );
|
---|
812 | assert( pTos->z==pTos[-pOp->p1].zShort );
|
---|
813 | pTos->z = pTos->zShort;
|
---|
814 | }
|
---|
815 | break;
|
---|
816 | }
|
---|
817 |
|
---|
818 | /* Opcode: Push P1 * *
|
---|
819 | **
|
---|
820 | ** Overwrite the value of the P1-th element down on the
|
---|
821 | ** stack (P1==0 is the top of the stack) with the value
|
---|
822 | ** of the top of the stack. Then pop the top of the stack.
|
---|
823 | */
|
---|
824 | case OP_Push: {
|
---|
825 | Mem *pTo = &pTos[-pOp->p1];
|
---|
826 |
|
---|
827 | assert( pTo>=p->aStack );
|
---|
828 | Deephemeralize(pTos);
|
---|
829 | Release(pTo);
|
---|
830 | *pTo = *pTos;
|
---|
831 | if( pTo->flags & MEM_Short ){
|
---|
832 | assert( pTo->z==pTos->zShort );
|
---|
833 | pTo->z = pTo->zShort;
|
---|
834 | }
|
---|
835 | pTos--;
|
---|
836 | break;
|
---|
837 | }
|
---|
838 |
|
---|
839 |
|
---|
840 | /* Opcode: ColumnName P1 P2 P3
|
---|
841 | **
|
---|
842 | ** P3 becomes the P1-th column name (first is 0). An array of pointers
|
---|
843 | ** to all column names is passed as the 4th parameter to the callback.
|
---|
844 | ** If P2==1 then this is the last column in the result set and thus the
|
---|
845 | ** number of columns in the result set will be P1. There must be at least
|
---|
846 | ** one OP_ColumnName with a P2==1 before invoking OP_Callback and the
|
---|
847 | ** number of columns specified in OP_Callback must one more than the P1
|
---|
848 | ** value of the OP_ColumnName that has P2==1.
|
---|
849 | */
|
---|
850 | case OP_ColumnName: {
|
---|
851 | assert( pOp->p1>=0 && pOp->p1<p->nOp );
|
---|
852 | p->azColName[pOp->p1] = pOp->p3;
|
---|
853 | p->nCallback = 0;
|
---|
854 | if( pOp->p2 ) p->nResColumn = pOp->p1+1;
|
---|
855 | break;
|
---|
856 | }
|
---|
857 |
|
---|
858 | /* Opcode: Callback P1 * *
|
---|
859 | **
|
---|
860 | ** Pop P1 values off the stack and form them into an array. Then
|
---|
861 | ** invoke the callback function using the newly formed array as the
|
---|
862 | ** 3rd parameter.
|
---|
863 | */
|
---|
864 | case OP_Callback: {
|
---|
865 | int i;
|
---|
866 | char **azArgv = p->zArgv;
|
---|
867 | Mem *pCol;
|
---|
868 |
|
---|
869 | pCol = &pTos[1-pOp->p1];
|
---|
870 | assert( pCol>=p->aStack );
|
---|
871 | for(i=0; i<pOp->p1; i++, pCol++){
|
---|
872 | if( pCol->flags & MEM_Null ){
|
---|
873 | azArgv[i] = 0;
|
---|
874 | }else{
|
---|
875 | Stringify(pCol);
|
---|
876 | azArgv[i] = pCol->z;
|
---|
877 | }
|
---|
878 | }
|
---|
879 | azArgv[i] = 0;
|
---|
880 | p->nCallback++;
|
---|
881 | p->azResColumn = azArgv;
|
---|
882 | assert( p->nResColumn==pOp->p1 );
|
---|
883 | p->popStack = pOp->p1;
|
---|
884 | p->pc = pc + 1;
|
---|
885 | p->pTos = pTos;
|
---|
886 | return SQLITE_ROW;
|
---|
887 | }
|
---|
888 |
|
---|
889 | /* Opcode: Concat P1 P2 P3
|
---|
890 | **
|
---|
891 | ** Look at the first P1 elements of the stack. Append them all
|
---|
892 | ** together with the lowest element first. Use P3 as a separator.
|
---|
893 | ** Put the result on the top of the stack. The original P1 elements
|
---|
894 | ** are popped from the stack if P2==0 and retained if P2==1. If
|
---|
895 | ** any element of the stack is NULL, then the result is NULL.
|
---|
896 | **
|
---|
897 | ** If P3 is NULL, then use no separator. When P1==1, this routine
|
---|
898 | ** makes a copy of the top stack element into memory obtained
|
---|
899 | ** from sqliteMalloc().
|
---|
900 | */
|
---|
901 | case OP_Concat: {
|
---|
902 | char *zNew;
|
---|
903 | int nByte;
|
---|
904 | int nField;
|
---|
905 | int i, j;
|
---|
906 | char *zSep;
|
---|
907 | int nSep;
|
---|
908 | Mem *pTerm;
|
---|
909 |
|
---|
910 | nField = pOp->p1;
|
---|
911 | zSep = pOp->p3;
|
---|
912 | if( zSep==0 ) zSep = "";
|
---|
913 | nSep = strlen(zSep);
|
---|
914 | assert( &pTos[1-nField] >= p->aStack );
|
---|
915 | nByte = 1 - nSep;
|
---|
916 | pTerm = &pTos[1-nField];
|
---|
917 | for(i=0; i<nField; i++, pTerm++){
|
---|
918 | if( pTerm->flags & MEM_Null ){
|
---|
919 | nByte = -1;
|
---|
920 | break;
|
---|
921 | }else{
|
---|
922 | Stringify(pTerm);
|
---|
923 | nByte += pTerm->n - 1 + nSep;
|
---|
924 | }
|
---|
925 | }
|
---|
926 | if( nByte<0 ){
|
---|
927 | if( pOp->p2==0 ){
|
---|
928 | popStack(&pTos, nField);
|
---|
929 | }
|
---|
930 | pTos++;
|
---|
931 | pTos->flags = MEM_Null;
|
---|
932 | break;
|
---|
933 | }
|
---|
934 | zNew = sqliteMallocRaw( nByte );
|
---|
935 | if( zNew==0 ) goto no_mem;
|
---|
936 | j = 0;
|
---|
937 | pTerm = &pTos[1-nField];
|
---|
938 | for(i=j=0; i<nField; i++, pTerm++){
|
---|
939 | assert( pTerm->flags & MEM_Str );
|
---|
940 | memcpy(&zNew[j], pTerm->z, pTerm->n-1);
|
---|
941 | j += pTerm->n-1;
|
---|
942 | if( nSep>0 && i<nField-1 ){
|
---|
943 | memcpy(&zNew[j], zSep, nSep);
|
---|
944 | j += nSep;
|
---|
945 | }
|
---|
946 | }
|
---|
947 | zNew[j] = 0;
|
---|
948 | if( pOp->p2==0 ){
|
---|
949 | popStack(&pTos, nField);
|
---|
950 | }
|
---|
951 | pTos++;
|
---|
952 | pTos->n = nByte;
|
---|
953 | pTos->flags = MEM_Str|MEM_Dyn;
|
---|
954 | pTos->z = zNew;
|
---|
955 | break;
|
---|
956 | }
|
---|
957 |
|
---|
958 | /* Opcode: Add * * *
|
---|
959 | **
|
---|
960 | ** Pop the top two elements from the stack, add them together,
|
---|
961 | ** and push the result back onto the stack. If either element
|
---|
962 | ** is a string then it is converted to a double using the atof()
|
---|
963 | ** function before the addition.
|
---|
964 | ** If either operand is NULL, the result is NULL.
|
---|
965 | */
|
---|
966 | /* Opcode: Multiply * * *
|
---|
967 | **
|
---|
968 | ** Pop the top two elements from the stack, multiply them together,
|
---|
969 | ** and push the result back onto the stack. If either element
|
---|
970 | ** is a string then it is converted to a double using the atof()
|
---|
971 | ** function before the multiplication.
|
---|
972 | ** If either operand is NULL, the result is NULL.
|
---|
973 | */
|
---|
974 | /* Opcode: Subtract * * *
|
---|
975 | **
|
---|
976 | ** Pop the top two elements from the stack, subtract the
|
---|
977 | ** first (what was on top of the stack) from the second (the
|
---|
978 | ** next on stack)
|
---|
979 | ** and push the result back onto the stack. If either element
|
---|
980 | ** is a string then it is converted to a double using the atof()
|
---|
981 | ** function before the subtraction.
|
---|
982 | ** If either operand is NULL, the result is NULL.
|
---|
983 | */
|
---|
984 | /* Opcode: Divide * * *
|
---|
985 | **
|
---|
986 | ** Pop the top two elements from the stack, divide the
|
---|
987 | ** first (what was on top of the stack) from the second (the
|
---|
988 | ** next on stack)
|
---|
989 | ** and push the result back onto the stack. If either element
|
---|
990 | ** is a string then it is converted to a double using the atof()
|
---|
991 | ** function before the division. Division by zero returns NULL.
|
---|
992 | ** If either operand is NULL, the result is NULL.
|
---|
993 | */
|
---|
994 | /* Opcode: Remainder * * *
|
---|
995 | **
|
---|
996 | ** Pop the top two elements from the stack, divide the
|
---|
997 | ** first (what was on top of the stack) from the second (the
|
---|
998 | ** next on stack)
|
---|
999 | ** and push the remainder after division onto the stack. If either element
|
---|
1000 | ** is a string then it is converted to a double using the atof()
|
---|
1001 | ** function before the division. Division by zero returns NULL.
|
---|
1002 | ** If either operand is NULL, the result is NULL.
|
---|
1003 | */
|
---|
1004 | case OP_Add:
|
---|
1005 | case OP_Subtract:
|
---|
1006 | case OP_Multiply:
|
---|
1007 | case OP_Divide:
|
---|
1008 | case OP_Remainder: {
|
---|
1009 | Mem *pNos = &pTos[-1];
|
---|
1010 | assert( pNos>=p->aStack );
|
---|
1011 | if( ((pTos->flags | pNos->flags) & MEM_Null)!=0 ){
|
---|
1012 | Release(pTos);
|
---|
1013 | pTos--;
|
---|
1014 | Release(pTos);
|
---|
1015 | pTos->flags = MEM_Null;
|
---|
1016 | }else if( (pTos->flags & pNos->flags & MEM_Int)==MEM_Int ){
|
---|
1017 | int a, b;
|
---|
1018 | a = pTos->i;
|
---|
1019 | b = pNos->i;
|
---|
1020 | switch( pOp->opcode ){
|
---|
1021 | case OP_Add: b += a; break;
|
---|
1022 | case OP_Subtract: b -= a; break;
|
---|
1023 | case OP_Multiply: b *= a; break;
|
---|
1024 | case OP_Divide: {
|
---|
1025 | if( a==0 ) goto divide_by_zero;
|
---|
1026 | b /= a;
|
---|
1027 | break;
|
---|
1028 | }
|
---|
1029 | default: {
|
---|
1030 | if( a==0 ) goto divide_by_zero;
|
---|
1031 | b %= a;
|
---|
1032 | break;
|
---|
1033 | }
|
---|
1034 | }
|
---|
1035 | Release(pTos);
|
---|
1036 | pTos--;
|
---|
1037 | Release(pTos);
|
---|
1038 | pTos->i = b;
|
---|
1039 | pTos->flags = MEM_Int;
|
---|
1040 | }else{
|
---|
1041 | double a, b;
|
---|
1042 | Realify(pTos);
|
---|
1043 | Realify(pNos);
|
---|
1044 | a = pTos->r;
|
---|
1045 | b = pNos->r;
|
---|
1046 | switch( pOp->opcode ){
|
---|
1047 | case OP_Add: b += a; break;
|
---|
1048 | case OP_Subtract: b -= a; break;
|
---|
1049 | case OP_Multiply: b *= a; break;
|
---|
1050 | case OP_Divide: {
|
---|
1051 | if( a==0.0 ) goto divide_by_zero;
|
---|
1052 | b /= a;
|
---|
1053 | break;
|
---|
1054 | }
|
---|
1055 | default: {
|
---|
1056 | int ia = (int)a;
|
---|
1057 | int ib = (int)b;
|
---|
1058 | if( ia==0.0 ) goto divide_by_zero;
|
---|
1059 | b = ib % ia;
|
---|
1060 | break;
|
---|
1061 | }
|
---|
1062 | }
|
---|
1063 | Release(pTos);
|
---|
1064 | pTos--;
|
---|
1065 | Release(pTos);
|
---|
1066 | pTos->r = b;
|
---|
1067 | pTos->flags = MEM_Real;
|
---|
1068 | }
|
---|
1069 | break;
|
---|
1070 |
|
---|
1071 | divide_by_zero:
|
---|
1072 | Release(pTos);
|
---|
1073 | pTos--;
|
---|
1074 | Release(pTos);
|
---|
1075 | pTos->flags = MEM_Null;
|
---|
1076 | break;
|
---|
1077 | }
|
---|
1078 |
|
---|
1079 | /* Opcode: Function P1 * P3
|
---|
1080 | **
|
---|
1081 | ** Invoke a user function (P3 is a pointer to a Function structure that
|
---|
1082 | ** defines the function) with P1 string arguments taken from the stack.
|
---|
1083 | ** Pop all arguments from the stack and push back the result.
|
---|
1084 | **
|
---|
1085 | ** See also: AggFunc
|
---|
1086 | */
|
---|
1087 | case OP_Function: {
|
---|
1088 | int n, i;
|
---|
1089 | Mem *pArg;
|
---|
1090 | char **azArgv;
|
---|
1091 | sqlite_func ctx;
|
---|
1092 |
|
---|
1093 | n = pOp->p1;
|
---|
1094 | pArg = &pTos[1-n];
|
---|
1095 | azArgv = p->zArgv;
|
---|
1096 | for(i=0; i<n; i++, pArg++){
|
---|
1097 | if( pArg->flags & MEM_Null ){
|
---|
1098 | azArgv[i] = 0;
|
---|
1099 | }else{
|
---|
1100 | Stringify(pArg);
|
---|
1101 | azArgv[i] = pArg->z;
|
---|
1102 | }
|
---|
1103 | }
|
---|
1104 | ctx.pFunc = (FuncDef*)pOp->p3;
|
---|
1105 | ctx.s.flags = MEM_Null;
|
---|
1106 | ctx.s.z = 0;
|
---|
1107 | ctx.isError = 0;
|
---|
1108 | ctx.isStep = 0;
|
---|
1109 | if( sqliteSafetyOff(db) ) goto abort_due_to_misuse;
|
---|
1110 | (*ctx.pFunc->xFunc)(&ctx, n, (const char**)azArgv);
|
---|
1111 | if( sqliteSafetyOn(db) ) goto abort_due_to_misuse;
|
---|
1112 | popStack(&pTos, n);
|
---|
1113 | pTos++;
|
---|
1114 | *pTos = ctx.s;
|
---|
1115 | if( pTos->flags & MEM_Short ){
|
---|
1116 | pTos->z = pTos->zShort;
|
---|
1117 | }
|
---|
1118 | if( ctx.isError ){
|
---|
1119 | sqliteSetString(&p->zErrMsg,
|
---|
1120 | (pTos->flags & MEM_Str)!=0 ? pTos->z : "user function error", (char*)0);
|
---|
1121 | rc = SQLITE_ERROR;
|
---|
1122 | }
|
---|
1123 | break;
|
---|
1124 | }
|
---|
1125 |
|
---|
1126 | /* Opcode: BitAnd * * *
|
---|
1127 | **
|
---|
1128 | ** Pop the top two elements from the stack. Convert both elements
|
---|
1129 | ** to integers. Push back onto the stack the bit-wise AND of the
|
---|
1130 | ** two elements.
|
---|
1131 | ** If either operand is NULL, the result is NULL.
|
---|
1132 | */
|
---|
1133 | /* Opcode: BitOr * * *
|
---|
1134 | **
|
---|
1135 | ** Pop the top two elements from the stack. Convert both elements
|
---|
1136 | ** to integers. Push back onto the stack the bit-wise OR of the
|
---|
1137 | ** two elements.
|
---|
1138 | ** If either operand is NULL, the result is NULL.
|
---|
1139 | */
|
---|
1140 | /* Opcode: ShiftLeft * * *
|
---|
1141 | **
|
---|
1142 | ** Pop the top two elements from the stack. Convert both elements
|
---|
1143 | ** to integers. Push back onto the stack the top element shifted
|
---|
1144 | ** left by N bits where N is the second element on the stack.
|
---|
1145 | ** If either operand is NULL, the result is NULL.
|
---|
1146 | */
|
---|
1147 | /* Opcode: ShiftRight * * *
|
---|
1148 | **
|
---|
1149 | ** Pop the top two elements from the stack. Convert both elements
|
---|
1150 | ** to integers. Push back onto the stack the top element shifted
|
---|
1151 | ** right by N bits where N is the second element on the stack.
|
---|
1152 | ** If either operand is NULL, the result is NULL.
|
---|
1153 | */
|
---|
1154 | case OP_BitAnd:
|
---|
1155 | case OP_BitOr:
|
---|
1156 | case OP_ShiftLeft:
|
---|
1157 | case OP_ShiftRight: {
|
---|
1158 | Mem *pNos = &pTos[-1];
|
---|
1159 | int a, b;
|
---|
1160 |
|
---|
1161 | assert( pNos>=p->aStack );
|
---|
1162 | if( (pTos->flags | pNos->flags) & MEM_Null ){
|
---|
1163 | popStack(&pTos, 2);
|
---|
1164 | pTos++;
|
---|
1165 | pTos->flags = MEM_Null;
|
---|
1166 | break;
|
---|
1167 | }
|
---|
1168 | Integerify(pTos);
|
---|
1169 | Integerify(pNos);
|
---|
1170 | a = pTos->i;
|
---|
1171 | b = pNos->i;
|
---|
1172 | switch( pOp->opcode ){
|
---|
1173 | case OP_BitAnd: a &= b; break;
|
---|
1174 | case OP_BitOr: a |= b; break;
|
---|
1175 | case OP_ShiftLeft: a <<= b; break;
|
---|
1176 | case OP_ShiftRight: a >>= b; break;
|
---|
1177 | default: /* CANT HAPPEN */ break;
|
---|
1178 | }
|
---|
1179 | assert( (pTos->flags & MEM_Dyn)==0 );
|
---|
1180 | assert( (pNos->flags & MEM_Dyn)==0 );
|
---|
1181 | pTos--;
|
---|
1182 | Release(pTos);
|
---|
1183 | pTos->i = a;
|
---|
1184 | pTos->flags = MEM_Int;
|
---|
1185 | break;
|
---|
1186 | }
|
---|
1187 |
|
---|
1188 | /* Opcode: AddImm P1 * *
|
---|
1189 | **
|
---|
1190 | ** Add the value P1 to whatever is on top of the stack. The result
|
---|
1191 | ** is always an integer.
|
---|
1192 | **
|
---|
1193 | ** To force the top of the stack to be an integer, just add 0.
|
---|
1194 | */
|
---|
1195 | case OP_AddImm: {
|
---|
1196 | assert( pTos>=p->aStack );
|
---|
1197 | Integerify(pTos);
|
---|
1198 | pTos->i += pOp->p1;
|
---|
1199 | break;
|
---|
1200 | }
|
---|
1201 |
|
---|
1202 | /* Opcode: ForceInt P1 P2 *
|
---|
1203 | **
|
---|
1204 | ** Convert the top of the stack into an integer. If the current top of
|
---|
1205 | ** the stack is not numeric (meaning that is is a NULL or a string that
|
---|
1206 | ** does not look like an integer or floating point number) then pop the
|
---|
1207 | ** stack and jump to P2. If the top of the stack is numeric then
|
---|
1208 | ** convert it into the least integer that is greater than or equal to its
|
---|
1209 | ** current value if P1==0, or to the least integer that is strictly
|
---|
1210 | ** greater than its current value if P1==1.
|
---|
1211 | */
|
---|
1212 | case OP_ForceInt: {
|
---|
1213 | int v;
|
---|
1214 | assert( pTos>=p->aStack );
|
---|
1215 | if( (pTos->flags & (MEM_Int|MEM_Real))==0
|
---|
1216 | && ((pTos->flags & MEM_Str)==0 || sqliteIsNumber(pTos->z)==0) ){
|
---|
1217 | Release(pTos);
|
---|
1218 | pTos--;
|
---|
1219 | pc = pOp->p2 - 1;
|
---|
1220 | break;
|
---|
1221 | }
|
---|
1222 | if( pTos->flags & MEM_Int ){
|
---|
1223 | v = pTos->i + (pOp->p1!=0);
|
---|
1224 | }else{
|
---|
1225 | Realify(pTos);
|
---|
1226 | v = (int)pTos->r;
|
---|
1227 | if( pTos->r>(double)v ) v++;
|
---|
1228 | if( pOp->p1 && pTos->r==(double)v ) v++;
|
---|
1229 | }
|
---|
1230 | Release(pTos);
|
---|
1231 | pTos->i = v;
|
---|
1232 | pTos->flags = MEM_Int;
|
---|
1233 | break;
|
---|
1234 | }
|
---|
1235 |
|
---|
1236 | /* Opcode: MustBeInt P1 P2 *
|
---|
1237 | **
|
---|
1238 | ** Force the top of the stack to be an integer. If the top of the
|
---|
1239 | ** stack is not an integer and cannot be converted into an integer
|
---|
1240 | ** with out data loss, then jump immediately to P2, or if P2==0
|
---|
1241 | ** raise an SQLITE_MISMATCH exception.
|
---|
1242 | **
|
---|
1243 | ** If the top of the stack is not an integer and P2 is not zero and
|
---|
1244 | ** P1 is 1, then the stack is popped. In all other cases, the depth
|
---|
1245 | ** of the stack is unchanged.
|
---|
1246 | */
|
---|
1247 | case OP_MustBeInt: {
|
---|
1248 | assert( pTos>=p->aStack );
|
---|
1249 | if( pTos->flags & MEM_Int ){
|
---|
1250 | /* Do nothing */
|
---|
1251 | }else if( pTos->flags & MEM_Real ){
|
---|
1252 | int i = (int)pTos->r;
|
---|
1253 | double r = (double)i;
|
---|
1254 | if( r!=pTos->r ){
|
---|
1255 | goto mismatch;
|
---|
1256 | }
|
---|
1257 | pTos->i = i;
|
---|
1258 | }else if( pTos->flags & MEM_Str ){
|
---|
1259 | int v;
|
---|
1260 | if( !toInt(pTos->z, &v) ){
|
---|
1261 | double r;
|
---|
1262 | if( !sqliteIsNumber(pTos->z) ){
|
---|
1263 | goto mismatch;
|
---|
1264 | }
|
---|
1265 | Realify(pTos);
|
---|
1266 | v = (int)pTos->r;
|
---|
1267 | r = (double)v;
|
---|
1268 | if( r!=pTos->r ){
|
---|
1269 | goto mismatch;
|
---|
1270 | }
|
---|
1271 | }
|
---|
1272 | pTos->i = v;
|
---|
1273 | }else{
|
---|
1274 | goto mismatch;
|
---|
1275 | }
|
---|
1276 | Release(pTos);
|
---|
1277 | pTos->flags = MEM_Int;
|
---|
1278 | break;
|
---|
1279 |
|
---|
1280 | mismatch:
|
---|
1281 | if( pOp->p2==0 ){
|
---|
1282 | rc = SQLITE_MISMATCH;
|
---|
1283 | goto abort_due_to_error;
|
---|
1284 | }else{
|
---|
1285 | if( pOp->p1 ) popStack(&pTos, 1);
|
---|
1286 | pc = pOp->p2 - 1;
|
---|
1287 | }
|
---|
1288 | break;
|
---|
1289 | }
|
---|
1290 |
|
---|
1291 | /* Opcode: Eq P1 P2 *
|
---|
1292 | **
|
---|
1293 | ** Pop the top two elements from the stack. If they are equal, then
|
---|
1294 | ** jump to instruction P2. Otherwise, continue to the next instruction.
|
---|
1295 | **
|
---|
1296 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1297 | ** take the jump if P1 is true.
|
---|
1298 | **
|
---|
1299 | ** If both values are numeric, they are converted to doubles using atof()
|
---|
1300 | ** and compared for equality that way. Otherwise the strcmp() library
|
---|
1301 | ** routine is used for the comparison. For a pure text comparison
|
---|
1302 | ** use OP_StrEq.
|
---|
1303 | **
|
---|
1304 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1305 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1306 | ** NULL if either operand was NULL.
|
---|
1307 | */
|
---|
1308 | /* Opcode: Ne P1 P2 *
|
---|
1309 | **
|
---|
1310 | ** Pop the top two elements from the stack. If they are not equal, then
|
---|
1311 | ** jump to instruction P2. Otherwise, continue to the next instruction.
|
---|
1312 | **
|
---|
1313 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1314 | ** take the jump if P1 is true.
|
---|
1315 | **
|
---|
1316 | ** If both values are numeric, they are converted to doubles using atof()
|
---|
1317 | ** and compared in that format. Otherwise the strcmp() library
|
---|
1318 | ** routine is used for the comparison. For a pure text comparison
|
---|
1319 | ** use OP_StrNe.
|
---|
1320 | **
|
---|
1321 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1322 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1323 | ** NULL if either operand was NULL.
|
---|
1324 | */
|
---|
1325 | /* Opcode: Lt P1 P2 *
|
---|
1326 | **
|
---|
1327 | ** Pop the top two elements from the stack. If second element (the
|
---|
1328 | ** next on stack) is less than the first (the top of stack), then
|
---|
1329 | ** jump to instruction P2. Otherwise, continue to the next instruction.
|
---|
1330 | ** In other words, jump if NOS<TOS.
|
---|
1331 | **
|
---|
1332 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1333 | ** take the jump if P1 is true.
|
---|
1334 | **
|
---|
1335 | ** If both values are numeric, they are converted to doubles using atof()
|
---|
1336 | ** and compared in that format. Numeric values are always less than
|
---|
1337 | ** non-numeric values. If both operands are non-numeric, the strcmp() library
|
---|
1338 | ** routine is used for the comparison. For a pure text comparison
|
---|
1339 | ** use OP_StrLt.
|
---|
1340 | **
|
---|
1341 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1342 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1343 | ** NULL if either operand was NULL.
|
---|
1344 | */
|
---|
1345 | /* Opcode: Le P1 P2 *
|
---|
1346 | **
|
---|
1347 | ** Pop the top two elements from the stack. If second element (the
|
---|
1348 | ** next on stack) is less than or equal to the first (the top of stack),
|
---|
1349 | ** then jump to instruction P2. In other words, jump if NOS<=TOS.
|
---|
1350 | **
|
---|
1351 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1352 | ** take the jump if P1 is true.
|
---|
1353 | **
|
---|
1354 | ** If both values are numeric, they are converted to doubles using atof()
|
---|
1355 | ** and compared in that format. Numeric values are always less than
|
---|
1356 | ** non-numeric values. If both operands are non-numeric, the strcmp() library
|
---|
1357 | ** routine is used for the comparison. For a pure text comparison
|
---|
1358 | ** use OP_StrLe.
|
---|
1359 | **
|
---|
1360 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1361 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1362 | ** NULL if either operand was NULL.
|
---|
1363 | */
|
---|
1364 | /* Opcode: Gt P1 P2 *
|
---|
1365 | **
|
---|
1366 | ** Pop the top two elements from the stack. If second element (the
|
---|
1367 | ** next on stack) is greater than the first (the top of stack),
|
---|
1368 | ** then jump to instruction P2. In other words, jump if NOS>TOS.
|
---|
1369 | **
|
---|
1370 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1371 | ** take the jump if P1 is true.
|
---|
1372 | **
|
---|
1373 | ** If both values are numeric, they are converted to doubles using atof()
|
---|
1374 | ** and compared in that format. Numeric values are always less than
|
---|
1375 | ** non-numeric values. If both operands are non-numeric, the strcmp() library
|
---|
1376 | ** routine is used for the comparison. For a pure text comparison
|
---|
1377 | ** use OP_StrGt.
|
---|
1378 | **
|
---|
1379 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1380 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1381 | ** NULL if either operand was NULL.
|
---|
1382 | */
|
---|
1383 | /* Opcode: Ge P1 P2 *
|
---|
1384 | **
|
---|
1385 | ** Pop the top two elements from the stack. If second element (the next
|
---|
1386 | ** on stack) is greater than or equal to the first (the top of stack),
|
---|
1387 | ** then jump to instruction P2. In other words, jump if NOS>=TOS.
|
---|
1388 | **
|
---|
1389 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1390 | ** take the jump if P1 is true.
|
---|
1391 | **
|
---|
1392 | ** If both values are numeric, they are converted to doubles using atof()
|
---|
1393 | ** and compared in that format. Numeric values are always less than
|
---|
1394 | ** non-numeric values. If both operands are non-numeric, the strcmp() library
|
---|
1395 | ** routine is used for the comparison. For a pure text comparison
|
---|
1396 | ** use OP_StrGe.
|
---|
1397 | **
|
---|
1398 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1399 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1400 | ** NULL if either operand was NULL.
|
---|
1401 | */
|
---|
1402 | case OP_Eq:
|
---|
1403 | case OP_Ne:
|
---|
1404 | case OP_Lt:
|
---|
1405 | case OP_Le:
|
---|
1406 | case OP_Gt:
|
---|
1407 | case OP_Ge: {
|
---|
1408 | Mem *pNos = &pTos[-1];
|
---|
1409 | int c, v;
|
---|
1410 | int ft, fn;
|
---|
1411 | assert( pNos>=p->aStack );
|
---|
1412 | ft = pTos->flags;
|
---|
1413 | fn = pNos->flags;
|
---|
1414 | if( (ft | fn) & MEM_Null ){
|
---|
1415 | popStack(&pTos, 2);
|
---|
1416 | if( pOp->p2 ){
|
---|
1417 | if( pOp->p1 ) pc = pOp->p2-1;
|
---|
1418 | }else{
|
---|
1419 | pTos++;
|
---|
1420 | pTos->flags = MEM_Null;
|
---|
1421 | }
|
---|
1422 | break;
|
---|
1423 | }else if( (ft & fn & MEM_Int)==MEM_Int ){
|
---|
1424 | c = pNos->i - pTos->i;
|
---|
1425 | }else if( (ft & MEM_Int)!=0 && (fn & MEM_Str)!=0 && toInt(pNos->z,&v) ){
|
---|
1426 | c = v - pTos->i;
|
---|
1427 | }else if( (fn & MEM_Int)!=0 && (ft & MEM_Str)!=0 && toInt(pTos->z,&v) ){
|
---|
1428 | c = pNos->i - v;
|
---|
1429 | }else{
|
---|
1430 | Stringify(pTos);
|
---|
1431 | Stringify(pNos);
|
---|
1432 | c = sqliteCompare(pNos->z, pTos->z);
|
---|
1433 | }
|
---|
1434 | switch( pOp->opcode ){
|
---|
1435 | case OP_Eq: c = c==0; break;
|
---|
1436 | case OP_Ne: c = c!=0; break;
|
---|
1437 | case OP_Lt: c = c<0; break;
|
---|
1438 | case OP_Le: c = c<=0; break;
|
---|
1439 | case OP_Gt: c = c>0; break;
|
---|
1440 | default: c = c>=0; break;
|
---|
1441 | }
|
---|
1442 | popStack(&pTos, 2);
|
---|
1443 | if( pOp->p2 ){
|
---|
1444 | if( c ) pc = pOp->p2-1;
|
---|
1445 | }else{
|
---|
1446 | pTos++;
|
---|
1447 | pTos->i = c;
|
---|
1448 | pTos->flags = MEM_Int;
|
---|
1449 | }
|
---|
1450 | break;
|
---|
1451 | }
|
---|
1452 | /* INSERT NO CODE HERE!
|
---|
1453 | **
|
---|
1454 | ** The opcode numbers are extracted from this source file by doing
|
---|
1455 | **
|
---|
1456 | ** grep '^case OP_' vdbe.c | ... >opcodes.h
|
---|
1457 | **
|
---|
1458 | ** The opcodes are numbered in the order that they appear in this file.
|
---|
1459 | ** But in order for the expression generating code to work right, the
|
---|
1460 | ** string comparison operators that follow must be numbered exactly 6
|
---|
1461 | ** greater than the numeric comparison opcodes above. So no other
|
---|
1462 | ** cases can appear between the two.
|
---|
1463 | */
|
---|
1464 | /* Opcode: StrEq P1 P2 *
|
---|
1465 | **
|
---|
1466 | ** Pop the top two elements from the stack. If they are equal, then
|
---|
1467 | ** jump to instruction P2. Otherwise, continue to the next instruction.
|
---|
1468 | **
|
---|
1469 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1470 | ** take the jump if P1 is true.
|
---|
1471 | **
|
---|
1472 | ** The strcmp() library routine is used for the comparison. For a
|
---|
1473 | ** numeric comparison, use OP_Eq.
|
---|
1474 | **
|
---|
1475 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1476 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1477 | ** NULL if either operand was NULL.
|
---|
1478 | */
|
---|
1479 | /* Opcode: StrNe P1 P2 *
|
---|
1480 | **
|
---|
1481 | ** Pop the top two elements from the stack. If they are not equal, then
|
---|
1482 | ** jump to instruction P2. Otherwise, continue to the next instruction.
|
---|
1483 | **
|
---|
1484 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1485 | ** take the jump if P1 is true.
|
---|
1486 | **
|
---|
1487 | ** The strcmp() library routine is used for the comparison. For a
|
---|
1488 | ** numeric comparison, use OP_Ne.
|
---|
1489 | **
|
---|
1490 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1491 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1492 | ** NULL if either operand was NULL.
|
---|
1493 | */
|
---|
1494 | /* Opcode: StrLt P1 P2 *
|
---|
1495 | **
|
---|
1496 | ** Pop the top two elements from the stack. If second element (the
|
---|
1497 | ** next on stack) is less than the first (the top of stack), then
|
---|
1498 | ** jump to instruction P2. Otherwise, continue to the next instruction.
|
---|
1499 | ** In other words, jump if NOS<TOS.
|
---|
1500 | **
|
---|
1501 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1502 | ** take the jump if P1 is true.
|
---|
1503 | **
|
---|
1504 | ** The strcmp() library routine is used for the comparison. For a
|
---|
1505 | ** numeric comparison, use OP_Lt.
|
---|
1506 | **
|
---|
1507 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1508 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1509 | ** NULL if either operand was NULL.
|
---|
1510 | */
|
---|
1511 | /* Opcode: StrLe P1 P2 *
|
---|
1512 | **
|
---|
1513 | ** Pop the top two elements from the stack. If second element (the
|
---|
1514 | ** next on stack) is less than or equal to the first (the top of stack),
|
---|
1515 | ** then jump to instruction P2. In other words, jump if NOS<=TOS.
|
---|
1516 | **
|
---|
1517 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1518 | ** take the jump if P1 is true.
|
---|
1519 | **
|
---|
1520 | ** The strcmp() library routine is used for the comparison. For a
|
---|
1521 | ** numeric comparison, use OP_Le.
|
---|
1522 | **
|
---|
1523 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1524 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1525 | ** NULL if either operand was NULL.
|
---|
1526 | */
|
---|
1527 | /* Opcode: StrGt P1 P2 *
|
---|
1528 | **
|
---|
1529 | ** Pop the top two elements from the stack. If second element (the
|
---|
1530 | ** next on stack) is greater than the first (the top of stack),
|
---|
1531 | ** then jump to instruction P2. In other words, jump if NOS>TOS.
|
---|
1532 | **
|
---|
1533 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1534 | ** take the jump if P1 is true.
|
---|
1535 | **
|
---|
1536 | ** The strcmp() library routine is used for the comparison. For a
|
---|
1537 | ** numeric comparison, use OP_Gt.
|
---|
1538 | **
|
---|
1539 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1540 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1541 | ** NULL if either operand was NULL.
|
---|
1542 | */
|
---|
1543 | /* Opcode: StrGe P1 P2 *
|
---|
1544 | **
|
---|
1545 | ** Pop the top two elements from the stack. If second element (the next
|
---|
1546 | ** on stack) is greater than or equal to the first (the top of stack),
|
---|
1547 | ** then jump to instruction P2. In other words, jump if NOS>=TOS.
|
---|
1548 | **
|
---|
1549 | ** If either operand is NULL (and thus if the result is unknown) then
|
---|
1550 | ** take the jump if P1 is true.
|
---|
1551 | **
|
---|
1552 | ** The strcmp() library routine is used for the comparison. For a
|
---|
1553 | ** numeric comparison, use OP_Ge.
|
---|
1554 | **
|
---|
1555 | ** If P2 is zero, do not jump. Instead, push an integer 1 onto the
|
---|
1556 | ** stack if the jump would have been taken, or a 0 if not. Push a
|
---|
1557 | ** NULL if either operand was NULL.
|
---|
1558 | */
|
---|
1559 | case OP_StrEq:
|
---|
1560 | case OP_StrNe:
|
---|
1561 | case OP_StrLt:
|
---|
1562 | case OP_StrLe:
|
---|
1563 | case OP_StrGt:
|
---|
1564 | case OP_StrGe: {
|
---|
1565 | Mem *pNos = &pTos[-1];
|
---|
1566 | int c;
|
---|
1567 | assert( pNos>=p->aStack );
|
---|
1568 | if( (pNos->flags | pTos->flags) & MEM_Null ){
|
---|
1569 | popStack(&pTos, 2);
|
---|
1570 | if( pOp->p2 ){
|
---|
1571 | if( pOp->p1 ) pc = pOp->p2-1;
|
---|
1572 | }else{
|
---|
1573 | pTos++;
|
---|
1574 | pTos->flags = MEM_Null;
|
---|
1575 | }
|
---|
1576 | break;
|
---|
1577 | }else{
|
---|
1578 | Stringify(pTos);
|
---|
1579 | Stringify(pNos);
|
---|
1580 | c = strcmp(pNos->z, pTos->z);
|
---|
1581 | }
|
---|
1582 | /* The asserts on each case of the following switch are there to verify
|
---|
1583 | ** that string comparison opcodes are always exactly 6 greater than the
|
---|
1584 | ** corresponding numeric comparison opcodes. The code generator depends
|
---|
1585 | ** on this fact.
|
---|
1586 | */
|
---|
1587 | switch( pOp->opcode ){
|
---|
1588 | case OP_StrEq: c = c==0; assert( pOp->opcode-6==OP_Eq ); break;
|
---|
1589 | case OP_StrNe: c = c!=0; assert( pOp->opcode-6==OP_Ne ); break;
|
---|
1590 | case OP_StrLt: c = c<0; assert( pOp->opcode-6==OP_Lt ); break;
|
---|
1591 | case OP_StrLe: c = c<=0; assert( pOp->opcode-6==OP_Le ); break;
|
---|
1592 | case OP_StrGt: c = c>0; assert( pOp->opcode-6==OP_Gt ); break;
|
---|
1593 | default: c = c>=0; assert( pOp->opcode-6==OP_Ge ); break;
|
---|
1594 | }
|
---|
1595 | popStack(&pTos, 2);
|
---|
1596 | if( pOp->p2 ){
|
---|
1597 | if( c ) pc = pOp->p2-1;
|
---|
1598 | }else{
|
---|
1599 | pTos++;
|
---|
1600 | pTos->flags = MEM_Int;
|
---|
1601 | pTos->i = c;
|
---|
1602 | }
|
---|
1603 | break;
|
---|
1604 | }
|
---|
1605 |
|
---|
1606 | /* Opcode: And * * *
|
---|
1607 | **
|
---|
1608 | ** Pop two values off the stack. Take the logical AND of the
|
---|
1609 | ** two values and push the resulting boolean value back onto the
|
---|
1610 | ** stack.
|
---|
1611 | */
|
---|
1612 | /* Opcode: Or * * *
|
---|
1613 | **
|
---|
1614 | ** Pop two values off the stack. Take the logical OR of the
|
---|
1615 | ** two values and push the resulting boolean value back onto the
|
---|
1616 | ** stack.
|
---|
1617 | */
|
---|
1618 | case OP_And:
|
---|
1619 | case OP_Or: {
|
---|
1620 | Mem *pNos = &pTos[-1];
|
---|
1621 | int v1, v2; /* 0==TRUE, 1==FALSE, 2==UNKNOWN or NULL */
|
---|
1622 |
|
---|
1623 | assert( pNos>=p->aStack );
|
---|
1624 | if( pTos->flags & MEM_Null ){
|
---|
1625 | v1 = 2;
|
---|
1626 | }else{
|
---|
1627 | Integerify(pTos);
|
---|
1628 | v1 = pTos->i==0;
|
---|
1629 | }
|
---|
1630 | if( pNos->flags & MEM_Null ){
|
---|
1631 | v2 = 2;
|
---|
1632 | }else{
|
---|
1633 | Integerify(pNos);
|
---|
1634 | v2 = pNos->i==0;
|
---|
1635 | }
|
---|
1636 | if( pOp->opcode==OP_And ){
|
---|
1637 | static const unsigned char and_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
|
---|
1638 | v1 = and_logic[v1*3+v2];
|
---|
1639 | }else{
|
---|
1640 | static const unsigned char or_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
|
---|
1641 | v1 = or_logic[v1*3+v2];
|
---|
1642 | }
|
---|
1643 | popStack(&pTos, 2);
|
---|
1644 | pTos++;
|
---|
1645 | if( v1==2 ){
|
---|
1646 | pTos->flags = MEM_Null;
|
---|
1647 | }else{
|
---|
1648 | pTos->i = v1==0;
|
---|
1649 | pTos->flags = MEM_Int;
|
---|
1650 | }
|
---|
1651 | break;
|
---|
1652 | }
|
---|
1653 |
|
---|
1654 | /* Opcode: Negative * * *
|
---|
1655 | **
|
---|
1656 | ** Treat the top of the stack as a numeric quantity. Replace it
|
---|
1657 | ** with its additive inverse. If the top of the stack is NULL
|
---|
1658 | ** its value is unchanged.
|
---|
1659 | */
|
---|
1660 | /* Opcode: AbsValue * * *
|
---|
1661 | **
|
---|
1662 | ** Treat the top of the stack as a numeric quantity. Replace it
|
---|
1663 | ** with its absolute value. If the top of the stack is NULL
|
---|
1664 | ** its value is unchanged.
|
---|
1665 | */
|
---|
1666 | case OP_Negative:
|
---|
1667 | case OP_AbsValue: {
|
---|
1668 | assert( pTos>=p->aStack );
|
---|
1669 | if( pTos->flags & MEM_Real ){
|
---|
1670 | Release(pTos);
|
---|
1671 | if( pOp->opcode==OP_Negative || pTos->r<0.0 ){
|
---|
1672 | pTos->r = -pTos->r;
|
---|
1673 | }
|
---|
1674 | pTos->flags = MEM_Real;
|
---|
1675 | }else if( pTos->flags & MEM_Int ){
|
---|
1676 | Release(pTos);
|
---|
1677 | if( pOp->opcode==OP_Negative || pTos->i<0 ){
|
---|
1678 | pTos->i = -pTos->i;
|
---|
1679 | }
|
---|
1680 | pTos->flags = MEM_Int;
|
---|
1681 | }else if( pTos->flags & MEM_Null ){
|
---|
1682 | /* Do nothing */
|
---|
1683 | }else{
|
---|
1684 | Realify(pTos);
|
---|
1685 | Release(pTos);
|
---|
1686 | if( pOp->opcode==OP_Negative || pTos->r<0.0 ){
|
---|
1687 | pTos->r = -pTos->r;
|
---|
1688 | }
|
---|
1689 | pTos->flags = MEM_Real;
|
---|
1690 | }
|
---|
1691 | break;
|
---|
1692 | }
|
---|
1693 |
|
---|
1694 | /* Opcode: Not * * *
|
---|
1695 | **
|
---|
1696 | ** Interpret the top of the stack as a boolean value. Replace it
|
---|
1697 | ** with its complement. If the top of the stack is NULL its value
|
---|
1698 | ** is unchanged.
|
---|
1699 | */
|
---|
1700 | case OP_Not: {
|
---|
1701 | assert( pTos>=p->aStack );
|
---|
1702 | if( pTos->flags & MEM_Null ) break; /* Do nothing to NULLs */
|
---|
1703 | Integerify(pTos);
|
---|
1704 | Release(pTos);
|
---|
1705 | pTos->i = !pTos->i;
|
---|
1706 | pTos->flags = MEM_Int;
|
---|
1707 | break;
|
---|
1708 | }
|
---|
1709 |
|
---|
1710 | /* Opcode: BitNot * * *
|
---|
1711 | **
|
---|
1712 | ** Interpret the top of the stack as an value. Replace it
|
---|
1713 | ** with its ones-complement. If the top of the stack is NULL its
|
---|
1714 | ** value is unchanged.
|
---|
1715 | */
|
---|
1716 | case OP_BitNot: {
|
---|
1717 | assert( pTos>=p->aStack );
|
---|
1718 | if( pTos->flags & MEM_Null ) break; /* Do nothing to NULLs */
|
---|
1719 | Integerify(pTos);
|
---|
1720 | Release(pTos);
|
---|
1721 | pTos->i = ~pTos->i;
|
---|
1722 | pTos->flags = MEM_Int;
|
---|
1723 | break;
|
---|
1724 | }
|
---|
1725 |
|
---|
1726 | /* Opcode: Noop * * *
|
---|
1727 | **
|
---|
1728 | ** Do nothing. This instruction is often useful as a jump
|
---|
1729 | ** destination.
|
---|
1730 | */
|
---|
1731 | case OP_Noop: {
|
---|
1732 | break;
|
---|
1733 | }
|
---|
1734 |
|
---|
1735 | /* Opcode: If P1 P2 *
|
---|
1736 | **
|
---|
1737 | ** Pop a single boolean from the stack. If the boolean popped is
|
---|
1738 | ** true, then jump to p2. Otherwise continue to the next instruction.
|
---|
1739 | ** An integer is false if zero and true otherwise. A string is
|
---|
1740 | ** false if it has zero length and true otherwise.
|
---|
1741 | **
|
---|
1742 | ** If the value popped of the stack is NULL, then take the jump if P1
|
---|
1743 | ** is true and fall through if P1 is false.
|
---|
1744 | */
|
---|
1745 | /* Opcode: IfNot P1 P2 *
|
---|
1746 | **
|
---|
1747 | ** Pop a single boolean from the stack. If the boolean popped is
|
---|
1748 | ** false, then jump to p2. Otherwise continue to the next instruction.
|
---|
1749 | ** An integer is false if zero and true otherwise. A string is
|
---|
1750 | ** false if it has zero length and true otherwise.
|
---|
1751 | **
|
---|
1752 | ** If the value popped of the stack is NULL, then take the jump if P1
|
---|
1753 | ** is true and fall through if P1 is false.
|
---|
1754 | */
|
---|
1755 | case OP_If:
|
---|
1756 | case OP_IfNot: {
|
---|
1757 | int c;
|
---|
1758 | assert( pTos>=p->aStack );
|
---|
1759 | if( pTos->flags & MEM_Null ){
|
---|
1760 | c = pOp->p1;
|
---|
1761 | }else{
|
---|
1762 | Integerify(pTos);
|
---|
1763 | c = pTos->i;
|
---|
1764 | if( pOp->opcode==OP_IfNot ) c = !c;
|
---|
1765 | }
|
---|
1766 | assert( (pTos->flags & MEM_Dyn)==0 );
|
---|
1767 | pTos--;
|
---|
1768 | if( c ) pc = pOp->p2-1;
|
---|
1769 | break;
|
---|
1770 | }
|
---|
1771 |
|
---|
1772 | /* Opcode: IsNull P1 P2 *
|
---|
1773 | **
|
---|
1774 | ** If any of the top abs(P1) values on the stack are NULL, then jump
|
---|
1775 | ** to P2. Pop the stack P1 times if P1>0. If P1<0 leave the stack
|
---|
1776 | ** unchanged.
|
---|
1777 | */
|
---|
1778 | case OP_IsNull: {
|
---|
1779 | int i, cnt;
|
---|
1780 | Mem *pTerm;
|
---|
1781 | cnt = pOp->p1;
|
---|
1782 | if( cnt<0 ) cnt = -cnt;
|
---|
1783 | pTerm = &pTos[1-cnt];
|
---|
1784 | assert( pTerm>=p->aStack );
|
---|
1785 | for(i=0; i<cnt; i++, pTerm++){
|
---|
1786 | if( pTerm->flags & MEM_Null ){
|
---|
1787 | pc = pOp->p2-1;
|
---|
1788 | break;
|
---|
1789 | }
|
---|
1790 | }
|
---|
1791 | if( pOp->p1>0 ) popStack(&pTos, cnt);
|
---|
1792 | break;
|
---|
1793 | }
|
---|
1794 |
|
---|
1795 | /* Opcode: NotNull P1 P2 *
|
---|
1796 | **
|
---|
1797 | ** Jump to P2 if the top P1 values on the stack are all not NULL. Pop the
|
---|
1798 | ** stack if P1 times if P1 is greater than zero. If P1 is less than
|
---|
1799 | ** zero then leave the stack unchanged.
|
---|
1800 | */
|
---|
1801 | case OP_NotNull: {
|
---|
1802 | int i, cnt;
|
---|
1803 | cnt = pOp->p1;
|
---|
1804 | if( cnt<0 ) cnt = -cnt;
|
---|
1805 | assert( &pTos[1-cnt] >= p->aStack );
|
---|
1806 | for(i=0; i<cnt && (pTos[1+i-cnt].flags & MEM_Null)==0; i++){}
|
---|
1807 | if( i>=cnt ) pc = pOp->p2-1;
|
---|
1808 | if( pOp->p1>0 ) popStack(&pTos, cnt);
|
---|
1809 | break;
|
---|
1810 | }
|
---|
1811 |
|
---|
1812 | /* Opcode: MakeRecord P1 P2 *
|
---|
1813 | **
|
---|
1814 | ** Convert the top P1 entries of the stack into a single entry
|
---|
1815 | ** suitable for use as a data record in a database table. The
|
---|
1816 | ** details of the format are irrelavant as long as the OP_Column
|
---|
1817 | ** opcode can decode the record later. Refer to source code
|
---|
1818 | ** comments for the details of the record format.
|
---|
1819 | **
|
---|
1820 | ** If P2 is true (non-zero) and one or more of the P1 entries
|
---|
1821 | ** that go into building the record is NULL, then add some extra
|
---|
1822 | ** bytes to the record to make it distinct for other entries created
|
---|
1823 | ** during the same run of the VDBE. The extra bytes added are a
|
---|
1824 | ** counter that is reset with each run of the VDBE, so records
|
---|
1825 | ** created this way will not necessarily be distinct across runs.
|
---|
1826 | ** But they should be distinct for transient tables (created using
|
---|
1827 | ** OP_OpenTemp) which is what they are intended for.
|
---|
1828 | **
|
---|
1829 | ** (Later:) The P2==1 option was intended to make NULLs distinct
|
---|
1830 | ** for the UNION operator. But I have since discovered that NULLs
|
---|
1831 | ** are indistinct for UNION. So this option is never used.
|
---|
1832 | */
|
---|
1833 | case OP_MakeRecord: {
|
---|
1834 | char *zNewRecord;
|
---|
1835 | int nByte;
|
---|
1836 | int nField;
|
---|
1837 | int i, j;
|
---|
1838 | int idxWidth;
|
---|
1839 | u32 addr;
|
---|
1840 | Mem *pRec;
|
---|
1841 | int addUnique = 0; /* True to cause bytes to be added to make the
|
---|
1842 | ** generated record distinct */
|
---|
1843 | char zTemp[NBFS]; /* Temp space for small records */
|
---|
1844 |
|
---|
1845 | /* Assuming the record contains N fields, the record format looks
|
---|
1846 | ** like this:
|
---|
1847 | **
|
---|
1848 | ** -------------------------------------------------------------------
|
---|
1849 | ** | idx0 | idx1 | ... | idx(N-1) | idx(N) | data0 | ... | data(N-1) |
|
---|
1850 | ** -------------------------------------------------------------------
|
---|
1851 | **
|
---|
1852 | ** All data fields are converted to strings before being stored and
|
---|
1853 | ** are stored with their null terminators. NULL entries omit the
|
---|
1854 | ** null terminator. Thus an empty string uses 1 byte and a NULL uses
|
---|
1855 | ** zero bytes. Data(0) is taken from the lowest element of the stack
|
---|
1856 | ** and data(N-1) is the top of the stack.
|
---|
1857 | **
|
---|
1858 | ** Each of the idx() entries is either 1, 2, or 3 bytes depending on
|
---|
1859 | ** how big the total record is. Idx(0) contains the offset to the start
|
---|
1860 | ** of data(0). Idx(k) contains the offset to the start of data(k).
|
---|
1861 | ** Idx(N) contains the total number of bytes in the record.
|
---|
1862 | */
|
---|
1863 | nField = pOp->p1;
|
---|
1864 | pRec = &pTos[1-nField];
|
---|
1865 | assert( pRec>=p->aStack );
|
---|
1866 | nByte = 0;
|
---|
1867 | for(i=0; i<nField; i++, pRec++){
|
---|
1868 | if( pRec->flags & MEM_Null ){
|
---|
1869 | addUnique = pOp->p2;
|
---|
1870 | }else{
|
---|
1871 | Stringify(pRec);
|
---|
1872 | nByte += pRec->n;
|
---|
1873 | }
|
---|
1874 | }
|
---|
1875 | if( addUnique ) nByte += sizeof(p->uniqueCnt);
|
---|
1876 | if( nByte + nField + 1 < 256 ){
|
---|
1877 | idxWidth = 1;
|
---|
1878 | }else if( nByte + 2*nField + 2 < 65536 ){
|
---|
1879 | idxWidth = 2;
|
---|
1880 | }else{
|
---|
1881 | idxWidth = 3;
|
---|
1882 | }
|
---|
1883 | nByte += idxWidth*(nField + 1);
|
---|
1884 | if( nByte>MAX_BYTES_PER_ROW ){
|
---|
1885 | rc = SQLITE_TOOBIG;
|
---|
1886 | goto abort_due_to_error;
|
---|
1887 | }
|
---|
1888 | if( nByte<=NBFS ){
|
---|
1889 | zNewRecord = zTemp;
|
---|
1890 | }else{
|
---|
1891 | zNewRecord = sqliteMallocRaw( nByte );
|
---|
1892 | if( zNewRecord==0 ) goto no_mem;
|
---|
1893 | }
|
---|
1894 | j = 0;
|
---|
1895 | addr = idxWidth*(nField+1) + addUnique*sizeof(p->uniqueCnt);
|
---|
1896 | for(i=0, pRec=&pTos[1-nField]; i<nField; i++, pRec++){
|
---|
1897 | zNewRecord[j++] = addr & 0xff;
|
---|
1898 | if( idxWidth>1 ){
|
---|
1899 | zNewRecord[j++] = (addr>>8)&0xff;
|
---|
1900 | if( idxWidth>2 ){
|
---|
1901 | zNewRecord[j++] = (addr>>16)&0xff;
|
---|
1902 | }
|
---|
1903 | }
|
---|
1904 | if( (pRec->flags & MEM_Null)==0 ){
|
---|
1905 | addr += pRec->n;
|
---|
1906 | }
|
---|
1907 | }
|
---|
1908 | zNewRecord[j++] = addr & 0xff;
|
---|
1909 | if( idxWidth>1 ){
|
---|
1910 | zNewRecord[j++] = (addr>>8)&0xff;
|
---|
1911 | if( idxWidth>2 ){
|
---|
1912 | zNewRecord[j++] = (addr>>16)&0xff;
|
---|
1913 | }
|
---|
1914 | }
|
---|
1915 | if( addUnique ){
|
---|
1916 | memcpy(&zNewRecord[j], &p->uniqueCnt, sizeof(p->uniqueCnt));
|
---|
1917 | p->uniqueCnt++;
|
---|
1918 | j += sizeof(p->uniqueCnt);
|
---|
1919 | }
|
---|
1920 | for(i=0, pRec=&pTos[1-nField]; i<nField; i++, pRec++){
|
---|
1921 | if( (pRec->flags & MEM_Null)==0 ){
|
---|
1922 | memcpy(&zNewRecord[j], pRec->z, pRec->n);
|
---|
1923 | j += pRec->n;
|
---|
1924 | }
|
---|
1925 | }
|
---|
1926 | popStack(&pTos, nField);
|
---|
1927 | pTos++;
|
---|
1928 | pTos->n = nByte;
|
---|
1929 | if( nByte<=NBFS ){
|
---|
1930 | assert( zNewRecord==zTemp );
|
---|
1931 | memcpy(pTos->zShort, zTemp, nByte);
|
---|
1932 | pTos->z = pTos->zShort;
|
---|
1933 | pTos->flags = MEM_Str | MEM_Short;
|
---|
1934 | }else{
|
---|
1935 | assert( zNewRecord!=zTemp );
|
---|
1936 | pTos->z = zNewRecord;
|
---|
1937 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
1938 | }
|
---|
1939 | break;
|
---|
1940 | }
|
---|
1941 |
|
---|
1942 | /* Opcode: MakeKey P1 P2 P3
|
---|
1943 | **
|
---|
1944 | ** Convert the top P1 entries of the stack into a single entry suitable
|
---|
1945 | ** for use as the key in an index. The top P1 records are
|
---|
1946 | ** converted to strings and merged. The null-terminators
|
---|
1947 | ** are retained and used as separators.
|
---|
1948 | ** The lowest entry in the stack is the first field and the top of the
|
---|
1949 | ** stack becomes the last.
|
---|
1950 | **
|
---|
1951 | ** If P2 is not zero, then the original entries remain on the stack
|
---|
1952 | ** and the new key is pushed on top. If P2 is zero, the original
|
---|
1953 | ** data is popped off the stack first then the new key is pushed
|
---|
1954 | ** back in its place.
|
---|
1955 | **
|
---|
1956 | ** P3 is a string that is P1 characters long. Each character is either
|
---|
1957 | ** an 'n' or a 't' to indicates if the argument should be intepreted as
|
---|
1958 | ** numeric or text type. The first character of P3 corresponds to the
|
---|
1959 | ** lowest element on the stack. If P3 is NULL then all arguments are
|
---|
1960 | ** assumed to be of the numeric type.
|
---|
1961 | **
|
---|
1962 | ** The type makes a difference in that text-type fields may not be
|
---|
1963 | ** introduced by 'b' (as described in the next paragraph). The
|
---|
1964 | ** first character of a text-type field must be either 'a' (if it is NULL)
|
---|
1965 | ** or 'c'. Numeric fields will be introduced by 'b' if their content
|
---|
1966 | ** looks like a well-formed number. Otherwise the 'a' or 'c' will be
|
---|
1967 | ** used.
|
---|
1968 | **
|
---|
1969 | ** The key is a concatenation of fields. Each field is terminated by
|
---|
1970 | ** a single 0x00 character. A NULL field is introduced by an 'a' and
|
---|
1971 | ** is followed immediately by its 0x00 terminator. A numeric field is
|
---|
1972 | ** introduced by a single character 'b' and is followed by a sequence
|
---|
1973 | ** of characters that represent the number such that a comparison of
|
---|
1974 | ** the character string using memcpy() sorts the numbers in numerical
|
---|
1975 | ** order. The character strings for numbers are generated using the
|
---|
1976 | ** sqliteRealToSortable() function. A text field is introduced by a
|
---|
1977 | ** 'c' character and is followed by the exact text of the field. The
|
---|
1978 | ** use of an 'a', 'b', or 'c' character at the beginning of each field
|
---|
1979 | ** guarantees that NULLs sort before numbers and that numbers sort
|
---|
1980 | ** before text. 0x00 characters do not occur except as separators
|
---|
1981 | ** between fields.
|
---|
1982 | **
|
---|
1983 | ** See also: MakeIdxKey, SortMakeKey
|
---|
1984 | */
|
---|
1985 | /* Opcode: MakeIdxKey P1 P2 P3
|
---|
1986 | **
|
---|
1987 | ** Convert the top P1 entries of the stack into a single entry suitable
|
---|
1988 | ** for use as the key in an index. In addition, take one additional integer
|
---|
1989 | ** off of the stack, treat that integer as a four-byte record number, and
|
---|
1990 | ** append the four bytes to the key. Thus a total of P1+1 entries are
|
---|
1991 | ** popped from the stack for this instruction and a single entry is pushed
|
---|
1992 | ** back. The first P1 entries that are popped are strings and the last
|
---|
1993 | ** entry (the lowest on the stack) is an integer record number.
|
---|
1994 | **
|
---|
1995 | ** The converstion of the first P1 string entries occurs just like in
|
---|
1996 | ** MakeKey. Each entry is separated from the others by a null.
|
---|
1997 | ** The entire concatenation is null-terminated. The lowest entry
|
---|
1998 | ** in the stack is the first field and the top of the stack becomes the
|
---|
1999 | ** last.
|
---|
2000 | **
|
---|
2001 | ** If P2 is not zero and one or more of the P1 entries that go into the
|
---|
2002 | ** generated key is NULL, then jump to P2 after the new key has been
|
---|
2003 | ** pushed on the stack. In other words, jump to P2 if the key is
|
---|
2004 | ** guaranteed to be unique. This jump can be used to skip a subsequent
|
---|
2005 | ** uniqueness test.
|
---|
2006 | **
|
---|
2007 | ** P3 is a string that is P1 characters long. Each character is either
|
---|
2008 | ** an 'n' or a 't' to indicates if the argument should be numeric or
|
---|
2009 | ** text. The first character corresponds to the lowest element on the
|
---|
2010 | ** stack. If P3 is null then all arguments are assumed to be numeric.
|
---|
2011 | **
|
---|
2012 | ** See also: MakeKey, SortMakeKey
|
---|
2013 | */
|
---|
2014 | case OP_MakeIdxKey:
|
---|
2015 | case OP_MakeKey: {
|
---|
2016 | char *zNewKey;
|
---|
2017 | int nByte;
|
---|
2018 | int nField;
|
---|
2019 | int addRowid;
|
---|
2020 | int i, j;
|
---|
2021 | int containsNull = 0;
|
---|
2022 | Mem *pRec;
|
---|
2023 | char zTemp[NBFS];
|
---|
2024 |
|
---|
2025 | addRowid = pOp->opcode==OP_MakeIdxKey;
|
---|
2026 | nField = pOp->p1;
|
---|
2027 | pRec = &pTos[1-nField];
|
---|
2028 | assert( pRec>=p->aStack );
|
---|
2029 | nByte = 0;
|
---|
2030 | for(j=0, i=0; i<nField; i++, j++, pRec++){
|
---|
2031 | int flags = pRec->flags;
|
---|
2032 | int len;
|
---|
2033 | char *z;
|
---|
2034 | if( flags & MEM_Null ){
|
---|
2035 | nByte += 2;
|
---|
2036 | containsNull = 1;
|
---|
2037 | }else if( pOp->p3 && pOp->p3[j]=='t' ){
|
---|
2038 | Stringify(pRec);
|
---|
2039 | pRec->flags &= ~(MEM_Int|MEM_Real);
|
---|
2040 | nByte += pRec->n+1;
|
---|
2041 | }else if( (flags & (MEM_Real|MEM_Int))!=0 || sqliteIsNumber(pRec->z) ){
|
---|
2042 | if( (flags & (MEM_Real|MEM_Int))==MEM_Int ){
|
---|
2043 | pRec->r = pRec->i;
|
---|
2044 | }else if( (flags & (MEM_Real|MEM_Int))==0 ){
|
---|
2045 | pRec->r = sqliteAtoF(pRec->z, 0);
|
---|
2046 | }
|
---|
2047 | Release(pRec);
|
---|
2048 | z = pRec->zShort;
|
---|
2049 | sqliteRealToSortable(pRec->r, z);
|
---|
2050 | len = strlen(z);
|
---|
2051 | pRec->z = 0;
|
---|
2052 | pRec->flags = MEM_Real;
|
---|
2053 | pRec->n = len+1;
|
---|
2054 | nByte += pRec->n+1;
|
---|
2055 | }else{
|
---|
2056 | nByte += pRec->n+1;
|
---|
2057 | }
|
---|
2058 | }
|
---|
2059 | if( nByte+sizeof(u32)>MAX_BYTES_PER_ROW ){
|
---|
2060 | rc = SQLITE_TOOBIG;
|
---|
2061 | goto abort_due_to_error;
|
---|
2062 | }
|
---|
2063 | if( addRowid ) nByte += sizeof(u32);
|
---|
2064 | if( nByte<=NBFS ){
|
---|
2065 | zNewKey = zTemp;
|
---|
2066 | }else{
|
---|
2067 | zNewKey = sqliteMallocRaw( nByte );
|
---|
2068 | if( zNewKey==0 ) goto no_mem;
|
---|
2069 | }
|
---|
2070 | j = 0;
|
---|
2071 | pRec = &pTos[1-nField];
|
---|
2072 | for(i=0; i<nField; i++, pRec++){
|
---|
2073 | if( pRec->flags & MEM_Null ){
|
---|
2074 | zNewKey[j++] = 'a';
|
---|
2075 | zNewKey[j++] = 0;
|
---|
2076 | }else if( pRec->flags==MEM_Real ){
|
---|
2077 | zNewKey[j++] = 'b';
|
---|
2078 | memcpy(&zNewKey[j], pRec->zShort, pRec->n);
|
---|
2079 | j += pRec->n;
|
---|
2080 | }else{
|
---|
2081 | assert( pRec->flags & MEM_Str );
|
---|
2082 | zNewKey[j++] = 'c';
|
---|
2083 | memcpy(&zNewKey[j], pRec->z, pRec->n);
|
---|
2084 | j += pRec->n;
|
---|
2085 | }
|
---|
2086 | }
|
---|
2087 | if( addRowid ){
|
---|
2088 | u32 iKey;
|
---|
2089 | pRec = &pTos[-nField];
|
---|
2090 | assert( pRec>=p->aStack );
|
---|
2091 | Integerify(pRec);
|
---|
2092 | iKey = intToKey(pRec->i);
|
---|
2093 | memcpy(&zNewKey[j], &iKey, sizeof(u32));
|
---|
2094 | popStack(&pTos, nField+1);
|
---|
2095 | if( pOp->p2 && containsNull ) pc = pOp->p2 - 1;
|
---|
2096 | }else{
|
---|
2097 | if( pOp->p2==0 ) popStack(&pTos, nField);
|
---|
2098 | }
|
---|
2099 | pTos++;
|
---|
2100 | pTos->n = nByte;
|
---|
2101 | if( nByte<=NBFS ){
|
---|
2102 | assert( zNewKey==zTemp );
|
---|
2103 | pTos->z = pTos->zShort;
|
---|
2104 | memcpy(pTos->zShort, zTemp, nByte);
|
---|
2105 | pTos->flags = MEM_Str | MEM_Short;
|
---|
2106 | }else{
|
---|
2107 | pTos->z = zNewKey;
|
---|
2108 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
2109 | }
|
---|
2110 | break;
|
---|
2111 | }
|
---|
2112 |
|
---|
2113 | /* Opcode: IncrKey * * *
|
---|
2114 | **
|
---|
2115 | ** The top of the stack should contain an index key generated by
|
---|
2116 | ** The MakeKey opcode. This routine increases the least significant
|
---|
2117 | ** byte of that key by one. This is used so that the MoveTo opcode
|
---|
2118 | ** will move to the first entry greater than the key rather than to
|
---|
2119 | ** the key itself.
|
---|
2120 | */
|
---|
2121 | case OP_IncrKey: {
|
---|
2122 | assert( pTos>=p->aStack );
|
---|
2123 | /* The IncrKey opcode is only applied to keys generated by
|
---|
2124 | ** MakeKey or MakeIdxKey and the results of those operands
|
---|
2125 | ** are always dynamic strings or zShort[] strings. So we
|
---|
2126 | ** are always free to modify the string in place.
|
---|
2127 | */
|
---|
2128 | assert( pTos->flags & (MEM_Dyn|MEM_Short) );
|
---|
2129 | pTos->z[pTos->n-1]++;
|
---|
2130 | break;
|
---|
2131 | }
|
---|
2132 |
|
---|
2133 | /* Opcode: Checkpoint P1 * *
|
---|
2134 | **
|
---|
2135 | ** Begin a checkpoint. A checkpoint is the beginning of a operation that
|
---|
2136 | ** is part of a larger transaction but which might need to be rolled back
|
---|
2137 | ** itself without effecting the containing transaction. A checkpoint will
|
---|
2138 | ** be automatically committed or rollback when the VDBE halts.
|
---|
2139 | **
|
---|
2140 | ** The checkpoint is begun on the database file with index P1. The main
|
---|
2141 | ** database file has an index of 0 and the file used for temporary tables
|
---|
2142 | ** has an index of 1.
|
---|
2143 | */
|
---|
2144 | case OP_Checkpoint: {
|
---|
2145 | int i = pOp->p1;
|
---|
2146 | if( i>=0 && i<db->nDb && db->aDb[i].pBt && db->aDb[i].inTrans==1 ){
|
---|
2147 | rc = sqliteBtreeBeginCkpt(db->aDb[i].pBt);
|
---|
2148 | if( rc==SQLITE_OK ) db->aDb[i].inTrans = 2;
|
---|
2149 | }
|
---|
2150 | break;
|
---|
2151 | }
|
---|
2152 |
|
---|
2153 | /* Opcode: Transaction P1 * *
|
---|
2154 | **
|
---|
2155 | ** Begin a transaction. The transaction ends when a Commit or Rollback
|
---|
2156 | ** opcode is encountered. Depending on the ON CONFLICT setting, the
|
---|
2157 | ** transaction might also be rolled back if an error is encountered.
|
---|
2158 | **
|
---|
2159 | ** P1 is the index of the database file on which the transaction is
|
---|
2160 | ** started. Index 0 is the main database file and index 1 is the
|
---|
2161 | ** file used for temporary tables.
|
---|
2162 | **
|
---|
2163 | ** A write lock is obtained on the database file when a transaction is
|
---|
2164 | ** started. No other process can read or write the file while the
|
---|
2165 | ** transaction is underway. Starting a transaction also creates a
|
---|
2166 | ** rollback journal. A transaction must be started before any changes
|
---|
2167 | ** can be made to the database.
|
---|
2168 | */
|
---|
2169 | case OP_Transaction: {
|
---|
2170 | int busy = 1;
|
---|
2171 | int i = pOp->p1;
|
---|
2172 | assert( i>=0 && i<db->nDb );
|
---|
2173 | if( db->aDb[i].inTrans ) break;
|
---|
2174 | while( db->aDb[i].pBt!=0 && busy ){
|
---|
2175 | rc = sqliteBtreeBeginTrans(db->aDb[i].pBt);
|
---|
2176 | switch( rc ){
|
---|
2177 | case SQLITE_BUSY: {
|
---|
2178 | if( db->xBusyCallback==0 ){
|
---|
2179 | p->pc = pc;
|
---|
2180 | p->undoTransOnError = 1;
|
---|
2181 | p->rc = SQLITE_BUSY;
|
---|
2182 | p->pTos = pTos;
|
---|
2183 | return SQLITE_BUSY;
|
---|
2184 | }else if( (*db->xBusyCallback)(db->pBusyArg, "", busy++)==0 ){
|
---|
2185 | sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
|
---|
2186 | busy = 0;
|
---|
2187 | }
|
---|
2188 | break;
|
---|
2189 | }
|
---|
2190 | case SQLITE_READONLY: {
|
---|
2191 | rc = SQLITE_OK;
|
---|
2192 | /* Fall thru into the next case */
|
---|
2193 | }
|
---|
2194 | case SQLITE_OK: {
|
---|
2195 | p->inTempTrans = 0;
|
---|
2196 | busy = 0;
|
---|
2197 | break;
|
---|
2198 | }
|
---|
2199 | default: {
|
---|
2200 | goto abort_due_to_error;
|
---|
2201 | }
|
---|
2202 | }
|
---|
2203 | }
|
---|
2204 | db->aDb[i].inTrans = 1;
|
---|
2205 | p->undoTransOnError = 1;
|
---|
2206 | break;
|
---|
2207 | }
|
---|
2208 |
|
---|
2209 | /* Opcode: Commit * * *
|
---|
2210 | **
|
---|
2211 | ** Cause all modifications to the database that have been made since the
|
---|
2212 | ** last Transaction to actually take effect. No additional modifications
|
---|
2213 | ** are allowed until another transaction is started. The Commit instruction
|
---|
2214 | ** deletes the journal file and releases the write lock on the database.
|
---|
2215 | ** A read lock continues to be held if there are still cursors open.
|
---|
2216 | */
|
---|
2217 | case OP_Commit: {
|
---|
2218 | int i;
|
---|
2219 | if( db->xCommitCallback!=0 ){
|
---|
2220 | if( sqliteSafetyOff(db) ) goto abort_due_to_misuse;
|
---|
2221 | if( db->xCommitCallback(db->pCommitArg)!=0 ){
|
---|
2222 | rc = SQLITE_CONSTRAINT;
|
---|
2223 | }
|
---|
2224 | if( sqliteSafetyOn(db) ) goto abort_due_to_misuse;
|
---|
2225 | }
|
---|
2226 | for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
|
---|
2227 | if( db->aDb[i].inTrans ){
|
---|
2228 | rc = sqliteBtreeCommit(db->aDb[i].pBt);
|
---|
2229 | db->aDb[i].inTrans = 0;
|
---|
2230 | }
|
---|
2231 | }
|
---|
2232 | if( rc==SQLITE_OK ){
|
---|
2233 | sqliteCommitInternalChanges(db);
|
---|
2234 | }else{
|
---|
2235 | sqliteRollbackAll(db);
|
---|
2236 | }
|
---|
2237 | break;
|
---|
2238 | }
|
---|
2239 |
|
---|
2240 | /* Opcode: Rollback P1 * *
|
---|
2241 | **
|
---|
2242 | ** Cause all modifications to the database that have been made since the
|
---|
2243 | ** last Transaction to be undone. The database is restored to its state
|
---|
2244 | ** before the Transaction opcode was executed. No additional modifications
|
---|
2245 | ** are allowed until another transaction is started.
|
---|
2246 | **
|
---|
2247 | ** P1 is the index of the database file that is committed. An index of 0
|
---|
2248 | ** is used for the main database and an index of 1 is used for the file used
|
---|
2249 | ** to hold temporary tables.
|
---|
2250 | **
|
---|
2251 | ** This instruction automatically closes all cursors and releases both
|
---|
2252 | ** the read and write locks on the indicated database.
|
---|
2253 | */
|
---|
2254 | case OP_Rollback: {
|
---|
2255 | sqliteRollbackAll(db);
|
---|
2256 | break;
|
---|
2257 | }
|
---|
2258 |
|
---|
2259 | /* Opcode: ReadCookie P1 P2 *
|
---|
2260 | **
|
---|
2261 | ** Read cookie number P2 from database P1 and push it onto the stack.
|
---|
2262 | ** P2==0 is the schema version. P2==1 is the database format.
|
---|
2263 | ** P2==2 is the recommended pager cache size, and so forth. P1==0 is
|
---|
2264 | ** the main database file and P1==1 is the database file used to store
|
---|
2265 | ** temporary tables.
|
---|
2266 | **
|
---|
2267 | ** There must be a read-lock on the database (either a transaction
|
---|
2268 | ** must be started or there must be an open cursor) before
|
---|
2269 | ** executing this instruction.
|
---|
2270 | */
|
---|
2271 | case OP_ReadCookie: {
|
---|
2272 | int aMeta[SQLITE_N_BTREE_META];
|
---|
2273 | assert( pOp->p2<SQLITE_N_BTREE_META );
|
---|
2274 | assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
---|
2275 | assert( db->aDb[pOp->p1].pBt!=0 );
|
---|
2276 | rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta);
|
---|
2277 | pTos++;
|
---|
2278 | pTos->i = aMeta[1+pOp->p2];
|
---|
2279 | pTos->flags = MEM_Int;
|
---|
2280 | break;
|
---|
2281 | }
|
---|
2282 |
|
---|
2283 | /* Opcode: SetCookie P1 P2 *
|
---|
2284 | **
|
---|
2285 | ** Write the top of the stack into cookie number P2 of database P1.
|
---|
2286 | ** P2==0 is the schema version. P2==1 is the database format.
|
---|
2287 | ** P2==2 is the recommended pager cache size, and so forth. P1==0 is
|
---|
2288 | ** the main database file and P1==1 is the database file used to store
|
---|
2289 | ** temporary tables.
|
---|
2290 | **
|
---|
2291 | ** A transaction must be started before executing this opcode.
|
---|
2292 | */
|
---|
2293 | case OP_SetCookie: {
|
---|
2294 | int aMeta[SQLITE_N_BTREE_META];
|
---|
2295 | assert( pOp->p2<SQLITE_N_BTREE_META );
|
---|
2296 | assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
---|
2297 | assert( db->aDb[pOp->p1].pBt!=0 );
|
---|
2298 | assert( pTos>=p->aStack );
|
---|
2299 | Integerify(pTos)
|
---|
2300 | rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta);
|
---|
2301 | if( rc==SQLITE_OK ){
|
---|
2302 | aMeta[1+pOp->p2] = pTos->i;
|
---|
2303 | rc = sqliteBtreeUpdateMeta(db->aDb[pOp->p1].pBt, aMeta);
|
---|
2304 | }
|
---|
2305 | Release(pTos);
|
---|
2306 | pTos--;
|
---|
2307 | break;
|
---|
2308 | }
|
---|
2309 |
|
---|
2310 | /* Opcode: VerifyCookie P1 P2 *
|
---|
2311 | **
|
---|
2312 | ** Check the value of global database parameter number 0 (the
|
---|
2313 | ** schema version) and make sure it is equal to P2.
|
---|
2314 | ** P1 is the database number which is 0 for the main database file
|
---|
2315 | ** and 1 for the file holding temporary tables and some higher number
|
---|
2316 | ** for auxiliary databases.
|
---|
2317 | **
|
---|
2318 | ** The cookie changes its value whenever the database schema changes.
|
---|
2319 | ** This operation is used to detect when that the cookie has changed
|
---|
2320 | ** and that the current process needs to reread the schema.
|
---|
2321 | **
|
---|
2322 | ** Either a transaction needs to have been started or an OP_Open needs
|
---|
2323 | ** to be executed (to establish a read lock) before this opcode is
|
---|
2324 | ** invoked.
|
---|
2325 | */
|
---|
2326 | case OP_VerifyCookie: {
|
---|
2327 | int aMeta[SQLITE_N_BTREE_META];
|
---|
2328 | assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
---|
2329 | rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta);
|
---|
2330 | if( rc==SQLITE_OK && aMeta[1]!=pOp->p2 ){
|
---|
2331 | sqliteSetString(&p->zErrMsg, "database schema has changed", (char*)0);
|
---|
2332 | rc = SQLITE_SCHEMA;
|
---|
2333 | }
|
---|
2334 | break;
|
---|
2335 | }
|
---|
2336 |
|
---|
2337 | /* Opcode: OpenRead P1 P2 P3
|
---|
2338 | **
|
---|
2339 | ** Open a read-only cursor for the database table whose root page is
|
---|
2340 | ** P2 in a database file. The database file is determined by an
|
---|
2341 | ** integer from the top of the stack. 0 means the main database and
|
---|
2342 | ** 1 means the database used for temporary tables. Give the new
|
---|
2343 | ** cursor an identifier of P1. The P1 values need not be contiguous
|
---|
2344 | ** but all P1 values should be small integers. It is an error for
|
---|
2345 | ** P1 to be negative.
|
---|
2346 | **
|
---|
2347 | ** If P2==0 then take the root page number from the next of the stack.
|
---|
2348 | **
|
---|
2349 | ** There will be a read lock on the database whenever there is an
|
---|
2350 | ** open cursor. If the database was unlocked prior to this instruction
|
---|
2351 | ** then a read lock is acquired as part of this instruction. A read
|
---|
2352 | ** lock allows other processes to read the database but prohibits
|
---|
2353 | ** any other process from modifying the database. The read lock is
|
---|
2354 | ** released when all cursors are closed. If this instruction attempts
|
---|
2355 | ** to get a read lock but fails, the script terminates with an
|
---|
2356 | ** SQLITE_BUSY error code.
|
---|
2357 | **
|
---|
2358 | ** The P3 value is the name of the table or index being opened.
|
---|
2359 | ** The P3 value is not actually used by this opcode and may be
|
---|
2360 | ** omitted. But the code generator usually inserts the index or
|
---|
2361 | ** table name into P3 to make the code easier to read.
|
---|
2362 | **
|
---|
2363 | ** See also OpenWrite.
|
---|
2364 | */
|
---|
2365 | /* Opcode: OpenWrite P1 P2 P3
|
---|
2366 | **
|
---|
2367 | ** Open a read/write cursor named P1 on the table or index whose root
|
---|
2368 | ** page is P2. If P2==0 then take the root page number from the stack.
|
---|
2369 | **
|
---|
2370 | ** The P3 value is the name of the table or index being opened.
|
---|
2371 | ** The P3 value is not actually used by this opcode and may be
|
---|
2372 | ** omitted. But the code generator usually inserts the index or
|
---|
2373 | ** table name into P3 to make the code easier to read.
|
---|
2374 | **
|
---|
2375 | ** This instruction works just like OpenRead except that it opens the cursor
|
---|
2376 | ** in read/write mode. For a given table, there can be one or more read-only
|
---|
2377 | ** cursors or a single read/write cursor but not both.
|
---|
2378 | **
|
---|
2379 | ** See also OpenRead.
|
---|
2380 | */
|
---|
2381 | case OP_OpenRead:
|
---|
2382 | case OP_OpenWrite: {
|
---|
2383 | int busy = 0;
|
---|
2384 | int i = pOp->p1;
|
---|
2385 | int p2 = pOp->p2;
|
---|
2386 | int wrFlag;
|
---|
2387 | Btree *pX;
|
---|
2388 | int iDb;
|
---|
2389 |
|
---|
2390 | assert( pTos>=p->aStack );
|
---|
2391 | Integerify(pTos);
|
---|
2392 | iDb = pTos->i;
|
---|
2393 | pTos--;
|
---|
2394 | assert( iDb>=0 && iDb<db->nDb );
|
---|
2395 | pX = db->aDb[iDb].pBt;
|
---|
2396 | assert( pX!=0 );
|
---|
2397 | wrFlag = pOp->opcode==OP_OpenWrite;
|
---|
2398 | if( p2<=0 ){
|
---|
2399 | assert( pTos>=p->aStack );
|
---|
2400 | Integerify(pTos);
|
---|
2401 | p2 = pTos->i;
|
---|
2402 | pTos--;
|
---|
2403 | if( p2<2 ){
|
---|
2404 | sqliteSetString(&p->zErrMsg, "root page number less than 2", (char*)0);
|
---|
2405 | rc = SQLITE_INTERNAL;
|
---|
2406 | break;
|
---|
2407 | }
|
---|
2408 | }
|
---|
2409 | assert( i>=0 );
|
---|
2410 | if( expandCursorArraySize(p, i) ) goto no_mem;
|
---|
2411 | sqliteVdbeCleanupCursor(&p->aCsr[i]);
|
---|
2412 | memset(&p->aCsr[i], 0, sizeof(Cursor));
|
---|
2413 | p->aCsr[i].nullRow = 1;
|
---|
2414 | if( pX==0 ) break;
|
---|
2415 | do{
|
---|
2416 | rc = sqliteBtreeCursor(pX, p2, wrFlag, &p->aCsr[i].pCursor);
|
---|
2417 | switch( rc ){
|
---|
2418 | case SQLITE_BUSY: {
|
---|
2419 | if( db->xBusyCallback==0 ){
|
---|
2420 | p->pc = pc;
|
---|
2421 | p->rc = SQLITE_BUSY;
|
---|
2422 | p->pTos = &pTos[1 + (pOp->p2<=0)]; /* Operands must remain on stack */
|
---|
2423 | return SQLITE_BUSY;
|
---|
2424 | }else if( (*db->xBusyCallback)(db->pBusyArg, pOp->p3, ++busy)==0 ){
|
---|
2425 | sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
|
---|
2426 | busy = 0;
|
---|
2427 | }
|
---|
2428 | break;
|
---|
2429 | }
|
---|
2430 | case SQLITE_OK: {
|
---|
2431 | busy = 0;
|
---|
2432 | break;
|
---|
2433 | }
|
---|
2434 | default: {
|
---|
2435 | goto abort_due_to_error;
|
---|
2436 | }
|
---|
2437 | }
|
---|
2438 | }while( busy );
|
---|
2439 | break;
|
---|
2440 | }
|
---|
2441 |
|
---|
2442 | /* Opcode: OpenTemp P1 P2 *
|
---|
2443 | **
|
---|
2444 | ** Open a new cursor to a transient table.
|
---|
2445 | ** The transient cursor is always opened read/write even if
|
---|
2446 | ** the main database is read-only. The transient table is deleted
|
---|
2447 | ** automatically when the cursor is closed.
|
---|
2448 | **
|
---|
2449 | ** The cursor points to a BTree table if P2==0 and to a BTree index
|
---|
2450 | ** if P2==1. A BTree table must have an integer key and can have arbitrary
|
---|
2451 | ** data. A BTree index has no data but can have an arbitrary key.
|
---|
2452 | **
|
---|
2453 | ** This opcode is used for tables that exist for the duration of a single
|
---|
2454 | ** SQL statement only. Tables created using CREATE TEMPORARY TABLE
|
---|
2455 | ** are opened using OP_OpenRead or OP_OpenWrite. "Temporary" in the
|
---|
2456 | ** context of this opcode means for the duration of a single SQL statement
|
---|
2457 | ** whereas "Temporary" in the context of CREATE TABLE means for the duration
|
---|
2458 | ** of the connection to the database. Same word; different meanings.
|
---|
2459 | */
|
---|
2460 | case OP_OpenTemp: {
|
---|
2461 | int i = pOp->p1;
|
---|
2462 | Cursor *pCx;
|
---|
2463 | assert( i>=0 );
|
---|
2464 | if( expandCursorArraySize(p, i) ) goto no_mem;
|
---|
2465 | pCx = &p->aCsr[i];
|
---|
2466 | sqliteVdbeCleanupCursor(pCx);
|
---|
2467 | memset(pCx, 0, sizeof(*pCx));
|
---|
2468 | pCx->nullRow = 1;
|
---|
2469 | rc = sqliteBtreeFactory(db, 0, 1, TEMP_PAGES, &pCx->pBt);
|
---|
2470 |
|
---|
2471 | if( rc==SQLITE_OK ){
|
---|
2472 | rc = sqliteBtreeBeginTrans(pCx->pBt);
|
---|
2473 | }
|
---|
2474 | if( rc==SQLITE_OK ){
|
---|
2475 | if( pOp->p2 ){
|
---|
2476 | int pgno;
|
---|
2477 | rc = sqliteBtreeCreateIndex(pCx->pBt, &pgno);
|
---|
2478 | if( rc==SQLITE_OK ){
|
---|
2479 | rc = sqliteBtreeCursor(pCx->pBt, pgno, 1, &pCx->pCursor);
|
---|
2480 | }
|
---|
2481 | }else{
|
---|
2482 | rc = sqliteBtreeCursor(pCx->pBt, 2, 1, &pCx->pCursor);
|
---|
2483 | }
|
---|
2484 | }
|
---|
2485 | break;
|
---|
2486 | }
|
---|
2487 |
|
---|
2488 | /* Opcode: OpenPseudo P1 * *
|
---|
2489 | **
|
---|
2490 | ** Open a new cursor that points to a fake table that contains a single
|
---|
2491 | ** row of data. Any attempt to write a second row of data causes the
|
---|
2492 | ** first row to be deleted. All data is deleted when the cursor is
|
---|
2493 | ** closed.
|
---|
2494 | **
|
---|
2495 | ** A pseudo-table created by this opcode is useful for holding the
|
---|
2496 | ** NEW or OLD tables in a trigger.
|
---|
2497 | */
|
---|
2498 | case OP_OpenPseudo: {
|
---|
2499 | int i = pOp->p1;
|
---|
2500 | Cursor *pCx;
|
---|
2501 | assert( i>=0 );
|
---|
2502 | if( expandCursorArraySize(p, i) ) goto no_mem;
|
---|
2503 | pCx = &p->aCsr[i];
|
---|
2504 | sqliteVdbeCleanupCursor(pCx);
|
---|
2505 | memset(pCx, 0, sizeof(*pCx));
|
---|
2506 | pCx->nullRow = 1;
|
---|
2507 | pCx->pseudoTable = 1;
|
---|
2508 | break;
|
---|
2509 | }
|
---|
2510 |
|
---|
2511 | /* Opcode: Close P1 * *
|
---|
2512 | **
|
---|
2513 | ** Close a cursor previously opened as P1. If P1 is not
|
---|
2514 | ** currently open, this instruction is a no-op.
|
---|
2515 | */
|
---|
2516 | case OP_Close: {
|
---|
2517 | int i = pOp->p1;
|
---|
2518 | if( i>=0 && i<p->nCursor ){
|
---|
2519 | sqliteVdbeCleanupCursor(&p->aCsr[i]);
|
---|
2520 | }
|
---|
2521 | break;
|
---|
2522 | }
|
---|
2523 |
|
---|
2524 | /* Opcode: MoveTo P1 P2 *
|
---|
2525 | **
|
---|
2526 | ** Pop the top of the stack and use its value as a key. Reposition
|
---|
2527 | ** cursor P1 so that it points to an entry with a matching key. If
|
---|
2528 | ** the table contains no record with a matching key, then the cursor
|
---|
2529 | ** is left pointing at the first record that is greater than the key.
|
---|
2530 | ** If there are no records greater than the key and P2 is not zero,
|
---|
2531 | ** then an immediate jump to P2 is made.
|
---|
2532 | **
|
---|
2533 | ** See also: Found, NotFound, Distinct, MoveLt
|
---|
2534 | */
|
---|
2535 | /* Opcode: MoveLt P1 P2 *
|
---|
2536 | **
|
---|
2537 | ** Pop the top of the stack and use its value as a key. Reposition
|
---|
2538 | ** cursor P1 so that it points to the entry with the largest key that is
|
---|
2539 | ** less than the key popped from the stack.
|
---|
2540 | ** If there are no records less than than the key and P2
|
---|
2541 | ** is not zero then an immediate jump to P2 is made.
|
---|
2542 | **
|
---|
2543 | ** See also: MoveTo
|
---|
2544 | */
|
---|
2545 | case OP_MoveLt:
|
---|
2546 | case OP_MoveTo: {
|
---|
2547 | int i = pOp->p1;
|
---|
2548 | Cursor *pC;
|
---|
2549 |
|
---|
2550 | assert( pTos>=p->aStack );
|
---|
2551 | assert( i>=0 && i<p->nCursor );
|
---|
2552 | pC = &p->aCsr[i];
|
---|
2553 | if( pC->pCursor!=0 ){
|
---|
2554 | int res, oc;
|
---|
2555 | pC->nullRow = 0;
|
---|
2556 | if( pTos->flags & MEM_Int ){
|
---|
2557 | int iKey = intToKey(pTos->i);
|
---|
2558 | if( pOp->p2==0 && pOp->opcode==OP_MoveTo ){
|
---|
2559 | pC->movetoTarget = iKey;
|
---|
2560 | pC->deferredMoveto = 1;
|
---|
2561 | Release(pTos);
|
---|
2562 | pTos--;
|
---|
2563 | break;
|
---|
2564 | }
|
---|
2565 | sqliteBtreeMoveto(pC->pCursor, (char*)&iKey, sizeof(int), &res);
|
---|
2566 | pC->lastRecno = pTos->i;
|
---|
2567 | pC->recnoIsValid = res==0;
|
---|
2568 | }else{
|
---|
2569 | Stringify(pTos);
|
---|
2570 | sqliteBtreeMoveto(pC->pCursor, pTos->z, pTos->n, &res);
|
---|
2571 | pC->recnoIsValid = 0;
|
---|
2572 | }
|
---|
2573 | pC->deferredMoveto = 0;
|
---|
2574 | sqlite_search_count++;
|
---|
2575 | oc = pOp->opcode;
|
---|
2576 | if( oc==OP_MoveTo && res<0 ){
|
---|
2577 | sqliteBtreeNext(pC->pCursor, &res);
|
---|
2578 | pC->recnoIsValid = 0;
|
---|
2579 | if( res && pOp->p2>0 ){
|
---|
2580 | pc = pOp->p2 - 1;
|
---|
2581 | }
|
---|
2582 | }else if( oc==OP_MoveLt ){
|
---|
2583 | if( res>=0 ){
|
---|
2584 | sqliteBtreePrevious(pC->pCursor, &res);
|
---|
2585 | pC->recnoIsValid = 0;
|
---|
2586 | }else{
|
---|
2587 | /* res might be negative because the table is empty. Check to
|
---|
2588 | ** see if this is the case.
|
---|
2589 | */
|
---|
2590 | int keysize;
|
---|
2591 | res = sqliteBtreeKeySize(pC->pCursor,&keysize)!=0 || keysize==0;
|
---|
2592 | }
|
---|
2593 | if( res && pOp->p2>0 ){
|
---|
2594 | pc = pOp->p2 - 1;
|
---|
2595 | }
|
---|
2596 | }
|
---|
2597 | }
|
---|
2598 | Release(pTos);
|
---|
2599 | pTos--;
|
---|
2600 | break;
|
---|
2601 | }
|
---|
2602 |
|
---|
2603 | /* Opcode: Distinct P1 P2 *
|
---|
2604 | **
|
---|
2605 | ** Use the top of the stack as a string key. If a record with that key does
|
---|
2606 | ** not exist in the table of cursor P1, then jump to P2. If the record
|
---|
2607 | ** does already exist, then fall thru. The cursor is left pointing
|
---|
2608 | ** at the record if it exists. The key is not popped from the stack.
|
---|
2609 | **
|
---|
2610 | ** This operation is similar to NotFound except that this operation
|
---|
2611 | ** does not pop the key from the stack.
|
---|
2612 | **
|
---|
2613 | ** See also: Found, NotFound, MoveTo, IsUnique, NotExists
|
---|
2614 | */
|
---|
2615 | /* Opcode: Found P1 P2 *
|
---|
2616 | **
|
---|
2617 | ** Use the top of the stack as a string key. If a record with that key
|
---|
2618 | ** does exist in table of P1, then jump to P2. If the record
|
---|
2619 | ** does not exist, then fall thru. The cursor is left pointing
|
---|
2620 | ** to the record if it exists. The key is popped from the stack.
|
---|
2621 | **
|
---|
2622 | ** See also: Distinct, NotFound, MoveTo, IsUnique, NotExists
|
---|
2623 | */
|
---|
2624 | /* Opcode: NotFound P1 P2 *
|
---|
2625 | **
|
---|
2626 | ** Use the top of the stack as a string key. If a record with that key
|
---|
2627 | ** does not exist in table of P1, then jump to P2. If the record
|
---|
2628 | ** does exist, then fall thru. The cursor is left pointing to the
|
---|
2629 | ** record if it exists. The key is popped from the stack.
|
---|
2630 | **
|
---|
2631 | ** The difference between this operation and Distinct is that
|
---|
2632 | ** Distinct does not pop the key from the stack.
|
---|
2633 | **
|
---|
2634 | ** See also: Distinct, Found, MoveTo, NotExists, IsUnique
|
---|
2635 | */
|
---|
2636 | case OP_Distinct:
|
---|
2637 | case OP_NotFound:
|
---|
2638 | case OP_Found: {
|
---|
2639 | int i = pOp->p1;
|
---|
2640 | int alreadyExists = 0;
|
---|
2641 | Cursor *pC;
|
---|
2642 | assert( pTos>=p->aStack );
|
---|
2643 | assert( i>=0 && i<p->nCursor );
|
---|
2644 | if( (pC = &p->aCsr[i])->pCursor!=0 ){
|
---|
2645 | int res, rx;
|
---|
2646 | Stringify(pTos);
|
---|
2647 | rx = sqliteBtreeMoveto(pC->pCursor, pTos->z, pTos->n, &res);
|
---|
2648 | alreadyExists = rx==SQLITE_OK && res==0;
|
---|
2649 | pC->deferredMoveto = 0;
|
---|
2650 | }
|
---|
2651 | if( pOp->opcode==OP_Found ){
|
---|
2652 | if( alreadyExists ) pc = pOp->p2 - 1;
|
---|
2653 | }else{
|
---|
2654 | if( !alreadyExists ) pc = pOp->p2 - 1;
|
---|
2655 | }
|
---|
2656 | if( pOp->opcode!=OP_Distinct ){
|
---|
2657 | Release(pTos);
|
---|
2658 | pTos--;
|
---|
2659 | }
|
---|
2660 | break;
|
---|
2661 | }
|
---|
2662 |
|
---|
2663 | /* Opcode: IsUnique P1 P2 *
|
---|
2664 | **
|
---|
2665 | ** The top of the stack is an integer record number. Call this
|
---|
2666 | ** record number R. The next on the stack is an index key created
|
---|
2667 | ** using MakeIdxKey. Call it K. This instruction pops R from the
|
---|
2668 | ** stack but it leaves K unchanged.
|
---|
2669 | **
|
---|
2670 | ** P1 is an index. So all but the last four bytes of K are an
|
---|
2671 | ** index string. The last four bytes of K are a record number.
|
---|
2672 | **
|
---|
2673 | ** This instruction asks if there is an entry in P1 where the
|
---|
2674 | ** index string matches K but the record number is different
|
---|
2675 | ** from R. If there is no such entry, then there is an immediate
|
---|
2676 | ** jump to P2. If any entry does exist where the index string
|
---|
2677 | ** matches K but the record number is not R, then the record
|
---|
2678 | ** number for that entry is pushed onto the stack and control
|
---|
2679 | ** falls through to the next instruction.
|
---|
2680 | **
|
---|
2681 | ** See also: Distinct, NotFound, NotExists, Found
|
---|
2682 | */
|
---|
2683 | case OP_IsUnique: {
|
---|
2684 | int i = pOp->p1;
|
---|
2685 | Mem *pNos = &pTos[-1];
|
---|
2686 | BtCursor *pCrsr;
|
---|
2687 | int R;
|
---|
2688 |
|
---|
2689 | /* Pop the value R off the top of the stack
|
---|
2690 | */
|
---|
2691 | assert( pNos>=p->aStack );
|
---|
2692 | Integerify(pTos);
|
---|
2693 | R = pTos->i;
|
---|
2694 | pTos--;
|
---|
2695 | assert( i>=0 && i<=p->nCursor );
|
---|
2696 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
2697 | int res, rc;
|
---|
2698 | int v; /* The record number on the P1 entry that matches K */
|
---|
2699 | char *zKey; /* The value of K */
|
---|
2700 | int nKey; /* Number of bytes in K */
|
---|
2701 |
|
---|
2702 | /* Make sure K is a string and make zKey point to K
|
---|
2703 | */
|
---|
2704 | Stringify(pNos);
|
---|
2705 | zKey = pNos->z;
|
---|
2706 | nKey = pNos->n;
|
---|
2707 | assert( nKey >= 4 );
|
---|
2708 |
|
---|
2709 | /* Search for an entry in P1 where all but the last four bytes match K.
|
---|
2710 | ** If there is no such entry, jump immediately to P2.
|
---|
2711 | */
|
---|
2712 | assert( p->aCsr[i].deferredMoveto==0 );
|
---|
2713 | rc = sqliteBtreeMoveto(pCrsr, zKey, nKey-4, &res);
|
---|
2714 | if( rc!=SQLITE_OK ) goto abort_due_to_error;
|
---|
2715 | if( res<0 ){
|
---|
2716 | rc = sqliteBtreeNext(pCrsr, &res);
|
---|
2717 | if( res ){
|
---|
2718 | pc = pOp->p2 - 1;
|
---|
2719 | break;
|
---|
2720 | }
|
---|
2721 | }
|
---|
2722 | rc = sqliteBtreeKeyCompare(pCrsr, zKey, nKey-4, 4, &res);
|
---|
2723 | if( rc!=SQLITE_OK ) goto abort_due_to_error;
|
---|
2724 | if( res>0 ){
|
---|
2725 | pc = pOp->p2 - 1;
|
---|
2726 | break;
|
---|
2727 | }
|
---|
2728 |
|
---|
2729 | /* At this point, pCrsr is pointing to an entry in P1 where all but
|
---|
2730 | ** the last for bytes of the key match K. Check to see if the last
|
---|
2731 | ** four bytes of the key are different from R. If the last four
|
---|
2732 | ** bytes equal R then jump immediately to P2.
|
---|
2733 | */
|
---|
2734 | sqliteBtreeKey(pCrsr, nKey - 4, 4, (char*)&v);
|
---|
2735 | v = keyToInt(v);
|
---|
2736 | if( v==R ){
|
---|
2737 | pc = pOp->p2 - 1;
|
---|
2738 | break;
|
---|
2739 | }
|
---|
2740 |
|
---|
2741 | /* The last four bytes of the key are different from R. Convert the
|
---|
2742 | ** last four bytes of the key into an integer and push it onto the
|
---|
2743 | ** stack. (These bytes are the record number of an entry that
|
---|
2744 | ** violates a UNIQUE constraint.)
|
---|
2745 | */
|
---|
2746 | pTos++;
|
---|
2747 | pTos->i = v;
|
---|
2748 | pTos->flags = MEM_Int;
|
---|
2749 | }
|
---|
2750 | break;
|
---|
2751 | }
|
---|
2752 |
|
---|
2753 | /* Opcode: NotExists P1 P2 *
|
---|
2754 | **
|
---|
2755 | ** Use the top of the stack as a integer key. If a record with that key
|
---|
2756 | ** does not exist in table of P1, then jump to P2. If the record
|
---|
2757 | ** does exist, then fall thru. The cursor is left pointing to the
|
---|
2758 | ** record if it exists. The integer key is popped from the stack.
|
---|
2759 | **
|
---|
2760 | ** The difference between this operation and NotFound is that this
|
---|
2761 | ** operation assumes the key is an integer and NotFound assumes it
|
---|
2762 | ** is a string.
|
---|
2763 | **
|
---|
2764 | ** See also: Distinct, Found, MoveTo, NotFound, IsUnique
|
---|
2765 | */
|
---|
2766 | case OP_NotExists: {
|
---|
2767 | int i = pOp->p1;
|
---|
2768 | BtCursor *pCrsr;
|
---|
2769 | assert( pTos>=p->aStack );
|
---|
2770 | assert( i>=0 && i<p->nCursor );
|
---|
2771 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
2772 | int res, rx, iKey;
|
---|
2773 | assert( pTos->flags & MEM_Int );
|
---|
2774 | iKey = intToKey(pTos->i);
|
---|
2775 | rx = sqliteBtreeMoveto(pCrsr, (char*)&iKey, sizeof(int), &res);
|
---|
2776 | p->aCsr[i].lastRecno = pTos->i;
|
---|
2777 | p->aCsr[i].recnoIsValid = res==0;
|
---|
2778 | p->aCsr[i].nullRow = 0;
|
---|
2779 | if( rx!=SQLITE_OK || res!=0 ){
|
---|
2780 | pc = pOp->p2 - 1;
|
---|
2781 | p->aCsr[i].recnoIsValid = 0;
|
---|
2782 | }
|
---|
2783 | }
|
---|
2784 | Release(pTos);
|
---|
2785 | pTos--;
|
---|
2786 | break;
|
---|
2787 | }
|
---|
2788 |
|
---|
2789 | /* Opcode: NewRecno P1 * *
|
---|
2790 | **
|
---|
2791 | ** Get a new integer record number used as the key to a table.
|
---|
2792 | ** The record number is not previously used as a key in the database
|
---|
2793 | ** table that cursor P1 points to. The new record number is pushed
|
---|
2794 | ** onto the stack.
|
---|
2795 | */
|
---|
2796 | case OP_NewRecno: {
|
---|
2797 | int i = pOp->p1;
|
---|
2798 | int v = 0;
|
---|
2799 | Cursor *pC;
|
---|
2800 | assert( i>=0 && i<p->nCursor );
|
---|
2801 | if( (pC = &p->aCsr[i])->pCursor==0 ){
|
---|
2802 | v = 0;
|
---|
2803 | }else{
|
---|
2804 | /* The next rowid or record number (different terms for the same
|
---|
2805 | ** thing) is obtained in a two-step algorithm.
|
---|
2806 | **
|
---|
2807 | ** First we attempt to find the largest existing rowid and add one
|
---|
2808 | ** to that. But if the largest existing rowid is already the maximum
|
---|
2809 | ** positive integer, we have to fall through to the second
|
---|
2810 | ** probabilistic algorithm
|
---|
2811 | **
|
---|
2812 | ** The second algorithm is to select a rowid at random and see if
|
---|
2813 | ** it already exists in the table. If it does not exist, we have
|
---|
2814 | ** succeeded. If the random rowid does exist, we select a new one
|
---|
2815 | ** and try again, up to 1000 times.
|
---|
2816 | **
|
---|
2817 | ** For a table with less than 2 billion entries, the probability
|
---|
2818 | ** of not finding a unused rowid is about 1.0e-300. This is a
|
---|
2819 | ** non-zero probability, but it is still vanishingly small and should
|
---|
2820 | ** never cause a problem. You are much, much more likely to have a
|
---|
2821 | ** hardware failure than for this algorithm to fail.
|
---|
2822 | **
|
---|
2823 | ** The analysis in the previous paragraph assumes that you have a good
|
---|
2824 | ** source of random numbers. Is a library function like lrand48()
|
---|
2825 | ** good enough? Maybe. Maybe not. It's hard to know whether there
|
---|
2826 | ** might be subtle bugs is some implementations of lrand48() that
|
---|
2827 | ** could cause problems. To avoid uncertainty, SQLite uses its own
|
---|
2828 | ** random number generator based on the RC4 algorithm.
|
---|
2829 | **
|
---|
2830 | ** To promote locality of reference for repetitive inserts, the
|
---|
2831 | ** first few attempts at chosing a random rowid pick values just a little
|
---|
2832 | ** larger than the previous rowid. This has been shown experimentally
|
---|
2833 | ** to double the speed of the COPY operation.
|
---|
2834 | */
|
---|
2835 | int res, rx, cnt, x;
|
---|
2836 | cnt = 0;
|
---|
2837 | if( !pC->useRandomRowid ){
|
---|
2838 | if( pC->nextRowidValid ){
|
---|
2839 | v = pC->nextRowid;
|
---|
2840 | }else{
|
---|
2841 | rx = sqliteBtreeLast(pC->pCursor, &res);
|
---|
2842 | if( res ){
|
---|
2843 | v = 1;
|
---|
2844 | }else{
|
---|
2845 | sqliteBtreeKey(pC->pCursor, 0, sizeof(v), (void*)&v);
|
---|
2846 | v = keyToInt(v);
|
---|
2847 | if( v==0x7fffffff ){
|
---|
2848 | pC->useRandomRowid = 1;
|
---|
2849 | }else{
|
---|
2850 | v++;
|
---|
2851 | }
|
---|
2852 | }
|
---|
2853 | }
|
---|
2854 | if( v<0x7fffffff ){
|
---|
2855 | pC->nextRowidValid = 1;
|
---|
2856 | pC->nextRowid = v+1;
|
---|
2857 | }else{
|
---|
2858 | pC->nextRowidValid = 0;
|
---|
2859 | }
|
---|
2860 | }
|
---|
2861 | if( pC->useRandomRowid ){
|
---|
2862 | v = db->priorNewRowid;
|
---|
2863 | cnt = 0;
|
---|
2864 | do{
|
---|
2865 | if( v==0 || cnt>2 ){
|
---|
2866 | sqliteRandomness(sizeof(v), &v);
|
---|
2867 | if( cnt<5 ) v &= 0xffffff;
|
---|
2868 | }else{
|
---|
2869 | unsigned char r;
|
---|
2870 | sqliteRandomness(1, &r);
|
---|
2871 | v += r + 1;
|
---|
2872 | }
|
---|
2873 | if( v==0 ) continue;
|
---|
2874 | x = intToKey(v);
|
---|
2875 | rx = sqliteBtreeMoveto(pC->pCursor, &x, sizeof(int), &res);
|
---|
2876 | cnt++;
|
---|
2877 | }while( cnt<1000 && rx==SQLITE_OK && res==0 );
|
---|
2878 | db->priorNewRowid = v;
|
---|
2879 | if( rx==SQLITE_OK && res==0 ){
|
---|
2880 | rc = SQLITE_FULL;
|
---|
2881 | goto abort_due_to_error;
|
---|
2882 | }
|
---|
2883 | }
|
---|
2884 | pC->recnoIsValid = 0;
|
---|
2885 | pC->deferredMoveto = 0;
|
---|
2886 | }
|
---|
2887 | pTos++;
|
---|
2888 | pTos->i = v;
|
---|
2889 | pTos->flags = MEM_Int;
|
---|
2890 | break;
|
---|
2891 | }
|
---|
2892 |
|
---|
2893 | /* Opcode: PutIntKey P1 P2 *
|
---|
2894 | **
|
---|
2895 | ** Write an entry into the table of cursor P1. A new entry is
|
---|
2896 | ** created if it doesn't already exist or the data for an existing
|
---|
2897 | ** entry is overwritten. The data is the value on the top of the
|
---|
2898 | ** stack. The key is the next value down on the stack. The key must
|
---|
2899 | ** be an integer. The stack is popped twice by this instruction.
|
---|
2900 | **
|
---|
2901 | ** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
|
---|
2902 | ** incremented (otherwise not). If the OPFLAG_CSCHANGE flag is set,
|
---|
2903 | ** then the current statement change count is incremented (otherwise not).
|
---|
2904 | ** If the OPFLAG_LASTROWID flag of P2 is set, then rowid is
|
---|
2905 | ** stored for subsequent return by the sqlite_last_insert_rowid() function
|
---|
2906 | ** (otherwise it's unmodified).
|
---|
2907 | */
|
---|
2908 | /* Opcode: PutStrKey P1 * *
|
---|
2909 | **
|
---|
2910 | ** Write an entry into the table of cursor P1. A new entry is
|
---|
2911 | ** created if it doesn't already exist or the data for an existing
|
---|
2912 | ** entry is overwritten. The data is the value on the top of the
|
---|
2913 | ** stack. The key is the next value down on the stack. The key must
|
---|
2914 | ** be a string. The stack is popped twice by this instruction.
|
---|
2915 | **
|
---|
2916 | ** P1 may not be a pseudo-table opened using the OpenPseudo opcode.
|
---|
2917 | */
|
---|
2918 | case OP_PutIntKey:
|
---|
2919 | case OP_PutStrKey: {
|
---|
2920 | Mem *pNos = &pTos[-1];
|
---|
2921 | int i = pOp->p1;
|
---|
2922 | Cursor *pC;
|
---|
2923 | assert( pNos>=p->aStack );
|
---|
2924 | assert( i>=0 && i<p->nCursor );
|
---|
2925 | if( ((pC = &p->aCsr[i])->pCursor!=0 || pC->pseudoTable) ){
|
---|
2926 | char *zKey;
|
---|
2927 | int nKey, iKey;
|
---|
2928 | if( pOp->opcode==OP_PutStrKey ){
|
---|
2929 | Stringify(pNos);
|
---|
2930 | nKey = pNos->n;
|
---|
2931 | zKey = pNos->z;
|
---|
2932 | }else{
|
---|
2933 | assert( pNos->flags & MEM_Int );
|
---|
2934 | nKey = sizeof(int);
|
---|
2935 | iKey = intToKey(pNos->i);
|
---|
2936 | zKey = (char*)&iKey;
|
---|
2937 | if( pOp->p2 & OPFLAG_NCHANGE ) db->nChange++;
|
---|
2938 | if( pOp->p2 & OPFLAG_LASTROWID ) db->lastRowid = pNos->i;
|
---|
2939 | if( pOp->p2 & OPFLAG_CSCHANGE ) db->csChange++;
|
---|
2940 | if( pC->nextRowidValid && pTos->i>=pC->nextRowid ){
|
---|
2941 | pC->nextRowidValid = 0;
|
---|
2942 | }
|
---|
2943 | }
|
---|
2944 | if( pTos->flags & MEM_Null ){
|
---|
2945 | pTos->z = 0;
|
---|
2946 | pTos->n = 0;
|
---|
2947 | }else{
|
---|
2948 | assert( pTos->flags & MEM_Str );
|
---|
2949 | }
|
---|
2950 | if( pC->pseudoTable ){
|
---|
2951 | /* PutStrKey does not work for pseudo-tables.
|
---|
2952 | ** The following assert makes sure we are not trying to use
|
---|
2953 | ** PutStrKey on a pseudo-table
|
---|
2954 | */
|
---|
2955 | assert( pOp->opcode==OP_PutIntKey );
|
---|
2956 | sqliteFree(pC->pData);
|
---|
2957 | pC->iKey = iKey;
|
---|
2958 | pC->nData = pTos->n;
|
---|
2959 | if( pTos->flags & MEM_Dyn ){
|
---|
2960 | pC->pData = pTos->z;
|
---|
2961 | pTos->flags = MEM_Null;
|
---|
2962 | }else{
|
---|
2963 | pC->pData = sqliteMallocRaw( pC->nData );
|
---|
2964 | if( pC->pData ){
|
---|
2965 | memcpy(pC->pData, pTos->z, pC->nData);
|
---|
2966 | }
|
---|
2967 | }
|
---|
2968 | pC->nullRow = 0;
|
---|
2969 | }else{
|
---|
2970 | rc = sqliteBtreeInsert(pC->pCursor, zKey, nKey, pTos->z, pTos->n);
|
---|
2971 | }
|
---|
2972 | pC->recnoIsValid = 0;
|
---|
2973 | pC->deferredMoveto = 0;
|
---|
2974 | }
|
---|
2975 | popStack(&pTos, 2);
|
---|
2976 | break;
|
---|
2977 | }
|
---|
2978 |
|
---|
2979 | /* Opcode: Delete P1 P2 *
|
---|
2980 | **
|
---|
2981 | ** Delete the record at which the P1 cursor is currently pointing.
|
---|
2982 | **
|
---|
2983 | ** The cursor will be left pointing at either the next or the previous
|
---|
2984 | ** record in the table. If it is left pointing at the next record, then
|
---|
2985 | ** the next Next instruction will be a no-op. Hence it is OK to delete
|
---|
2986 | ** a record from within an Next loop.
|
---|
2987 | **
|
---|
2988 | ** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
|
---|
2989 | ** incremented (otherwise not). If OPFLAG_CSCHANGE flag is set,
|
---|
2990 | ** then the current statement change count is incremented (otherwise not).
|
---|
2991 | **
|
---|
2992 | ** If P1 is a pseudo-table, then this instruction is a no-op.
|
---|
2993 | */
|
---|
2994 | case OP_Delete: {
|
---|
2995 | int i = pOp->p1;
|
---|
2996 | Cursor *pC;
|
---|
2997 | assert( i>=0 && i<p->nCursor );
|
---|
2998 | pC = &p->aCsr[i];
|
---|
2999 | if( pC->pCursor!=0 ){
|
---|
3000 | sqliteVdbeCursorMoveto(pC);
|
---|
3001 | rc = sqliteBtreeDelete(pC->pCursor);
|
---|
3002 | pC->nextRowidValid = 0;
|
---|
3003 | }
|
---|
3004 | if( pOp->p2 & OPFLAG_NCHANGE ) db->nChange++;
|
---|
3005 | if( pOp->p2 & OPFLAG_CSCHANGE ) db->csChange++;
|
---|
3006 | break;
|
---|
3007 | }
|
---|
3008 |
|
---|
3009 | /* Opcode: SetCounts * * *
|
---|
3010 | **
|
---|
3011 | ** Called at end of statement. Updates lsChange (last statement change count)
|
---|
3012 | ** and resets csChange (current statement change count) to 0.
|
---|
3013 | */
|
---|
3014 | case OP_SetCounts: {
|
---|
3015 | db->lsChange=db->csChange;
|
---|
3016 | db->csChange=0;
|
---|
3017 | break;
|
---|
3018 | }
|
---|
3019 |
|
---|
3020 | /* Opcode: KeyAsData P1 P2 *
|
---|
3021 | **
|
---|
3022 | ** Turn the key-as-data mode for cursor P1 either on (if P2==1) or
|
---|
3023 | ** off (if P2==0). In key-as-data mode, the OP_Column opcode pulls
|
---|
3024 | ** data off of the key rather than the data. This is used for
|
---|
3025 | ** processing compound selects.
|
---|
3026 | */
|
---|
3027 | case OP_KeyAsData: {
|
---|
3028 | int i = pOp->p1;
|
---|
3029 | assert( i>=0 && i<p->nCursor );
|
---|
3030 | p->aCsr[i].keyAsData = pOp->p2;
|
---|
3031 | break;
|
---|
3032 | }
|
---|
3033 |
|
---|
3034 | /* Opcode: RowData P1 * *
|
---|
3035 | **
|
---|
3036 | ** Push onto the stack the complete row data for cursor P1.
|
---|
3037 | ** There is no interpretation of the data. It is just copied
|
---|
3038 | ** onto the stack exactly as it is found in the database file.
|
---|
3039 | **
|
---|
3040 | ** If the cursor is not pointing to a valid row, a NULL is pushed
|
---|
3041 | ** onto the stack.
|
---|
3042 | */
|
---|
3043 | /* Opcode: RowKey P1 * *
|
---|
3044 | **
|
---|
3045 | ** Push onto the stack the complete row key for cursor P1.
|
---|
3046 | ** There is no interpretation of the key. It is just copied
|
---|
3047 | ** onto the stack exactly as it is found in the database file.
|
---|
3048 | **
|
---|
3049 | ** If the cursor is not pointing to a valid row, a NULL is pushed
|
---|
3050 | ** onto the stack.
|
---|
3051 | */
|
---|
3052 | case OP_RowKey:
|
---|
3053 | case OP_RowData: {
|
---|
3054 | int i = pOp->p1;
|
---|
3055 | Cursor *pC;
|
---|
3056 | int n;
|
---|
3057 |
|
---|
3058 | pTos++;
|
---|
3059 | assert( i>=0 && i<p->nCursor );
|
---|
3060 | pC = &p->aCsr[i];
|
---|
3061 | if( pC->nullRow ){
|
---|
3062 | pTos->flags = MEM_Null;
|
---|
3063 | }else if( pC->pCursor!=0 ){
|
---|
3064 | BtCursor *pCrsr = pC->pCursor;
|
---|
3065 | sqliteVdbeCursorMoveto(pC);
|
---|
3066 | if( pC->nullRow ){
|
---|
3067 | pTos->flags = MEM_Null;
|
---|
3068 | break;
|
---|
3069 | }else if( pC->keyAsData || pOp->opcode==OP_RowKey ){
|
---|
3070 | sqliteBtreeKeySize(pCrsr, &n);
|
---|
3071 | }else{
|
---|
3072 | sqliteBtreeDataSize(pCrsr, &n);
|
---|
3073 | }
|
---|
3074 | pTos->n = n;
|
---|
3075 | if( n<=NBFS ){
|
---|
3076 | pTos->flags = MEM_Str | MEM_Short;
|
---|
3077 | pTos->z = pTos->zShort;
|
---|
3078 | }else{
|
---|
3079 | char *z = sqliteMallocRaw( n );
|
---|
3080 | if( z==0 ) goto no_mem;
|
---|
3081 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
3082 | pTos->z = z;
|
---|
3083 | }
|
---|
3084 | if( pC->keyAsData || pOp->opcode==OP_RowKey ){
|
---|
3085 | sqliteBtreeKey(pCrsr, 0, n, pTos->z);
|
---|
3086 | }else{
|
---|
3087 | sqliteBtreeData(pCrsr, 0, n, pTos->z);
|
---|
3088 | }
|
---|
3089 | }else if( pC->pseudoTable ){
|
---|
3090 | pTos->n = pC->nData;
|
---|
3091 | pTos->z = pC->pData;
|
---|
3092 | pTos->flags = MEM_Str|MEM_Ephem;
|
---|
3093 | }else{
|
---|
3094 | pTos->flags = MEM_Null;
|
---|
3095 | }
|
---|
3096 | break;
|
---|
3097 | }
|
---|
3098 |
|
---|
3099 | /* Opcode: Column P1 P2 *
|
---|
3100 | **
|
---|
3101 | ** Interpret the data that cursor P1 points to as
|
---|
3102 | ** a structure built using the MakeRecord instruction.
|
---|
3103 | ** (See the MakeRecord opcode for additional information about
|
---|
3104 | ** the format of the data.)
|
---|
3105 | ** Push onto the stack the value of the P2-th column contained
|
---|
3106 | ** in the data.
|
---|
3107 | **
|
---|
3108 | ** If the KeyAsData opcode has previously executed on this cursor,
|
---|
3109 | ** then the field might be extracted from the key rather than the
|
---|
3110 | ** data.
|
---|
3111 | **
|
---|
3112 | ** If P1 is negative, then the record is stored on the stack rather
|
---|
3113 | ** than in a table. For P1==-1, the top of the stack is used.
|
---|
3114 | ** For P1==-2, the next on the stack is used. And so forth. The
|
---|
3115 | ** value pushed is always just a pointer into the record which is
|
---|
3116 | ** stored further down on the stack. The column value is not copied.
|
---|
3117 | */
|
---|
3118 | case OP_Column: {
|
---|
3119 | int amt, offset, end, payloadSize;
|
---|
3120 | int i = pOp->p1;
|
---|
3121 | int p2 = pOp->p2;
|
---|
3122 | Cursor *pC;
|
---|
3123 | char *zRec;
|
---|
3124 | BtCursor *pCrsr;
|
---|
3125 | int idxWidth;
|
---|
3126 | unsigned char aHdr[10];
|
---|
3127 |
|
---|
3128 | assert( i<p->nCursor );
|
---|
3129 | pTos++;
|
---|
3130 | if( i<0 ){
|
---|
3131 | assert( &pTos[i]>=p->aStack );
|
---|
3132 | assert( pTos[i].flags & MEM_Str );
|
---|
3133 | zRec = pTos[i].z;
|
---|
3134 | payloadSize = pTos[i].n;
|
---|
3135 | }else if( (pC = &p->aCsr[i])->pCursor!=0 ){
|
---|
3136 | sqliteVdbeCursorMoveto(pC);
|
---|
3137 | zRec = 0;
|
---|
3138 | pCrsr = pC->pCursor;
|
---|
3139 | if( pC->nullRow ){
|
---|
3140 | payloadSize = 0;
|
---|
3141 | }else if( pC->keyAsData ){
|
---|
3142 | sqliteBtreeKeySize(pCrsr, &payloadSize);
|
---|
3143 | }else{
|
---|
3144 | sqliteBtreeDataSize(pCrsr, &payloadSize);
|
---|
3145 | }
|
---|
3146 | }else if( pC->pseudoTable ){
|
---|
3147 | payloadSize = pC->nData;
|
---|
3148 | zRec = pC->pData;
|
---|
3149 | assert( payloadSize==0 || zRec!=0 );
|
---|
3150 | }else{
|
---|
3151 | payloadSize = 0;
|
---|
3152 | }
|
---|
3153 |
|
---|
3154 | /* Figure out how many bytes in the column data and where the column
|
---|
3155 | ** data begins.
|
---|
3156 | */
|
---|
3157 | if( payloadSize==0 ){
|
---|
3158 | pTos->flags = MEM_Null;
|
---|
3159 | break;
|
---|
3160 | }else if( payloadSize<256 ){
|
---|
3161 | idxWidth = 1;
|
---|
3162 | }else if( payloadSize<65536 ){
|
---|
3163 | idxWidth = 2;
|
---|
3164 | }else{
|
---|
3165 | idxWidth = 3;
|
---|
3166 | }
|
---|
3167 |
|
---|
3168 | /* Figure out where the requested column is stored and how big it is.
|
---|
3169 | */
|
---|
3170 | if( payloadSize < idxWidth*(p2+1) ){
|
---|
3171 | rc = SQLITE_CORRUPT;
|
---|
3172 | goto abort_due_to_error;
|
---|
3173 | }
|
---|
3174 | if( zRec ){
|
---|
3175 | memcpy(aHdr, &zRec[idxWidth*p2], idxWidth*2);
|
---|
3176 | }else if( pC->keyAsData ){
|
---|
3177 | sqliteBtreeKey(pCrsr, idxWidth*p2, idxWidth*2, (char*)aHdr);
|
---|
3178 | }else{
|
---|
3179 | sqliteBtreeData(pCrsr, idxWidth*p2, idxWidth*2, (char*)aHdr);
|
---|
3180 | }
|
---|
3181 | offset = aHdr[0];
|
---|
3182 | end = aHdr[idxWidth];
|
---|
3183 | if( idxWidth>1 ){
|
---|
3184 | offset |= aHdr[1]<<8;
|
---|
3185 | end |= aHdr[idxWidth+1]<<8;
|
---|
3186 | if( idxWidth>2 ){
|
---|
3187 | offset |= aHdr[2]<<16;
|
---|
3188 | end |= aHdr[idxWidth+2]<<16;
|
---|
3189 | }
|
---|
3190 | }
|
---|
3191 | amt = end - offset;
|
---|
3192 | if( amt<0 || offset<0 || end>payloadSize ){
|
---|
3193 | rc = SQLITE_CORRUPT;
|
---|
3194 | goto abort_due_to_error;
|
---|
3195 | }
|
---|
3196 |
|
---|
3197 | /* amt and offset now hold the offset to the start of data and the
|
---|
3198 | ** amount of data. Go get the data and put it on the stack.
|
---|
3199 | */
|
---|
3200 | pTos->n = amt;
|
---|
3201 | if( amt==0 ){
|
---|
3202 | pTos->flags = MEM_Null;
|
---|
3203 | }else if( zRec ){
|
---|
3204 | pTos->flags = MEM_Str | MEM_Ephem;
|
---|
3205 | pTos->z = &zRec[offset];
|
---|
3206 | }else{
|
---|
3207 | if( amt<=NBFS ){
|
---|
3208 | pTos->flags = MEM_Str | MEM_Short;
|
---|
3209 | pTos->z = pTos->zShort;
|
---|
3210 | }else{
|
---|
3211 | char *z = sqliteMallocRaw( amt );
|
---|
3212 | if( z==0 ) goto no_mem;
|
---|
3213 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
3214 | pTos->z = z;
|
---|
3215 | }
|
---|
3216 | if( pC->keyAsData ){
|
---|
3217 | sqliteBtreeKey(pCrsr, offset, amt, pTos->z);
|
---|
3218 | }else{
|
---|
3219 | sqliteBtreeData(pCrsr, offset, amt, pTos->z);
|
---|
3220 | }
|
---|
3221 | }
|
---|
3222 | break;
|
---|
3223 | }
|
---|
3224 |
|
---|
3225 | /* Opcode: Recno P1 * *
|
---|
3226 | **
|
---|
3227 | ** Push onto the stack an integer which is the first 4 bytes of the
|
---|
3228 | ** the key to the current entry in a sequential scan of the database
|
---|
3229 | ** file P1. The sequential scan should have been started using the
|
---|
3230 | ** Next opcode.
|
---|
3231 | */
|
---|
3232 | case OP_Recno: {
|
---|
3233 | int i = pOp->p1;
|
---|
3234 | Cursor *pC;
|
---|
3235 | int v;
|
---|
3236 |
|
---|
3237 | assert( i>=0 && i<p->nCursor );
|
---|
3238 | pC = &p->aCsr[i];
|
---|
3239 | sqliteVdbeCursorMoveto(pC);
|
---|
3240 | pTos++;
|
---|
3241 | if( pC->recnoIsValid ){
|
---|
3242 | v = pC->lastRecno;
|
---|
3243 | }else if( pC->pseudoTable ){
|
---|
3244 | v = keyToInt(pC->iKey);
|
---|
3245 | }else if( pC->nullRow || pC->pCursor==0 ){
|
---|
3246 | pTos->flags = MEM_Null;
|
---|
3247 | break;
|
---|
3248 | }else{
|
---|
3249 | assert( pC->pCursor!=0 );
|
---|
3250 | sqliteBtreeKey(pC->pCursor, 0, sizeof(u32), (char*)&v);
|
---|
3251 | v = keyToInt(v);
|
---|
3252 | }
|
---|
3253 | pTos->i = v;
|
---|
3254 | pTos->flags = MEM_Int;
|
---|
3255 | break;
|
---|
3256 | }
|
---|
3257 |
|
---|
3258 | /* Opcode: FullKey P1 * *
|
---|
3259 | **
|
---|
3260 | ** Extract the complete key from the record that cursor P1 is currently
|
---|
3261 | ** pointing to and push the key onto the stack as a string.
|
---|
3262 | **
|
---|
3263 | ** Compare this opcode to Recno. The Recno opcode extracts the first
|
---|
3264 | ** 4 bytes of the key and pushes those bytes onto the stack as an
|
---|
3265 | ** integer. This instruction pushes the entire key as a string.
|
---|
3266 | **
|
---|
3267 | ** This opcode may not be used on a pseudo-table.
|
---|
3268 | */
|
---|
3269 | case OP_FullKey: {
|
---|
3270 | int i = pOp->p1;
|
---|
3271 | BtCursor *pCrsr;
|
---|
3272 |
|
---|
3273 | assert( p->aCsr[i].keyAsData );
|
---|
3274 | assert( !p->aCsr[i].pseudoTable );
|
---|
3275 | assert( i>=0 && i<p->nCursor );
|
---|
3276 | pTos++;
|
---|
3277 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
3278 | int amt;
|
---|
3279 | char *z;
|
---|
3280 |
|
---|
3281 | sqliteVdbeCursorMoveto(&p->aCsr[i]);
|
---|
3282 | sqliteBtreeKeySize(pCrsr, &amt);
|
---|
3283 | if( amt<=0 ){
|
---|
3284 | rc = SQLITE_CORRUPT;
|
---|
3285 | goto abort_due_to_error;
|
---|
3286 | }
|
---|
3287 | if( amt>NBFS ){
|
---|
3288 | z = sqliteMallocRaw( amt );
|
---|
3289 | if( z==0 ) goto no_mem;
|
---|
3290 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
3291 | }else{
|
---|
3292 | z = pTos->zShort;
|
---|
3293 | pTos->flags = MEM_Str | MEM_Short;
|
---|
3294 | }
|
---|
3295 | sqliteBtreeKey(pCrsr, 0, amt, z);
|
---|
3296 | pTos->z = z;
|
---|
3297 | pTos->n = amt;
|
---|
3298 | }
|
---|
3299 | break;
|
---|
3300 | }
|
---|
3301 |
|
---|
3302 | /* Opcode: NullRow P1 * *
|
---|
3303 | **
|
---|
3304 | ** Move the cursor P1 to a null row. Any OP_Column operations
|
---|
3305 | ** that occur while the cursor is on the null row will always push
|
---|
3306 | ** a NULL onto the stack.
|
---|
3307 | */
|
---|
3308 | case OP_NullRow: {
|
---|
3309 | int i = pOp->p1;
|
---|
3310 |
|
---|
3311 | assert( i>=0 && i<p->nCursor );
|
---|
3312 | p->aCsr[i].nullRow = 1;
|
---|
3313 | p->aCsr[i].recnoIsValid = 0;
|
---|
3314 | break;
|
---|
3315 | }
|
---|
3316 |
|
---|
3317 | /* Opcode: Last P1 P2 *
|
---|
3318 | **
|
---|
3319 | ** The next use of the Recno or Column or Next instruction for P1
|
---|
3320 | ** will refer to the last entry in the database table or index.
|
---|
3321 | ** If the table or index is empty and P2>0, then jump immediately to P2.
|
---|
3322 | ** If P2 is 0 or if the table or index is not empty, fall through
|
---|
3323 | ** to the following instruction.
|
---|
3324 | */
|
---|
3325 | case OP_Last: {
|
---|
3326 | int i = pOp->p1;
|
---|
3327 | Cursor *pC;
|
---|
3328 | BtCursor *pCrsr;
|
---|
3329 |
|
---|
3330 | assert( i>=0 && i<p->nCursor );
|
---|
3331 | pC = &p->aCsr[i];
|
---|
3332 | if( (pCrsr = pC->pCursor)!=0 ){
|
---|
3333 | int res;
|
---|
3334 | rc = sqliteBtreeLast(pCrsr, &res);
|
---|
3335 | pC->nullRow = res;
|
---|
3336 | pC->deferredMoveto = 0;
|
---|
3337 | if( res && pOp->p2>0 ){
|
---|
3338 | pc = pOp->p2 - 1;
|
---|
3339 | }
|
---|
3340 | }else{
|
---|
3341 | pC->nullRow = 0;
|
---|
3342 | }
|
---|
3343 | break;
|
---|
3344 | }
|
---|
3345 |
|
---|
3346 | /* Opcode: Rewind P1 P2 *
|
---|
3347 | **
|
---|
3348 | ** The next use of the Recno or Column or Next instruction for P1
|
---|
3349 | ** will refer to the first entry in the database table or index.
|
---|
3350 | ** If the table or index is empty and P2>0, then jump immediately to P2.
|
---|
3351 | ** If P2 is 0 or if the table or index is not empty, fall through
|
---|
3352 | ** to the following instruction.
|
---|
3353 | */
|
---|
3354 | case OP_Rewind: {
|
---|
3355 | int i = pOp->p1;
|
---|
3356 | Cursor *pC;
|
---|
3357 | BtCursor *pCrsr;
|
---|
3358 |
|
---|
3359 | assert( i>=0 && i<p->nCursor );
|
---|
3360 | pC = &p->aCsr[i];
|
---|
3361 | if( (pCrsr = pC->pCursor)!=0 ){
|
---|
3362 | int res;
|
---|
3363 | rc = sqliteBtreeFirst(pCrsr, &res);
|
---|
3364 | pC->atFirst = res==0;
|
---|
3365 | pC->nullRow = res;
|
---|
3366 | pC->deferredMoveto = 0;
|
---|
3367 | if( res && pOp->p2>0 ){
|
---|
3368 | pc = pOp->p2 - 1;
|
---|
3369 | }
|
---|
3370 | }else{
|
---|
3371 | pC->nullRow = 0;
|
---|
3372 | }
|
---|
3373 | break;
|
---|
3374 | }
|
---|
3375 |
|
---|
3376 | /* Opcode: Next P1 P2 *
|
---|
3377 | **
|
---|
3378 | ** Advance cursor P1 so that it points to the next key/data pair in its
|
---|
3379 | ** table or index. If there are no more key/value pairs then fall through
|
---|
3380 | ** to the following instruction. But if the cursor advance was successful,
|
---|
3381 | ** jump immediately to P2.
|
---|
3382 | **
|
---|
3383 | ** See also: Prev
|
---|
3384 | */
|
---|
3385 | /* Opcode: Prev P1 P2 *
|
---|
3386 | **
|
---|
3387 | ** Back up cursor P1 so that it points to the previous key/data pair in its
|
---|
3388 | ** table or index. If there is no previous key/value pairs then fall through
|
---|
3389 | ** to the following instruction. But if the cursor backup was successful,
|
---|
3390 | ** jump immediately to P2.
|
---|
3391 | */
|
---|
3392 | case OP_Prev:
|
---|
3393 | case OP_Next: {
|
---|
3394 | Cursor *pC;
|
---|
3395 | BtCursor *pCrsr;
|
---|
3396 |
|
---|
3397 | CHECK_FOR_INTERRUPT;
|
---|
3398 | assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
---|
3399 | pC = &p->aCsr[pOp->p1];
|
---|
3400 | if( (pCrsr = pC->pCursor)!=0 ){
|
---|
3401 | int res;
|
---|
3402 | if( pC->nullRow ){
|
---|
3403 | res = 1;
|
---|
3404 | }else{
|
---|
3405 | assert( pC->deferredMoveto==0 );
|
---|
3406 | rc = pOp->opcode==OP_Next ? sqliteBtreeNext(pCrsr, &res) :
|
---|
3407 | sqliteBtreePrevious(pCrsr, &res);
|
---|
3408 | pC->nullRow = res;
|
---|
3409 | }
|
---|
3410 | if( res==0 ){
|
---|
3411 | pc = pOp->p2 - 1;
|
---|
3412 | sqlite_search_count++;
|
---|
3413 | }
|
---|
3414 | }else{
|
---|
3415 | pC->nullRow = 1;
|
---|
3416 | }
|
---|
3417 | pC->recnoIsValid = 0;
|
---|
3418 | break;
|
---|
3419 | }
|
---|
3420 |
|
---|
3421 | /* Opcode: IdxPut P1 P2 P3
|
---|
3422 | **
|
---|
3423 | ** The top of the stack holds a SQL index key made using the
|
---|
3424 | ** MakeIdxKey instruction. This opcode writes that key into the
|
---|
3425 | ** index P1. Data for the entry is nil.
|
---|
3426 | **
|
---|
3427 | ** If P2==1, then the key must be unique. If the key is not unique,
|
---|
3428 | ** the program aborts with a SQLITE_CONSTRAINT error and the database
|
---|
3429 | ** is rolled back. If P3 is not null, then it becomes part of the
|
---|
3430 | ** error message returned with the SQLITE_CONSTRAINT.
|
---|
3431 | */
|
---|
3432 | case OP_IdxPut: {
|
---|
3433 | int i = pOp->p1;
|
---|
3434 | BtCursor *pCrsr;
|
---|
3435 | assert( pTos>=p->aStack );
|
---|
3436 | assert( i>=0 && i<p->nCursor );
|
---|
3437 | assert( pTos->flags & MEM_Str );
|
---|
3438 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
3439 | int nKey = pTos->n;
|
---|
3440 | const char *zKey = pTos->z;
|
---|
3441 | if( pOp->p2 ){
|
---|
3442 | int res, n;
|
---|
3443 | assert( nKey >= 4 );
|
---|
3444 | rc = sqliteBtreeMoveto(pCrsr, zKey, nKey-4, &res);
|
---|
3445 | if( rc!=SQLITE_OK ) goto abort_due_to_error;
|
---|
3446 | while( res!=0 ){
|
---|
3447 | int c;
|
---|
3448 | sqliteBtreeKeySize(pCrsr, &n);
|
---|
3449 | if( n==nKey
|
---|
3450 | && sqliteBtreeKeyCompare(pCrsr, zKey, nKey-4, 4, &c)==SQLITE_OK
|
---|
3451 | && c==0
|
---|
3452 | ){
|
---|
3453 | rc = SQLITE_CONSTRAINT;
|
---|
3454 | if( pOp->p3 && pOp->p3[0] ){
|
---|
3455 | sqliteSetString(&p->zErrMsg, pOp->p3, (char*)0);
|
---|
3456 | }
|
---|
3457 | goto abort_due_to_error;
|
---|
3458 | }
|
---|
3459 | if( res<0 ){
|
---|
3460 | sqliteBtreeNext(pCrsr, &res);
|
---|
3461 | res = +1;
|
---|
3462 | }else{
|
---|
3463 | break;
|
---|
3464 | }
|
---|
3465 | }
|
---|
3466 | }
|
---|
3467 | rc = sqliteBtreeInsert(pCrsr, zKey, nKey, "", 0);
|
---|
3468 | assert( p->aCsr[i].deferredMoveto==0 );
|
---|
3469 | }
|
---|
3470 | Release(pTos);
|
---|
3471 | pTos--;
|
---|
3472 | break;
|
---|
3473 | }
|
---|
3474 |
|
---|
3475 | /* Opcode: IdxDelete P1 * *
|
---|
3476 | **
|
---|
3477 | ** The top of the stack is an index key built using the MakeIdxKey opcode.
|
---|
3478 | ** This opcode removes that entry from the index.
|
---|
3479 | */
|
---|
3480 | case OP_IdxDelete: {
|
---|
3481 | int i = pOp->p1;
|
---|
3482 | BtCursor *pCrsr;
|
---|
3483 | assert( pTos>=p->aStack );
|
---|
3484 | assert( pTos->flags & MEM_Str );
|
---|
3485 | assert( i>=0 && i<p->nCursor );
|
---|
3486 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
3487 | int rx, res;
|
---|
3488 | rx = sqliteBtreeMoveto(pCrsr, pTos->z, pTos->n, &res);
|
---|
3489 | if( rx==SQLITE_OK && res==0 ){
|
---|
3490 | rc = sqliteBtreeDelete(pCrsr);
|
---|
3491 | }
|
---|
3492 | assert( p->aCsr[i].deferredMoveto==0 );
|
---|
3493 | }
|
---|
3494 | Release(pTos);
|
---|
3495 | pTos--;
|
---|
3496 | break;
|
---|
3497 | }
|
---|
3498 |
|
---|
3499 | /* Opcode: IdxRecno P1 * *
|
---|
3500 | **
|
---|
3501 | ** Push onto the stack an integer which is the last 4 bytes of the
|
---|
3502 | ** the key to the current entry in index P1. These 4 bytes should
|
---|
3503 | ** be the record number of the table entry to which this index entry
|
---|
3504 | ** points.
|
---|
3505 | **
|
---|
3506 | ** See also: Recno, MakeIdxKey.
|
---|
3507 | */
|
---|
3508 | case OP_IdxRecno: {
|
---|
3509 | int i = pOp->p1;
|
---|
3510 | BtCursor *pCrsr;
|
---|
3511 |
|
---|
3512 | assert( i>=0 && i<p->nCursor );
|
---|
3513 | pTos++;
|
---|
3514 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
3515 | int v;
|
---|
3516 | int sz;
|
---|
3517 | assert( p->aCsr[i].deferredMoveto==0 );
|
---|
3518 | sqliteBtreeKeySize(pCrsr, &sz);
|
---|
3519 | if( sz<sizeof(u32) ){
|
---|
3520 | pTos->flags = MEM_Null;
|
---|
3521 | }else{
|
---|
3522 | sqliteBtreeKey(pCrsr, sz - sizeof(u32), sizeof(u32), (char*)&v);
|
---|
3523 | v = keyToInt(v);
|
---|
3524 | pTos->i = v;
|
---|
3525 | pTos->flags = MEM_Int;
|
---|
3526 | }
|
---|
3527 | }else{
|
---|
3528 | pTos->flags = MEM_Null;
|
---|
3529 | }
|
---|
3530 | break;
|
---|
3531 | }
|
---|
3532 |
|
---|
3533 | /* Opcode: IdxGT P1 P2 *
|
---|
3534 | **
|
---|
3535 | ** Compare the top of the stack against the key on the index entry that
|
---|
3536 | ** cursor P1 is currently pointing to. Ignore the last 4 bytes of the
|
---|
3537 | ** index entry. If the index entry is greater than the top of the stack
|
---|
3538 | ** then jump to P2. Otherwise fall through to the next instruction.
|
---|
3539 | ** In either case, the stack is popped once.
|
---|
3540 | */
|
---|
3541 | /* Opcode: IdxGE P1 P2 *
|
---|
3542 | **
|
---|
3543 | ** Compare the top of the stack against the key on the index entry that
|
---|
3544 | ** cursor P1 is currently pointing to. Ignore the last 4 bytes of the
|
---|
3545 | ** index entry. If the index entry is greater than or equal to
|
---|
3546 | ** the top of the stack
|
---|
3547 | ** then jump to P2. Otherwise fall through to the next instruction.
|
---|
3548 | ** In either case, the stack is popped once.
|
---|
3549 | */
|
---|
3550 | /* Opcode: IdxLT P1 P2 *
|
---|
3551 | **
|
---|
3552 | ** Compare the top of the stack against the key on the index entry that
|
---|
3553 | ** cursor P1 is currently pointing to. Ignore the last 4 bytes of the
|
---|
3554 | ** index entry. If the index entry is less than the top of the stack
|
---|
3555 | ** then jump to P2. Otherwise fall through to the next instruction.
|
---|
3556 | ** In either case, the stack is popped once.
|
---|
3557 | */
|
---|
3558 | case OP_IdxLT:
|
---|
3559 | case OP_IdxGT:
|
---|
3560 | case OP_IdxGE: {
|
---|
3561 | int i= pOp->p1;
|
---|
3562 | BtCursor *pCrsr;
|
---|
3563 |
|
---|
3564 | assert( i>=0 && i<p->nCursor );
|
---|
3565 | assert( pTos>=p->aStack );
|
---|
3566 | if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
---|
3567 | int res, rc;
|
---|
3568 |
|
---|
3569 | Stringify(pTos);
|
---|
3570 | assert( p->aCsr[i].deferredMoveto==0 );
|
---|
3571 | rc = sqliteBtreeKeyCompare(pCrsr, pTos->z, pTos->n, 4, &res);
|
---|
3572 | if( rc!=SQLITE_OK ){
|
---|
3573 | break;
|
---|
3574 | }
|
---|
3575 | if( pOp->opcode==OP_IdxLT ){
|
---|
3576 | res = -res;
|
---|
3577 | }else if( pOp->opcode==OP_IdxGE ){
|
---|
3578 | res++;
|
---|
3579 | }
|
---|
3580 | if( res>0 ){
|
---|
3581 | pc = pOp->p2 - 1 ;
|
---|
3582 | }
|
---|
3583 | }
|
---|
3584 | Release(pTos);
|
---|
3585 | pTos--;
|
---|
3586 | break;
|
---|
3587 | }
|
---|
3588 |
|
---|
3589 | /* Opcode: IdxIsNull P1 P2 *
|
---|
3590 | **
|
---|
3591 | ** The top of the stack contains an index entry such as might be generated
|
---|
3592 | ** by the MakeIdxKey opcode. This routine looks at the first P1 fields of
|
---|
3593 | ** that key. If any of the first P1 fields are NULL, then a jump is made
|
---|
3594 | ** to address P2. Otherwise we fall straight through.
|
---|
3595 | **
|
---|
3596 | ** The index entry is always popped from the stack.
|
---|
3597 | */
|
---|
3598 | case OP_IdxIsNull: {
|
---|
3599 | int i = pOp->p1;
|
---|
3600 | int k, n;
|
---|
3601 | const char *z;
|
---|
3602 |
|
---|
3603 | assert( pTos>=p->aStack );
|
---|
3604 | assert( pTos->flags & MEM_Str );
|
---|
3605 | z = pTos->z;
|
---|
3606 | n = pTos->n;
|
---|
3607 | for(k=0; k<n && i>0; i--){
|
---|
3608 | if( z[k]=='a' ){
|
---|
3609 | pc = pOp->p2-1;
|
---|
3610 | break;
|
---|
3611 | }
|
---|
3612 | while( k<n && z[k] ){ k++; }
|
---|
3613 | k++;
|
---|
3614 | }
|
---|
3615 | Release(pTos);
|
---|
3616 | pTos--;
|
---|
3617 | break;
|
---|
3618 | }
|
---|
3619 |
|
---|
3620 | /* Opcode: Destroy P1 P2 *
|
---|
3621 | **
|
---|
3622 | ** Delete an entire database table or index whose root page in the database
|
---|
3623 | ** file is given by P1.
|
---|
3624 | **
|
---|
3625 | ** The table being destroyed is in the main database file if P2==0. If
|
---|
3626 | ** P2==1 then the table to be clear is in the auxiliary database file
|
---|
3627 | ** that is used to store tables create using CREATE TEMPORARY TABLE.
|
---|
3628 | **
|
---|
3629 | ** See also: Clear
|
---|
3630 | */
|
---|
3631 | case OP_Destroy: {
|
---|
3632 | rc = sqliteBtreeDropTable(db->aDb[pOp->p2].pBt, pOp->p1);
|
---|
3633 | break;
|
---|
3634 | }
|
---|
3635 |
|
---|
3636 | /* Opcode: Clear P1 P2 *
|
---|
3637 | **
|
---|
3638 | ** Delete all contents of the database table or index whose root page
|
---|
3639 | ** in the database file is given by P1. But, unlike Destroy, do not
|
---|
3640 | ** remove the table or index from the database file.
|
---|
3641 | **
|
---|
3642 | ** The table being clear is in the main database file if P2==0. If
|
---|
3643 | ** P2==1 then the table to be clear is in the auxiliary database file
|
---|
3644 | ** that is used to store tables create using CREATE TEMPORARY TABLE.
|
---|
3645 | **
|
---|
3646 | ** See also: Destroy
|
---|
3647 | */
|
---|
3648 | case OP_Clear: {
|
---|
3649 | rc = sqliteBtreeClearTable(db->aDb[pOp->p2].pBt, pOp->p1);
|
---|
3650 | break;
|
---|
3651 | }
|
---|
3652 |
|
---|
3653 | /* Opcode: CreateTable * P2 P3
|
---|
3654 | **
|
---|
3655 | ** Allocate a new table in the main database file if P2==0 or in the
|
---|
3656 | ** auxiliary database file if P2==1. Push the page number
|
---|
3657 | ** for the root page of the new table onto the stack.
|
---|
3658 | **
|
---|
3659 | ** The root page number is also written to a memory location that P3
|
---|
3660 | ** points to. This is the mechanism is used to write the root page
|
---|
3661 | ** number into the parser's internal data structures that describe the
|
---|
3662 | ** new table.
|
---|
3663 | **
|
---|
3664 | ** The difference between a table and an index is this: A table must
|
---|
3665 | ** have a 4-byte integer key and can have arbitrary data. An index
|
---|
3666 | ** has an arbitrary key but no data.
|
---|
3667 | **
|
---|
3668 | ** See also: CreateIndex
|
---|
3669 | */
|
---|
3670 | /* Opcode: CreateIndex * P2 P3
|
---|
3671 | **
|
---|
3672 | ** Allocate a new index in the main database file if P2==0 or in the
|
---|
3673 | ** auxiliary database file if P2==1. Push the page number of the
|
---|
3674 | ** root page of the new index onto the stack.
|
---|
3675 | **
|
---|
3676 | ** See documentation on OP_CreateTable for additional information.
|
---|
3677 | */
|
---|
3678 | case OP_CreateIndex:
|
---|
3679 | case OP_CreateTable: {
|
---|
3680 | int pgno;
|
---|
3681 | assert( pOp->p3!=0 && pOp->p3type==P3_POINTER );
|
---|
3682 | assert( pOp->p2>=0 && pOp->p2<db->nDb );
|
---|
3683 | assert( db->aDb[pOp->p2].pBt!=0 );
|
---|
3684 | if( pOp->opcode==OP_CreateTable ){
|
---|
3685 | rc = sqliteBtreeCreateTable(db->aDb[pOp->p2].pBt, &pgno);
|
---|
3686 | }else{
|
---|
3687 | rc = sqliteBtreeCreateIndex(db->aDb[pOp->p2].pBt, &pgno);
|
---|
3688 | }
|
---|
3689 | pTos++;
|
---|
3690 | if( rc==SQLITE_OK ){
|
---|
3691 | pTos->i = pgno;
|
---|
3692 | pTos->flags = MEM_Int;
|
---|
3693 | *(u32*)pOp->p3 = pgno;
|
---|
3694 | pOp->p3 = 0;
|
---|
3695 | }else{
|
---|
3696 | pTos->flags = MEM_Null;
|
---|
3697 | }
|
---|
3698 | break;
|
---|
3699 | }
|
---|
3700 |
|
---|
3701 | /* Opcode: IntegrityCk P1 P2 *
|
---|
3702 | **
|
---|
3703 | ** Do an analysis of the currently open database. Push onto the
|
---|
3704 | ** stack the text of an error message describing any problems.
|
---|
3705 | ** If there are no errors, push a "ok" onto the stack.
|
---|
3706 | **
|
---|
3707 | ** P1 is the index of a set that contains the root page numbers
|
---|
3708 | ** for all tables and indices in the main database file. The set
|
---|
3709 | ** is cleared by this opcode. In other words, after this opcode
|
---|
3710 | ** has executed, the set will be empty.
|
---|
3711 | **
|
---|
3712 | ** If P2 is not zero, the check is done on the auxiliary database
|
---|
3713 | ** file, not the main database file.
|
---|
3714 | **
|
---|
3715 | ** This opcode is used for testing purposes only.
|
---|
3716 | */
|
---|
3717 | case OP_IntegrityCk: {
|
---|
3718 | int nRoot;
|
---|
3719 | int *aRoot;
|
---|
3720 | int iSet = pOp->p1;
|
---|
3721 | Set *pSet;
|
---|
3722 | int j;
|
---|
3723 | HashElem *i;
|
---|
3724 | char *z;
|
---|
3725 |
|
---|
3726 | assert( iSet>=0 && iSet<p->nSet );
|
---|
3727 | pTos++;
|
---|
3728 | pSet = &p->aSet[iSet];
|
---|
3729 | nRoot = sqliteHashCount(&pSet->hash);
|
---|
3730 | aRoot = sqliteMallocRaw( sizeof(int)*(nRoot+1) );
|
---|
3731 | if( aRoot==0 ) goto no_mem;
|
---|
3732 | for(j=0, i=sqliteHashFirst(&pSet->hash); i; i=sqliteHashNext(i), j++){
|
---|
3733 | toInt((char*)sqliteHashKey(i), &aRoot[j]);
|
---|
3734 | }
|
---|
3735 | aRoot[j] = 0;
|
---|
3736 | sqliteHashClear(&pSet->hash);
|
---|
3737 | pSet->prev = 0;
|
---|
3738 | z = sqliteBtreeIntegrityCheck(db->aDb[pOp->p2].pBt, aRoot, nRoot);
|
---|
3739 | if( z==0 || z[0]==0 ){
|
---|
3740 | if( z ) sqliteFree(z);
|
---|
3741 | pTos->z = "ok";
|
---|
3742 | pTos->n = 3;
|
---|
3743 | pTos->flags = MEM_Str | MEM_Static;
|
---|
3744 | }else{
|
---|
3745 | pTos->z = z;
|
---|
3746 | pTos->n = strlen(z) + 1;
|
---|
3747 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
3748 | }
|
---|
3749 | sqliteFree(aRoot);
|
---|
3750 | break;
|
---|
3751 | }
|
---|
3752 |
|
---|
3753 | /* Opcode: ListWrite * * *
|
---|
3754 | **
|
---|
3755 | ** Write the integer on the top of the stack
|
---|
3756 | ** into the temporary storage list.
|
---|
3757 | */
|
---|
3758 | case OP_ListWrite: {
|
---|
3759 | Keylist *pKeylist;
|
---|
3760 | assert( pTos>=p->aStack );
|
---|
3761 | pKeylist = p->pList;
|
---|
3762 | if( pKeylist==0 || pKeylist->nUsed>=pKeylist->nKey ){
|
---|
3763 | pKeylist = sqliteMallocRaw( sizeof(Keylist)+999*sizeof(pKeylist->aKey[0]) );
|
---|
3764 | if( pKeylist==0 ) goto no_mem;
|
---|
3765 | pKeylist->nKey = 1000;
|
---|
3766 | pKeylist->nRead = 0;
|
---|
3767 | pKeylist->nUsed = 0;
|
---|
3768 | pKeylist->pNext = p->pList;
|
---|
3769 | p->pList = pKeylist;
|
---|
3770 | }
|
---|
3771 | Integerify(pTos);
|
---|
3772 | pKeylist->aKey[pKeylist->nUsed++] = pTos->i;
|
---|
3773 | Release(pTos);
|
---|
3774 | pTos--;
|
---|
3775 | break;
|
---|
3776 | }
|
---|
3777 |
|
---|
3778 | /* Opcode: ListRewind * * *
|
---|
3779 | **
|
---|
3780 | ** Rewind the temporary buffer back to the beginning.
|
---|
3781 | */
|
---|
3782 | case OP_ListRewind: {
|
---|
3783 | /* What this opcode codes, really, is reverse the order of the
|
---|
3784 | ** linked list of Keylist structures so that they are read out
|
---|
3785 | ** in the same order that they were read in. */
|
---|
3786 | Keylist *pRev, *pTop;
|
---|
3787 | pRev = 0;
|
---|
3788 | while( p->pList ){
|
---|
3789 | pTop = p->pList;
|
---|
3790 | p->pList = pTop->pNext;
|
---|
3791 | pTop->pNext = pRev;
|
---|
3792 | pRev = pTop;
|
---|
3793 | }
|
---|
3794 | p->pList = pRev;
|
---|
3795 | break;
|
---|
3796 | }
|
---|
3797 |
|
---|
3798 | /* Opcode: ListRead * P2 *
|
---|
3799 | **
|
---|
3800 | ** Attempt to read an integer from the temporary storage buffer
|
---|
3801 | ** and push it onto the stack. If the storage buffer is empty,
|
---|
3802 | ** push nothing but instead jump to P2.
|
---|
3803 | */
|
---|
3804 | case OP_ListRead: {
|
---|
3805 | Keylist *pKeylist;
|
---|
3806 | CHECK_FOR_INTERRUPT;
|
---|
3807 | pKeylist = p->pList;
|
---|
3808 | if( pKeylist!=0 ){
|
---|
3809 | assert( pKeylist->nRead>=0 );
|
---|
3810 | assert( pKeylist->nRead<pKeylist->nUsed );
|
---|
3811 | assert( pKeylist->nRead<pKeylist->nKey );
|
---|
3812 | pTos++;
|
---|
3813 | pTos->i = pKeylist->aKey[pKeylist->nRead++];
|
---|
3814 | pTos->flags = MEM_Int;
|
---|
3815 | if( pKeylist->nRead>=pKeylist->nUsed ){
|
---|
3816 | p->pList = pKeylist->pNext;
|
---|
3817 | sqliteFree(pKeylist);
|
---|
3818 | }
|
---|
3819 | }else{
|
---|
3820 | pc = pOp->p2 - 1;
|
---|
3821 | }
|
---|
3822 | break;
|
---|
3823 | }
|
---|
3824 |
|
---|
3825 | /* Opcode: ListReset * * *
|
---|
3826 | **
|
---|
3827 | ** Reset the temporary storage buffer so that it holds nothing.
|
---|
3828 | */
|
---|
3829 | case OP_ListReset: {
|
---|
3830 | if( p->pList ){
|
---|
3831 | sqliteVdbeKeylistFree(p->pList);
|
---|
3832 | p->pList = 0;
|
---|
3833 | }
|
---|
3834 | break;
|
---|
3835 | }
|
---|
3836 |
|
---|
3837 | /* Opcode: ListPush * * *
|
---|
3838 | **
|
---|
3839 | ** Save the current Vdbe list such that it can be restored by a ListPop
|
---|
3840 | ** opcode. The list is empty after this is executed.
|
---|
3841 | */
|
---|
3842 | case OP_ListPush: {
|
---|
3843 | p->keylistStackDepth++;
|
---|
3844 | assert(p->keylistStackDepth > 0);
|
---|
3845 | p->keylistStack = sqliteRealloc(p->keylistStack,
|
---|
3846 | sizeof(Keylist *) * p->keylistStackDepth);
|
---|
3847 | if( p->keylistStack==0 ) goto no_mem;
|
---|
3848 | p->keylistStack[p->keylistStackDepth - 1] = p->pList;
|
---|
3849 | p->pList = 0;
|
---|
3850 | break;
|
---|
3851 | }
|
---|
3852 |
|
---|
3853 | /* Opcode: ListPop * * *
|
---|
3854 | **
|
---|
3855 | ** Restore the Vdbe list to the state it was in when ListPush was last
|
---|
3856 | ** executed.
|
---|
3857 | */
|
---|
3858 | case OP_ListPop: {
|
---|
3859 | assert(p->keylistStackDepth > 0);
|
---|
3860 | p->keylistStackDepth--;
|
---|
3861 | sqliteVdbeKeylistFree(p->pList);
|
---|
3862 | p->pList = p->keylistStack[p->keylistStackDepth];
|
---|
3863 | p->keylistStack[p->keylistStackDepth] = 0;
|
---|
3864 | if( p->keylistStackDepth == 0 ){
|
---|
3865 | sqliteFree(p->keylistStack);
|
---|
3866 | p->keylistStack = 0;
|
---|
3867 | }
|
---|
3868 | break;
|
---|
3869 | }
|
---|
3870 |
|
---|
3871 | /* Opcode: ContextPush * * *
|
---|
3872 | **
|
---|
3873 | ** Save the current Vdbe context such that it can be restored by a ContextPop
|
---|
3874 | ** opcode. The context stores the last insert row id, the last statement change
|
---|
3875 | ** count, and the current statement change count.
|
---|
3876 | */
|
---|
3877 | case OP_ContextPush: {
|
---|
3878 | p->contextStackDepth++;
|
---|
3879 | assert(p->contextStackDepth > 0);
|
---|
3880 | p->contextStack = sqliteRealloc(p->contextStack,
|
---|
3881 | sizeof(Context) * p->contextStackDepth);
|
---|
3882 | if( p->contextStack==0 ) goto no_mem;
|
---|
3883 | p->contextStack[p->contextStackDepth - 1].lastRowid = p->db->lastRowid;
|
---|
3884 | p->contextStack[p->contextStackDepth - 1].lsChange = p->db->lsChange;
|
---|
3885 | p->contextStack[p->contextStackDepth - 1].csChange = p->db->csChange;
|
---|
3886 | break;
|
---|
3887 | }
|
---|
3888 |
|
---|
3889 | /* Opcode: ContextPop * * *
|
---|
3890 | **
|
---|
3891 | ** Restore the Vdbe context to the state it was in when contextPush was last
|
---|
3892 | ** executed. The context stores the last insert row id, the last statement
|
---|
3893 | ** change count, and the current statement change count.
|
---|
3894 | */
|
---|
3895 | case OP_ContextPop: {
|
---|
3896 | assert(p->contextStackDepth > 0);
|
---|
3897 | p->contextStackDepth--;
|
---|
3898 | p->db->lastRowid = p->contextStack[p->contextStackDepth].lastRowid;
|
---|
3899 | p->db->lsChange = p->contextStack[p->contextStackDepth].lsChange;
|
---|
3900 | p->db->csChange = p->contextStack[p->contextStackDepth].csChange;
|
---|
3901 | if( p->contextStackDepth == 0 ){
|
---|
3902 | sqliteFree(p->contextStack);
|
---|
3903 | p->contextStack = 0;
|
---|
3904 | }
|
---|
3905 | break;
|
---|
3906 | }
|
---|
3907 |
|
---|
3908 | /* Opcode: SortPut * * *
|
---|
3909 | **
|
---|
3910 | ** The TOS is the key and the NOS is the data. Pop both from the stack
|
---|
3911 | ** and put them on the sorter. The key and data should have been
|
---|
3912 | ** made using SortMakeKey and SortMakeRec, respectively.
|
---|
3913 | */
|
---|
3914 | case OP_SortPut: {
|
---|
3915 | Mem *pNos = &pTos[-1];
|
---|
3916 | Sorter *pSorter;
|
---|
3917 | assert( pNos>=p->aStack );
|
---|
3918 | if( Dynamicify(pTos) || Dynamicify(pNos) ) goto no_mem;
|
---|
3919 | pSorter = sqliteMallocRaw( sizeof(Sorter) );
|
---|
3920 | if( pSorter==0 ) goto no_mem;
|
---|
3921 | pSorter->pNext = p->pSort;
|
---|
3922 | p->pSort = pSorter;
|
---|
3923 | assert( pTos->flags & MEM_Dyn );
|
---|
3924 | pSorter->nKey = pTos->n;
|
---|
3925 | pSorter->zKey = pTos->z;
|
---|
3926 | assert( pNos->flags & MEM_Dyn );
|
---|
3927 | pSorter->nData = pNos->n;
|
---|
3928 | pSorter->pData = pNos->z;
|
---|
3929 | pTos -= 2;
|
---|
3930 | break;
|
---|
3931 | }
|
---|
3932 |
|
---|
3933 | /* Opcode: SortMakeRec P1 * *
|
---|
3934 | **
|
---|
3935 | ** The top P1 elements are the arguments to a callback. Form these
|
---|
3936 | ** elements into a single data entry that can be stored on a sorter
|
---|
3937 | ** using SortPut and later fed to a callback using SortCallback.
|
---|
3938 | */
|
---|
3939 | case OP_SortMakeRec: {
|
---|
3940 | char *z;
|
---|
3941 | char **azArg;
|
---|
3942 | int nByte;
|
---|
3943 | int nField;
|
---|
3944 | int i;
|
---|
3945 | Mem *pRec;
|
---|
3946 |
|
---|
3947 | nField = pOp->p1;
|
---|
3948 | pRec = &pTos[1-nField];
|
---|
3949 | assert( pRec>=p->aStack );
|
---|
3950 | nByte = 0;
|
---|
3951 | for(i=0; i<nField; i++, pRec++){
|
---|
3952 | if( (pRec->flags & MEM_Null)==0 ){
|
---|
3953 | Stringify(pRec);
|
---|
3954 | nByte += pRec->n;
|
---|
3955 | }
|
---|
3956 | }
|
---|
3957 | nByte += sizeof(char*)*(nField+1);
|
---|
3958 | azArg = sqliteMallocRaw( nByte );
|
---|
3959 | if( azArg==0 ) goto no_mem;
|
---|
3960 | z = (char*)&azArg[nField+1];
|
---|
3961 | for(pRec=&pTos[1-nField], i=0; i<nField; i++, pRec++){
|
---|
3962 | if( pRec->flags & MEM_Null ){
|
---|
3963 | azArg[i] = 0;
|
---|
3964 | }else{
|
---|
3965 | azArg[i] = z;
|
---|
3966 | memcpy(z, pRec->z, pRec->n);
|
---|
3967 | z += pRec->n;
|
---|
3968 | }
|
---|
3969 | }
|
---|
3970 | popStack(&pTos, nField);
|
---|
3971 | pTos++;
|
---|
3972 | pTos->n = nByte;
|
---|
3973 | pTos->z = (char*)azArg;
|
---|
3974 | pTos->flags = MEM_Str | MEM_Dyn;
|
---|
3975 | break;
|
---|
3976 | }
|
---|
3977 |
|
---|
3978 | /* Opcode: SortMakeKey * * P3
|
---|
3979 | **
|
---|
3980 | ** Convert the top few entries of the stack into a sort key. The
|
---|
3981 | ** number of stack entries consumed is the number of characters in
|
---|
3982 | ** the string P3. One character from P3 is prepended to each entry.
|
---|
3983 | ** The first character of P3 is prepended to the element lowest in
|
---|
3984 | ** the stack and the last character of P3 is prepended to the top of
|
---|
3985 | ** the stack. All stack entries are separated by a \000 character
|
---|
3986 | ** in the result. The whole key is terminated by two \000 characters
|
---|
3987 | ** in a row.
|
---|
3988 | **
|
---|
3989 | ** "N" is substituted in place of the P3 character for NULL values.
|
---|
3990 | **
|
---|
3991 | ** See also the MakeKey and MakeIdxKey opcodes.
|
---|
3992 | */
|
---|
3993 | case OP_SortMakeKey: {
|
---|
3994 | char *zNewKey;
|
---|
3995 | int nByte;
|
---|
3996 | int nField;
|
---|
3997 | int i, j, k;
|
---|
3998 | Mem *pRec;
|
---|
3999 |
|
---|
4000 | nField = strlen(pOp->p3);
|
---|
4001 | pRec = &pTos[1-nField];
|
---|
4002 | nByte = 1;
|
---|
4003 | for(i=0; i<nField; i++, pRec++){
|
---|
4004 | if( pRec->flags & MEM_Null ){
|
---|
4005 | nByte += 2;
|
---|
4006 | }else{
|
---|
4007 | Stringify(pRec);
|
---|
4008 | nByte += pRec->n+2;
|
---|
4009 | }
|
---|
4010 | }
|
---|
4011 | zNewKey = sqliteMallocRaw( nByte );
|
---|
4012 | if( zNewKey==0 ) goto no_mem;
|
---|
4013 | j = 0;
|
---|
4014 | k = 0;
|
---|
4015 | for(pRec=&pTos[1-nField], i=0; i<nField; i++, pRec++){
|
---|
4016 | if( pRec->flags & MEM_Null ){
|
---|
4017 | zNewKey[j++] = 'N';
|
---|
4018 | zNewKey[j++] = 0;
|
---|
4019 | k++;
|
---|
4020 | }else{
|
---|
4021 | zNewKey[j++] = pOp->p3[k++];
|
---|
4022 | memcpy(&zNewKey[j], pRec->z, pRec->n-1);
|
---|
4023 | j += pRec->n-1;
|
---|
4024 | zNewKey[j++] = 0;
|
---|
4025 | }
|
---|
4026 | }
|
---|
4027 | zNewKey[j] = 0;
|
---|
4028 | assert( j<nByte );
|
---|
4029 | popStack(&pTos, nField);
|
---|
4030 | pTos++;
|
---|
4031 | pTos->n = nByte;
|
---|
4032 | pTos->flags = MEM_Str|MEM_Dyn;
|
---|
4033 | pTos->z = zNewKey;
|
---|
4034 | break;
|
---|
4035 | }
|
---|
4036 |
|
---|
4037 | /* Opcode: Sort * * *
|
---|
4038 | **
|
---|
4039 | ** Sort all elements on the sorter. The algorithm is a
|
---|
4040 | ** mergesort.
|
---|
4041 | */
|
---|
4042 | case OP_Sort: {
|
---|
4043 | int i;
|
---|
4044 | Sorter *pElem;
|
---|
4045 | Sorter *apSorter[NSORT];
|
---|
4046 | for(i=0; i<NSORT; i++){
|
---|
4047 | apSorter[i] = 0;
|
---|
4048 | }
|
---|
4049 | while( p->pSort ){
|
---|
4050 | pElem = p->pSort;
|
---|
4051 | p->pSort = pElem->pNext;
|
---|
4052 | pElem->pNext = 0;
|
---|
4053 | for(i=0; i<NSORT-1; i++){
|
---|
4054 | if( apSorter[i]==0 ){
|
---|
4055 | apSorter[i] = pElem;
|
---|
4056 | break;
|
---|
4057 | }else{
|
---|
4058 | pElem = Merge(apSorter[i], pElem);
|
---|
4059 | apSorter[i] = 0;
|
---|
4060 | }
|
---|
4061 | }
|
---|
4062 | if( i>=NSORT-1 ){
|
---|
4063 | apSorter[NSORT-1] = Merge(apSorter[NSORT-1],pElem);
|
---|
4064 | }
|
---|
4065 | }
|
---|
4066 | pElem = 0;
|
---|
4067 | for(i=0; i<NSORT; i++){
|
---|
4068 | pElem = Merge(apSorter[i], pElem);
|
---|
4069 | }
|
---|
4070 | p->pSort = pElem;
|
---|
4071 | break;
|
---|
4072 | }
|
---|
4073 |
|
---|
4074 | /* Opcode: SortNext * P2 *
|
---|
4075 | **
|
---|
4076 | ** Push the data for the topmost element in the sorter onto the
|
---|
4077 | ** stack, then remove the element from the sorter. If the sorter
|
---|
4078 | ** is empty, push nothing on the stack and instead jump immediately
|
---|
4079 | ** to instruction P2.
|
---|
4080 | */
|
---|
4081 | case OP_SortNext: {
|
---|
4082 | Sorter *pSorter = p->pSort;
|
---|
4083 | CHECK_FOR_INTERRUPT;
|
---|
4084 | if( pSorter!=0 ){
|
---|
4085 | p->pSort = pSorter->pNext;
|
---|
4086 | pTos++;
|
---|
4087 | pTos->z = pSorter->pData;
|
---|
4088 | pTos->n = pSorter->nData;
|
---|
4089 | pTos->flags = MEM_Str|MEM_Dyn;
|
---|
4090 | sqliteFree(pSorter->zKey);
|
---|
4091 | sqliteFree(pSorter);
|
---|
4092 | }else{
|
---|
4093 | pc = pOp->p2 - 1;
|
---|
4094 | }
|
---|
4095 | break;
|
---|
4096 | }
|
---|
4097 |
|
---|
4098 | /* Opcode: SortCallback P1 * *
|
---|
4099 | **
|
---|
4100 | ** The top of the stack contains a callback record built using
|
---|
4101 | ** the SortMakeRec operation with the same P1 value as this
|
---|
4102 | ** instruction. Pop this record from the stack and invoke the
|
---|
4103 | ** callback on it.
|
---|
4104 | */
|
---|
4105 | case OP_SortCallback: {
|
---|
4106 | assert( pTos>=p->aStack );
|
---|
4107 | assert( pTos->flags & MEM_Str );
|
---|
4108 | p->nCallback++;
|
---|
4109 | p->pc = pc+1;
|
---|
4110 | p->azResColumn = (char**)pTos->z;
|
---|
4111 | assert( p->nResColumn==pOp->p1 );
|
---|
4112 | p->popStack = 1;
|
---|
4113 | p->pTos = pTos;
|
---|
4114 | return SQLITE_ROW;
|
---|
4115 | }
|
---|
4116 |
|
---|
4117 | /* Opcode: SortReset * * *
|
---|
4118 | **
|
---|
4119 | ** Remove any elements that remain on the sorter.
|
---|
4120 | */
|
---|
4121 | case OP_SortReset: {
|
---|
4122 | sqliteVdbeSorterReset(p);
|
---|
4123 | break;
|
---|
4124 | }
|
---|
4125 |
|
---|
4126 | /* Opcode: FileOpen * * P3
|
---|
4127 | **
|
---|
4128 | ** Open the file named by P3 for reading using the FileRead opcode.
|
---|
4129 | ** If P3 is "stdin" then open standard input for reading.
|
---|
4130 | */
|
---|
4131 | case OP_FileOpen: {
|
---|
4132 | assert( pOp->p3!=0 );
|
---|
4133 | if( p->pFile ){
|
---|
4134 | if( p->pFile!=stdin ) fclose(p->pFile);
|
---|
4135 | p->pFile = 0;
|
---|
4136 | }
|
---|
4137 | if( sqliteStrICmp(pOp->p3,"stdin")==0 ){
|
---|
4138 | p->pFile = stdin;
|
---|
4139 | }else{
|
---|
4140 | p->pFile = fopen(pOp->p3, "r");
|
---|
4141 | }
|
---|
4142 | if( p->pFile==0 ){
|
---|
4143 | sqliteSetString(&p->zErrMsg,"unable to open file: ", pOp->p3, (char*)0);
|
---|
4144 | rc = SQLITE_ERROR;
|
---|
4145 | }
|
---|
4146 | break;
|
---|
4147 | }
|
---|
4148 |
|
---|
4149 | /* Opcode: FileRead P1 P2 P3
|
---|
4150 | **
|
---|
4151 | ** Read a single line of input from the open file (the file opened using
|
---|
4152 | ** FileOpen). If we reach end-of-file, jump immediately to P2. If
|
---|
4153 | ** we are able to get another line, split the line apart using P3 as
|
---|
4154 | ** a delimiter. There should be P1 fields. If the input line contains
|
---|
4155 | ** more than P1 fields, ignore the excess. If the input line contains
|
---|
4156 | ** fewer than P1 fields, assume the remaining fields contain NULLs.
|
---|
4157 | **
|
---|
4158 | ** Input ends if a line consists of just "\.". A field containing only
|
---|
4159 | ** "\N" is a null field. The backslash \ character can be used be used
|
---|
4160 | ** to escape newlines or the delimiter.
|
---|
4161 | */
|
---|
4162 | case OP_FileRead: {
|
---|
4163 | int n, eol, nField, i, c, nDelim;
|
---|
4164 | char *zDelim, *z;
|
---|
4165 | CHECK_FOR_INTERRUPT;
|
---|
4166 | if( p->pFile==0 ) goto fileread_jump;
|
---|
4167 | nField = pOp->p1;
|
---|
4168 | if( nField<=0 ) goto fileread_jump;
|
---|
4169 | if( nField!=p->nField || p->azField==0 ){
|
---|
4170 | char **azField = sqliteRealloc(p->azField, sizeof(char*)*nField+1);
|
---|
4171 | if( azField==0 ){ goto no_mem; }
|
---|
4172 | p->azField = azField;
|
---|
4173 | p->nField = nField;
|
---|
4174 | }
|
---|
4175 | n = 0;
|
---|
4176 | eol = 0;
|
---|
4177 | while( eol==0 ){
|
---|
4178 | if( p->zLine==0 || n+200>p->nLineAlloc ){
|
---|
4179 | char *zLine;
|
---|
4180 | p->nLineAlloc = p->nLineAlloc*2 + 300;
|
---|
4181 | zLine = sqliteRealloc(p->zLine, p->nLineAlloc);
|
---|
4182 | if( zLine==0 ){
|
---|
4183 | p->nLineAlloc = 0;
|
---|
4184 | sqliteFree(p->zLine);
|
---|
4185 | p->zLine = 0;
|
---|
4186 | goto no_mem;
|
---|
4187 | }
|
---|
4188 | p->zLine = zLine;
|
---|
4189 | }
|
---|
4190 | if( vdbe_fgets(&p->zLine[n], p->nLineAlloc-n, p->pFile)==0 ){
|
---|
4191 | eol = 1;
|
---|
4192 | p->zLine[n] = 0;
|
---|
4193 | }else{
|
---|
4194 | int c;
|
---|
4195 | while( (c = p->zLine[n])!=0 ){
|
---|
4196 | if( c=='\\' ){
|
---|
4197 | if( p->zLine[n+1]==0 ) break;
|
---|
4198 | n += 2;
|
---|
4199 | }else if( c=='\n' ){
|
---|
4200 | p->zLine[n] = 0;
|
---|
4201 | eol = 1;
|
---|
4202 | break;
|
---|
4203 | }else{
|
---|
4204 | n++;
|
---|
4205 | }
|
---|
4206 | }
|
---|
4207 | }
|
---|
4208 | }
|
---|
4209 | if( n==0 ) goto fileread_jump;
|
---|
4210 | z = p->zLine;
|
---|
4211 | if( z[0]=='\\' && z[1]=='.' && z[2]==0 ){
|
---|
4212 | goto fileread_jump;
|
---|
4213 | }
|
---|
4214 | zDelim = pOp->p3;
|
---|
4215 | if( zDelim==0 ) zDelim = "\t";
|
---|
4216 | c = zDelim[0];
|
---|
4217 | nDelim = strlen(zDelim);
|
---|
4218 | p->azField[0] = z;
|
---|
4219 | for(i=1; *z!=0 && i<=nField; i++){
|
---|
4220 | int from, to;
|
---|
4221 | from = to = 0;
|
---|
4222 | if( z[0]=='\\' && z[1]=='N'
|
---|
4223 | && (z[2]==0 || strncmp(&z[2],zDelim,nDelim)==0) ){
|
---|
4224 | if( i<=nField ) p->azField[i-1] = 0;
|
---|
4225 | z += 2 + nDelim;
|
---|
4226 | if( i<nField ) p->azField[i] = z;
|
---|
4227 | continue;
|
---|
4228 | }
|
---|
4229 | while( z[from] ){
|
---|
4230 | if( z[from]=='\\' && z[from+1]!=0 ){
|
---|
4231 | int tx = z[from+1];
|
---|
4232 | switch( tx ){
|
---|
4233 | case 'b': tx = '\b'; break;
|
---|
4234 | case 'f': tx = '\f'; break;
|
---|
4235 | case 'n': tx = '\n'; break;
|
---|
4236 | case 'r': tx = '\r'; break;
|
---|
4237 | case 't': tx = '\t'; break;
|
---|
4238 | case 'v': tx = '\v'; break;
|
---|
4239 | default: break;
|
---|
4240 | }
|
---|
4241 | z[to++] = tx;
|
---|
4242 | from += 2;
|
---|
4243 | continue;
|
---|
4244 | }
|
---|
4245 | if( z[from]==c && strncmp(&z[from],zDelim,nDelim)==0 ) break;
|
---|
4246 | z[to++] = z[from++];
|
---|
4247 | }
|
---|
4248 | if( z[from] ){
|
---|
4249 | z[to] = 0;
|
---|
4250 | z += from + nDelim;
|
---|
4251 | if( i<nField ) p->azField[i] = z;
|
---|
4252 | }else{
|
---|
4253 | z[to] = 0;
|
---|
4254 | z = "";
|
---|
4255 | }
|
---|
4256 | }
|
---|
4257 | while( i<nField ){
|
---|
4258 | p->azField[i++] = 0;
|
---|
4259 | }
|
---|
4260 | break;
|
---|
4261 |
|
---|
4262 | /* If we reach end-of-file, or if anything goes wrong, jump here.
|
---|
4263 | ** This code will cause a jump to P2 */
|
---|
4264 | fileread_jump:
|
---|
4265 | pc = pOp->p2 - 1;
|
---|
4266 | break;
|
---|
4267 | }
|
---|
4268 |
|
---|
4269 | /* Opcode: FileColumn P1 * *
|
---|
4270 | **
|
---|
4271 | ** Push onto the stack the P1-th column of the most recently read line
|
---|
4272 | ** from the input file.
|
---|
4273 | */
|
---|
4274 | case OP_FileColumn: {
|
---|
4275 | int i = pOp->p1;
|
---|
4276 | char *z;
|
---|
4277 | assert( i>=0 && i<p->nField );
|
---|
4278 | if( p->azField ){
|
---|
4279 | z = p->azField[i];
|
---|
4280 | }else{
|
---|
4281 | z = 0;
|
---|
4282 | }
|
---|
4283 | pTos++;
|
---|
4284 | if( z ){
|
---|
4285 | pTos->n = strlen(z) + 1;
|
---|
4286 | pTos->z = z;
|
---|
4287 | pTos->flags = MEM_Str | MEM_Ephem;
|
---|
4288 | }else{
|
---|
4289 | pTos->flags = MEM_Null;
|
---|
4290 | }
|
---|
4291 | break;
|
---|
4292 | }
|
---|
4293 |
|
---|
4294 | /* Opcode: MemStore P1 P2 *
|
---|
4295 | **
|
---|
4296 | ** Write the top of the stack into memory location P1.
|
---|
4297 | ** P1 should be a small integer since space is allocated
|
---|
4298 | ** for all memory locations between 0 and P1 inclusive.
|
---|
4299 | **
|
---|
4300 | ** After the data is stored in the memory location, the
|
---|
4301 | ** stack is popped once if P2 is 1. If P2 is zero, then
|
---|
4302 | ** the original data remains on the stack.
|
---|
4303 | */
|
---|
4304 | case OP_MemStore: {
|
---|
4305 | int i = pOp->p1;
|
---|
4306 | Mem *pMem;
|
---|
4307 | assert( pTos>=p->aStack );
|
---|
4308 | if( i>=p->nMem ){
|
---|
4309 | int nOld = p->nMem;
|
---|
4310 | Mem *aMem;
|
---|
4311 | p->nMem = i + 5;
|
---|
4312 | aMem = sqliteRealloc(p->aMem, p->nMem*sizeof(p->aMem[0]));
|
---|
4313 | if( aMem==0 ) goto no_mem;
|
---|
4314 | if( aMem!=p->aMem ){
|
---|
4315 | int j;
|
---|
4316 | for(j=0; j<nOld; j++){
|
---|
4317 | if( aMem[j].flags & MEM_Short ){
|
---|
4318 | aMem[j].z = aMem[j].zShort;
|
---|
4319 | }
|
---|
4320 | }
|
---|
4321 | }
|
---|
4322 | p->aMem = aMem;
|
---|
4323 | if( nOld<p->nMem ){
|
---|
4324 | memset(&p->aMem[nOld], 0, sizeof(p->aMem[0])*(p->nMem-nOld));
|
---|
4325 | }
|
---|
4326 | }
|
---|
4327 | Deephemeralize(pTos);
|
---|
4328 | pMem = &p->aMem[i];
|
---|
4329 | Release(pMem);
|
---|
4330 | *pMem = *pTos;
|
---|
4331 | if( pMem->flags & MEM_Dyn ){
|
---|
4332 | if( pOp->p2 ){
|
---|
4333 | pTos->flags = MEM_Null;
|
---|
4334 | }else{
|
---|
4335 | pMem->z = sqliteMallocRaw( pMem->n );
|
---|
4336 | if( pMem->z==0 ) goto no_mem;
|
---|
4337 | memcpy(pMem->z, pTos->z, pMem->n);
|
---|
4338 | }
|
---|
4339 | }else if( pMem->flags & MEM_Short ){
|
---|
4340 | pMem->z = pMem->zShort;
|
---|
4341 | }
|
---|
4342 | if( pOp->p2 ){
|
---|
4343 | Release(pTos);
|
---|
4344 | pTos--;
|
---|
4345 | }
|
---|
4346 | break;
|
---|
4347 | }
|
---|
4348 |
|
---|
4349 | /* Opcode: MemLoad P1 * *
|
---|
4350 | **
|
---|
4351 | ** Push a copy of the value in memory location P1 onto the stack.
|
---|
4352 | **
|
---|
4353 | ** If the value is a string, then the value pushed is a pointer to
|
---|
4354 | ** the string that is stored in the memory location. If the memory
|
---|
4355 | ** location is subsequently changed (using OP_MemStore) then the
|
---|
4356 | ** value pushed onto the stack will change too.
|
---|
4357 | */
|
---|
4358 | case OP_MemLoad: {
|
---|
4359 | int i = pOp->p1;
|
---|
4360 | assert( i>=0 && i<p->nMem );
|
---|
4361 | pTos++;
|
---|
4362 | memcpy(pTos, &p->aMem[i], sizeof(pTos[0])-NBFS);;
|
---|
4363 | if( pTos->flags & MEM_Str ){
|
---|
4364 | pTos->flags |= MEM_Ephem;
|
---|
4365 | pTos->flags &= ~(MEM_Dyn|MEM_Static|MEM_Short);
|
---|
4366 | }
|
---|
4367 | break;
|
---|
4368 | }
|
---|
4369 |
|
---|
4370 | /* Opcode: MemIncr P1 P2 *
|
---|
4371 | **
|
---|
4372 | ** Increment the integer valued memory cell P1 by 1. If P2 is not zero
|
---|
4373 | ** and the result after the increment is greater than zero, then jump
|
---|
4374 | ** to P2.
|
---|
4375 | **
|
---|
4376 | ** This instruction throws an error if the memory cell is not initially
|
---|
4377 | ** an integer.
|
---|
4378 | */
|
---|
4379 | case OP_MemIncr: {
|
---|
4380 | int i = pOp->p1;
|
---|
4381 | Mem *pMem;
|
---|
4382 | assert( i>=0 && i<p->nMem );
|
---|
4383 | pMem = &p->aMem[i];
|
---|
4384 | assert( pMem->flags==MEM_Int );
|
---|
4385 | pMem->i++;
|
---|
4386 | if( pOp->p2>0 && pMem->i>0 ){
|
---|
4387 | pc = pOp->p2 - 1;
|
---|
4388 | }
|
---|
4389 | break;
|
---|
4390 | }
|
---|
4391 |
|
---|
4392 | /* Opcode: AggReset * P2 *
|
---|
4393 | **
|
---|
4394 | ** Reset the aggregator so that it no longer contains any data.
|
---|
4395 | ** Future aggregator elements will contain P2 values each.
|
---|
4396 | */
|
---|
4397 | case OP_AggReset: {
|
---|
4398 | sqliteVdbeAggReset(&p->agg);
|
---|
4399 | p->agg.nMem = pOp->p2;
|
---|
4400 | p->agg.apFunc = sqliteMalloc( p->agg.nMem*sizeof(p->agg.apFunc[0]) );
|
---|
4401 | if( p->agg.apFunc==0 ) goto no_mem;
|
---|
4402 | break;
|
---|
4403 | }
|
---|
4404 |
|
---|
4405 | /* Opcode: AggInit * P2 P3
|
---|
4406 | **
|
---|
4407 | ** Initialize the function parameters for an aggregate function.
|
---|
4408 | ** The aggregate will operate out of aggregate column P2.
|
---|
4409 | ** P3 is a pointer to the FuncDef structure for the function.
|
---|
4410 | */
|
---|
4411 | case OP_AggInit: {
|
---|
4412 | int i = pOp->p2;
|
---|
4413 | assert( i>=0 && i<p->agg.nMem );
|
---|
4414 | p->agg.apFunc[i] = (FuncDef*)pOp->p3;
|
---|
4415 | break;
|
---|
4416 | }
|
---|
4417 |
|
---|
4418 | /* Opcode: AggFunc * P2 P3
|
---|
4419 | **
|
---|
4420 | ** Execute the step function for an aggregate. The
|
---|
4421 | ** function has P2 arguments. P3 is a pointer to the FuncDef
|
---|
4422 | ** structure that specifies the function.
|
---|
4423 | **
|
---|
4424 | ** The top of the stack must be an integer which is the index of
|
---|
4425 | ** the aggregate column that corresponds to this aggregate function.
|
---|
4426 | ** Ideally, this index would be another parameter, but there are
|
---|
4427 | ** no free parameters left. The integer is popped from the stack.
|
---|
4428 | */
|
---|
4429 | case OP_AggFunc: {
|
---|
4430 | int n = pOp->p2;
|
---|
4431 | int i;
|
---|
4432 | Mem *pMem, *pRec;
|
---|
4433 | char **azArgv = p->zArgv;
|
---|
4434 | sqlite_func ctx;
|
---|
4435 |
|
---|
4436 | assert( n>=0 );
|
---|
4437 | assert( pTos->flags==MEM_Int );
|
---|
4438 | pRec = &pTos[-n];
|
---|
4439 | assert( pRec>=p->aStack );
|
---|
4440 | for(i=0; i<n; i++, pRec++){
|
---|
4441 | if( pRec->flags & MEM_Null ){
|
---|
4442 | azArgv[i] = 0;
|
---|
4443 | }else{
|
---|
4444 | Stringify(pRec);
|
---|
4445 | azArgv[i] = pRec->z;
|
---|
4446 | }
|
---|
4447 | }
|
---|
4448 | i = pTos->i;
|
---|
4449 | assert( i>=0 && i<p->agg.nMem );
|
---|
4450 | ctx.pFunc = (FuncDef*)pOp->p3;
|
---|
4451 | pMem = &p->agg.pCurrent->aMem[i];
|
---|
4452 | ctx.s.z = pMem->zShort; /* Space used for small aggregate contexts */
|
---|
4453 | ctx.pAgg = pMem->z;
|
---|
4454 | ctx.cnt = ++pMem->i;
|
---|
4455 | ctx.isError = 0;
|
---|
4456 | ctx.isStep = 1;
|
---|
4457 | (ctx.pFunc->xStep)(&ctx, n, (const char**)azArgv);
|
---|
4458 | pMem->z = ctx.pAgg;
|
---|
4459 | pMem->flags = MEM_AggCtx;
|
---|
4460 | popStack(&pTos, n+1);
|
---|
4461 | if( ctx.isError ){
|
---|
4462 | rc = SQLITE_ERROR;
|
---|
4463 | }
|
---|
4464 | break;
|
---|
4465 | }
|
---|
4466 |
|
---|
4467 | /* Opcode: AggFocus * P2 *
|
---|
4468 | **
|
---|
4469 | ** Pop the top of the stack and use that as an aggregator key. If
|
---|
4470 | ** an aggregator with that same key already exists, then make the
|
---|
4471 | ** aggregator the current aggregator and jump to P2. If no aggregator
|
---|
4472 | ** with the given key exists, create one and make it current but
|
---|
4473 | ** do not jump.
|
---|
4474 | **
|
---|
4475 | ** The order of aggregator opcodes is important. The order is:
|
---|
4476 | ** AggReset AggFocus AggNext. In other words, you must execute
|
---|
4477 | ** AggReset first, then zero or more AggFocus operations, then
|
---|
4478 | ** zero or more AggNext operations. You must not execute an AggFocus
|
---|
4479 | ** in between an AggNext and an AggReset.
|
---|
4480 | */
|
---|
4481 | case OP_AggFocus: {
|
---|
4482 | AggElem *pElem;
|
---|
4483 | char *zKey;
|
---|
4484 | int nKey;
|
---|
4485 |
|
---|
4486 | assert( pTos>=p->aStack );
|
---|
4487 | Stringify(pTos);
|
---|
4488 | zKey = pTos->z;
|
---|
4489 | nKey = pTos->n;
|
---|
4490 | pElem = sqliteHashFind(&p->agg.hash, zKey, nKey);
|
---|
4491 | if( pElem ){
|
---|
4492 | p->agg.pCurrent = pElem;
|
---|
4493 | pc = pOp->p2 - 1;
|
---|
4494 | }else{
|
---|
4495 | AggInsert(&p->agg, zKey, nKey);
|
---|
4496 | if( sqlite_malloc_failed ) goto no_mem;
|
---|
4497 | }
|
---|
4498 | Release(pTos);
|
---|
4499 | pTos--;
|
---|
4500 | break;
|
---|
4501 | }
|
---|
4502 |
|
---|
4503 | /* Opcode: AggSet * P2 *
|
---|
4504 | **
|
---|
4505 | ** Move the top of the stack into the P2-th field of the current
|
---|
4506 | ** aggregate. String values are duplicated into new memory.
|
---|
4507 | */
|
---|
4508 | case OP_AggSet: {
|
---|
4509 | AggElem *pFocus = AggInFocus(p->agg);
|
---|
4510 | Mem *pMem;
|
---|
4511 | int i = pOp->p2;
|
---|
4512 | assert( pTos>=p->aStack );
|
---|
4513 | if( pFocus==0 ) goto no_mem;
|
---|
4514 | assert( i>=0 && i<p->agg.nMem );
|
---|
4515 | Deephemeralize(pTos);
|
---|
4516 | pMem = &pFocus->aMem[i];
|
---|
4517 | Release(pMem);
|
---|
4518 | *pMem = *pTos;
|
---|
4519 | if( pMem->flags & MEM_Dyn ){
|
---|
4520 | pTos->flags = MEM_Null;
|
---|
4521 | }else if( pMem->flags & MEM_Short ){
|
---|
4522 | pMem->z = pMem->zShort;
|
---|
4523 | }
|
---|
4524 | Release(pTos);
|
---|
4525 | pTos--;
|
---|
4526 | break;
|
---|
4527 | }
|
---|
4528 |
|
---|
4529 | /* Opcode: AggGet * P2 *
|
---|
4530 | **
|
---|
4531 | ** Push a new entry onto the stack which is a copy of the P2-th field
|
---|
4532 | ** of the current aggregate. Strings are not duplicated so
|
---|
4533 | ** string values will be ephemeral.
|
---|
4534 | */
|
---|
4535 | case OP_AggGet: {
|
---|
4536 | AggElem *pFocus = AggInFocus(p->agg);
|
---|
4537 | Mem *pMem;
|
---|
4538 | int i = pOp->p2;
|
---|
4539 | if( pFocus==0 ) goto no_mem;
|
---|
4540 | assert( i>=0 && i<p->agg.nMem );
|
---|
4541 | pTos++;
|
---|
4542 | pMem = &pFocus->aMem[i];
|
---|
4543 | *pTos = *pMem;
|
---|
4544 | if( pTos->flags & MEM_Str ){
|
---|
4545 | pTos->flags &= ~(MEM_Dyn|MEM_Static|MEM_Short);
|
---|
4546 | pTos->flags |= MEM_Ephem;
|
---|
4547 | }
|
---|
4548 | if( pTos->flags & MEM_AggCtx ){
|
---|
4549 | Release(pTos);
|
---|
4550 | pTos->flags = MEM_Null;
|
---|
4551 | }
|
---|
4552 | break;
|
---|
4553 | }
|
---|
4554 |
|
---|
4555 | /* Opcode: AggNext * P2 *
|
---|
4556 | **
|
---|
4557 | ** Make the next aggregate value the current aggregate. The prior
|
---|
4558 | ** aggregate is deleted. If all aggregate values have been consumed,
|
---|
4559 | ** jump to P2.
|
---|
4560 | **
|
---|
4561 | ** The order of aggregator opcodes is important. The order is:
|
---|
4562 | ** AggReset AggFocus AggNext. In other words, you must execute
|
---|
4563 | ** AggReset first, then zero or more AggFocus operations, then
|
---|
4564 | ** zero or more AggNext operations. You must not execute an AggFocus
|
---|
4565 | ** in between an AggNext and an AggReset.
|
---|
4566 | */
|
---|
4567 | case OP_AggNext: {
|
---|
4568 | CHECK_FOR_INTERRUPT;
|
---|
4569 | if( p->agg.pSearch==0 ){
|
---|
4570 | p->agg.pSearch = sqliteHashFirst(&p->agg.hash);
|
---|
4571 | }else{
|
---|
4572 | p->agg.pSearch = sqliteHashNext(p->agg.pSearch);
|
---|
4573 | }
|
---|
4574 | if( p->agg.pSearch==0 ){
|
---|
4575 | pc = pOp->p2 - 1;
|
---|
4576 | } else {
|
---|
4577 | int i;
|
---|
4578 | sqlite_func ctx;
|
---|
4579 | Mem *aMem;
|
---|
4580 | p->agg.pCurrent = sqliteHashData(p->agg.pSearch);
|
---|
4581 | aMem = p->agg.pCurrent->aMem;
|
---|
4582 | for(i=0; i<p->agg.nMem; i++){
|
---|
4583 | int freeCtx;
|
---|
4584 | if( p->agg.apFunc[i]==0 ) continue;
|
---|
4585 | if( p->agg.apFunc[i]->xFinalize==0 ) continue;
|
---|
4586 | ctx.s.flags = MEM_Null;
|
---|
4587 | ctx.s.z = aMem[i].zShort;
|
---|
4588 | ctx.pAgg = (void*)aMem[i].z;
|
---|
4589 | freeCtx = aMem[i].z && aMem[i].z!=aMem[i].zShort;
|
---|
4590 | ctx.cnt = aMem[i].i;
|
---|
4591 | ctx.isStep = 0;
|
---|
4592 | ctx.pFunc = p->agg.apFunc[i];
|
---|
4593 | (*p->agg.apFunc[i]->xFinalize)(&ctx);
|
---|
4594 | if( freeCtx ){
|
---|
4595 | sqliteFree( aMem[i].z );
|
---|
4596 | }
|
---|
4597 | aMem[i] = ctx.s;
|
---|
4598 | if( aMem[i].flags & MEM_Short ){
|
---|
4599 | aMem[i].z = aMem[i].zShort;
|
---|
4600 | }
|
---|
4601 | }
|
---|
4602 | }
|
---|
4603 | break;
|
---|
4604 | }
|
---|
4605 |
|
---|
4606 | /* Opcode: SetInsert P1 * P3
|
---|
4607 | **
|
---|
4608 | ** If Set P1 does not exist then create it. Then insert value
|
---|
4609 | ** P3 into that set. If P3 is NULL, then insert the top of the
|
---|
4610 | ** stack into the set.
|
---|
4611 | */
|
---|
4612 | case OP_SetInsert: {
|
---|
4613 | int i = pOp->p1;
|
---|
4614 | if( p->nSet<=i ){
|
---|
4615 | int k;
|
---|
4616 | Set *aSet = sqliteRealloc(p->aSet, (i+1)*sizeof(p->aSet[0]) );
|
---|
4617 | if( aSet==0 ) goto no_mem;
|
---|
4618 | p->aSet = aSet;
|
---|
4619 | for(k=p->nSet; k<=i; k++){
|
---|
4620 | sqliteHashInit(&p->aSet[k].hash, SQLITE_HASH_BINARY, 1);
|
---|
4621 | }
|
---|
4622 | p->nSet = i+1;
|
---|
4623 | }
|
---|
4624 | if( pOp->p3 ){
|
---|
4625 | sqliteHashInsert(&p->aSet[i].hash, pOp->p3, strlen(pOp->p3)+1, p);
|
---|
4626 | }else{
|
---|
4627 | assert( pTos>=p->aStack );
|
---|
4628 | Stringify(pTos);
|
---|
4629 | sqliteHashInsert(&p->aSet[i].hash, pTos->z, pTos->n, p);
|
---|
4630 | Release(pTos);
|
---|
4631 | pTos--;
|
---|
4632 | }
|
---|
4633 | if( sqlite_malloc_failed ) goto no_mem;
|
---|
4634 | break;
|
---|
4635 | }
|
---|
4636 |
|
---|
4637 | /* Opcode: SetFound P1 P2 *
|
---|
4638 | **
|
---|
4639 | ** Pop the stack once and compare the value popped off with the
|
---|
4640 | ** contents of set P1. If the element popped exists in set P1,
|
---|
4641 | ** then jump to P2. Otherwise fall through.
|
---|
4642 | */
|
---|
4643 | case OP_SetFound: {
|
---|
4644 | int i = pOp->p1;
|
---|
4645 | assert( pTos>=p->aStack );
|
---|
4646 | Stringify(pTos);
|
---|
4647 | if( i>=0 && i<p->nSet && sqliteHashFind(&p->aSet[i].hash, pTos->z, pTos->n)){
|
---|
4648 | pc = pOp->p2 - 1;
|
---|
4649 | }
|
---|
4650 | Release(pTos);
|
---|
4651 | pTos--;
|
---|
4652 | break;
|
---|
4653 | }
|
---|
4654 |
|
---|
4655 | /* Opcode: SetNotFound P1 P2 *
|
---|
4656 | **
|
---|
4657 | ** Pop the stack once and compare the value popped off with the
|
---|
4658 | ** contents of set P1. If the element popped does not exists in
|
---|
4659 | ** set P1, then jump to P2. Otherwise fall through.
|
---|
4660 | */
|
---|
4661 | case OP_SetNotFound: {
|
---|
4662 | int i = pOp->p1;
|
---|
4663 | assert( pTos>=p->aStack );
|
---|
4664 | Stringify(pTos);
|
---|
4665 | if( i<0 || i>=p->nSet ||
|
---|
4666 | sqliteHashFind(&p->aSet[i].hash, pTos->z, pTos->n)==0 ){
|
---|
4667 | pc = pOp->p2 - 1;
|
---|
4668 | }
|
---|
4669 | Release(pTos);
|
---|
4670 | pTos--;
|
---|
4671 | break;
|
---|
4672 | }
|
---|
4673 |
|
---|
4674 | /* Opcode: SetFirst P1 P2 *
|
---|
4675 | **
|
---|
4676 | ** Read the first element from set P1 and push it onto the stack. If the
|
---|
4677 | ** set is empty, push nothing and jump immediately to P2. This opcode is
|
---|
4678 | ** used in combination with OP_SetNext to loop over all elements of a set.
|
---|
4679 | */
|
---|
4680 | /* Opcode: SetNext P1 P2 *
|
---|
4681 | **
|
---|
4682 | ** Read the next element from set P1 and push it onto the stack. If there
|
---|
4683 | ** are no more elements in the set, do not do the push and fall through.
|
---|
4684 | ** Otherwise, jump to P2 after pushing the next set element.
|
---|
4685 | */
|
---|
4686 | case OP_SetFirst:
|
---|
4687 | case OP_SetNext: {
|
---|
4688 | Set *pSet;
|
---|
4689 | CHECK_FOR_INTERRUPT;
|
---|
4690 | if( pOp->p1<0 || pOp->p1>=p->nSet ){
|
---|
4691 | if( pOp->opcode==OP_SetFirst ) pc = pOp->p2 - 1;
|
---|
4692 | break;
|
---|
4693 | }
|
---|
4694 | pSet = &p->aSet[pOp->p1];
|
---|
4695 | if( pOp->opcode==OP_SetFirst ){
|
---|
4696 | pSet->prev = sqliteHashFirst(&pSet->hash);
|
---|
4697 | if( pSet->prev==0 ){
|
---|
4698 | pc = pOp->p2 - 1;
|
---|
4699 | break;
|
---|
4700 | }
|
---|
4701 | }else{
|
---|
4702 | if( pSet->prev ){
|
---|
4703 | pSet->prev = sqliteHashNext(pSet->prev);
|
---|
4704 | }
|
---|
4705 | if( pSet->prev==0 ){
|
---|
4706 | break;
|
---|
4707 | }else{
|
---|
4708 | pc = pOp->p2 - 1;
|
---|
4709 | }
|
---|
4710 | }
|
---|
4711 | pTos++;
|
---|
4712 | pTos->z = sqliteHashKey(pSet->prev);
|
---|
4713 | pTos->n = sqliteHashKeysize(pSet->prev);
|
---|
4714 | pTos->flags = MEM_Str | MEM_Ephem;
|
---|
4715 | break;
|
---|
4716 | }
|
---|
4717 |
|
---|
4718 | /* Opcode: Vacuum * * *
|
---|
4719 | **
|
---|
4720 | ** Vacuum the entire database. This opcode will cause other virtual
|
---|
4721 | ** machines to be created and run. It may not be called from within
|
---|
4722 | ** a transaction.
|
---|
4723 | */
|
---|
4724 | case OP_Vacuum: {
|
---|
4725 | if( sqliteSafetyOff(db) ) goto abort_due_to_misuse;
|
---|
4726 | rc = sqliteRunVacuum(&p->zErrMsg, db);
|
---|
4727 | if( sqliteSafetyOn(db) ) goto abort_due_to_misuse;
|
---|
4728 | break;
|
---|
4729 | }
|
---|
4730 |
|
---|
4731 | /* Opcode: StackDepth * * *
|
---|
4732 | **
|
---|
4733 | ** Push an integer onto the stack which is the depth of the stack prior
|
---|
4734 | ** to that integer being pushed.
|
---|
4735 | */
|
---|
4736 | case OP_StackDepth: {
|
---|
4737 | int depth = (&pTos[1]) - p->aStack;
|
---|
4738 | pTos++;
|
---|
4739 | pTos->i = depth;
|
---|
4740 | pTos->flags = MEM_Int;
|
---|
4741 | break;
|
---|
4742 | }
|
---|
4743 |
|
---|
4744 | /* Opcode: StackReset * * *
|
---|
4745 | **
|
---|
4746 | ** Pop a single integer off of the stack. Then pop the stack
|
---|
4747 | ** as many times as necessary to get the depth of the stack down
|
---|
4748 | ** to the value of the integer that was popped.
|
---|
4749 | */
|
---|
4750 | case OP_StackReset: {
|
---|
4751 | int depth, goal;
|
---|
4752 | assert( pTos>=p->aStack );
|
---|
4753 | Integerify(pTos);
|
---|
4754 | goal = pTos->i;
|
---|
4755 | depth = (&pTos[1]) - p->aStack;
|
---|
4756 | assert( goal<depth );
|
---|
4757 | popStack(&pTos, depth-goal);
|
---|
4758 | break;
|
---|
4759 | }
|
---|
4760 |
|
---|
4761 | /* An other opcode is illegal...
|
---|
4762 | */
|
---|
4763 | default: {
|
---|
4764 | sqlite_snprintf(sizeof(zBuf),zBuf,"%d",pOp->opcode);
|
---|
4765 | sqliteSetString(&p->zErrMsg, "unknown opcode ", zBuf, (char*)0);
|
---|
4766 | rc = SQLITE_INTERNAL;
|
---|
4767 | break;
|
---|
4768 | }
|
---|
4769 |
|
---|
4770 | /*****************************************************************************
|
---|
4771 | ** The cases of the switch statement above this line should all be indented
|
---|
4772 | ** by 6 spaces. But the left-most 6 spaces have been removed to improve the
|
---|
4773 | ** readability. From this point on down, the normal indentation rules are
|
---|
4774 | ** restored.
|
---|
4775 | *****************************************************************************/
|
---|
4776 | }
|
---|
4777 |
|
---|
4778 | #ifdef VDBE_PROFILE
|
---|
4779 | {
|
---|
4780 | long long elapse = hwtime() - start;
|
---|
4781 | pOp->cycles += elapse;
|
---|
4782 | pOp->cnt++;
|
---|
4783 | #if 0
|
---|
4784 | fprintf(stdout, "%10lld ", elapse);
|
---|
4785 | sqliteVdbePrintOp(stdout, origPc, &p->aOp[origPc]);
|
---|
4786 | #endif
|
---|
4787 | }
|
---|
4788 | #endif
|
---|
4789 |
|
---|
4790 | /* The following code adds nothing to the actual functionality
|
---|
4791 | ** of the program. It is only here for testing and debugging.
|
---|
4792 | ** On the other hand, it does burn CPU cycles every time through
|
---|
4793 | ** the evaluator loop. So we can leave it out when NDEBUG is defined.
|
---|
4794 | */
|
---|
4795 | #ifndef NDEBUG
|
---|
4796 | /* Sanity checking on the top element of the stack */
|
---|
4797 | if( pTos>=p->aStack ){
|
---|
4798 | assert( pTos->flags!=0 ); /* Must define some type */
|
---|
4799 | if( pTos->flags & MEM_Str ){
|
---|
4800 | int x = pTos->flags & (MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short);
|
---|
4801 | assert( x!=0 ); /* Strings must define a string subtype */
|
---|
4802 | assert( (x & (x-1))==0 ); /* Only one string subtype can be defined */
|
---|
4803 | assert( pTos->z!=0 ); /* Strings must have a value */
|
---|
4804 | /* Mem.z points to Mem.zShort iff the subtype is MEM_Short */
|
---|
4805 | assert( (pTos->flags & MEM_Short)==0 || pTos->z==pTos->zShort );
|
---|
4806 | assert( (pTos->flags & MEM_Short)!=0 || pTos->z!=pTos->zShort );
|
---|
4807 | }else{
|
---|
4808 | /* Cannot define a string subtype for non-string objects */
|
---|
4809 | assert( (pTos->flags & (MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short))==0 );
|
---|
4810 | }
|
---|
4811 | /* MEM_Null excludes all other types */
|
---|
4812 | assert( pTos->flags==MEM_Null || (pTos->flags&MEM_Null)==0 );
|
---|
4813 | }
|
---|
4814 | if( pc<-1 || pc>=p->nOp ){
|
---|
4815 | sqliteSetString(&p->zErrMsg, "jump destination out of range", (char*)0);
|
---|
4816 | rc = SQLITE_INTERNAL;
|
---|
4817 | }
|
---|
4818 | if( p->trace && pTos>=p->aStack ){
|
---|
4819 | int i;
|
---|
4820 | fprintf(p->trace, "Stack:");
|
---|
4821 | for(i=0; i>-5 && &pTos[i]>=p->aStack; i--){
|
---|
4822 | if( pTos[i].flags & MEM_Null ){
|
---|
4823 | fprintf(p->trace, " NULL");
|
---|
4824 | }else if( (pTos[i].flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
|
---|
4825 | fprintf(p->trace, " si:%d", pTos[i].i);
|
---|
4826 | }else if( pTos[i].flags & MEM_Int ){
|
---|
4827 | fprintf(p->trace, " i:%d", pTos[i].i);
|
---|
4828 | }else if( pTos[i].flags & MEM_Real ){
|
---|
4829 | fprintf(p->trace, " r:%g", pTos[i].r);
|
---|
4830 | }else if( pTos[i].flags & MEM_Str ){
|
---|
4831 | int j, k;
|
---|
4832 | char zBuf[100];
|
---|
4833 | zBuf[0] = ' ';
|
---|
4834 | if( pTos[i].flags & MEM_Dyn ){
|
---|
4835 | zBuf[1] = 'z';
|
---|
4836 | assert( (pTos[i].flags & (MEM_Static|MEM_Ephem))==0 );
|
---|
4837 | }else if( pTos[i].flags & MEM_Static ){
|
---|
4838 | zBuf[1] = 't';
|
---|
4839 | assert( (pTos[i].flags & (MEM_Dyn|MEM_Ephem))==0 );
|
---|
4840 | }else if( pTos[i].flags & MEM_Ephem ){
|
---|
4841 | zBuf[1] = 'e';
|
---|
4842 | assert( (pTos[i].flags & (MEM_Static|MEM_Dyn))==0 );
|
---|
4843 | }else{
|
---|
4844 | zBuf[1] = 's';
|
---|
4845 | }
|
---|
4846 | zBuf[2] = '[';
|
---|
4847 | k = 3;
|
---|
4848 | for(j=0; j<20 && j<pTos[i].n; j++){
|
---|
4849 | int c = pTos[i].z[j];
|
---|
4850 | if( c==0 && j==pTos[i].n-1 ) break;
|
---|
4851 | if( isprint(c) && !isspace(c) ){
|
---|
4852 | zBuf[k++] = c;
|
---|
4853 | }else{
|
---|
4854 | zBuf[k++] = '.';
|
---|
4855 | }
|
---|
4856 | }
|
---|
4857 | zBuf[k++] = ']';
|
---|
4858 | zBuf[k++] = 0;
|
---|
4859 | fprintf(p->trace, "%s", zBuf);
|
---|
4860 | }else{
|
---|
4861 | fprintf(p->trace, " ???");
|
---|
4862 | }
|
---|
4863 | }
|
---|
4864 | if( rc!=0 ) fprintf(p->trace," rc=%d",rc);
|
---|
4865 | fprintf(p->trace,"\n");
|
---|
4866 | }
|
---|
4867 | #endif
|
---|
4868 | } /* The end of the for(;;) loop the loops through opcodes */
|
---|
4869 |
|
---|
4870 | /* If we reach this point, it means that execution is finished.
|
---|
4871 | */
|
---|
4872 | vdbe_halt:
|
---|
4873 | CHECK_FOR_INTERRUPT
|
---|
4874 | if( rc ){
|
---|
4875 | p->rc = rc;
|
---|
4876 | rc = SQLITE_ERROR;
|
---|
4877 | }else{
|
---|
4878 | rc = SQLITE_DONE;
|
---|
4879 | }
|
---|
4880 | p->magic = VDBE_MAGIC_HALT;
|
---|
4881 | p->pTos = pTos;
|
---|
4882 | return rc;
|
---|
4883 |
|
---|
4884 | /* Jump to here if a malloc() fails. It's hard to get a malloc()
|
---|
4885 | ** to fail on a modern VM computer, so this code is untested.
|
---|
4886 | */
|
---|
4887 | no_mem:
|
---|
4888 | sqliteSetString(&p->zErrMsg, "out of memory", (char*)0);
|
---|
4889 | rc = SQLITE_NOMEM;
|
---|
4890 | goto vdbe_halt;
|
---|
4891 |
|
---|
4892 | /* Jump to here for an SQLITE_MISUSE error.
|
---|
4893 | */
|
---|
4894 | abort_due_to_misuse:
|
---|
4895 | rc = SQLITE_MISUSE;
|
---|
4896 | /* Fall thru into abort_due_to_error */
|
---|
4897 |
|
---|
4898 | /* Jump to here for any other kind of fatal error. The "rc" variable
|
---|
4899 | ** should hold the error number.
|
---|
4900 | */
|
---|
4901 | abort_due_to_error:
|
---|
4902 | if( p->zErrMsg==0 ){
|
---|
4903 | if( sqlite_malloc_failed ) rc = SQLITE_NOMEM;
|
---|
4904 | sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
|
---|
4905 | }
|
---|
4906 | goto vdbe_halt;
|
---|
4907 |
|
---|
4908 | /* Jump to here if the sqlite_interrupt() API sets the interrupt
|
---|
4909 | ** flag.
|
---|
4910 | */
|
---|
4911 | abort_due_to_interrupt:
|
---|
4912 | assert( db->flags & SQLITE_Interrupt );
|
---|
4913 | db->flags &= ~SQLITE_Interrupt;
|
---|
4914 | if( db->magic!=SQLITE_MAGIC_BUSY ){
|
---|
4915 | rc = SQLITE_MISUSE;
|
---|
4916 | }else{
|
---|
4917 | rc = SQLITE_INTERRUPT;
|
---|
4918 | }
|
---|
4919 | sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
|
---|
4920 | goto vdbe_halt;
|
---|
4921 | }
|
---|