blob: d65995be031497c43327ef07923aee9f7cc16909 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** 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.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
drh9a324642003-09-06 20:12:01 +000012** 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**
danielk1977fc57d7b2004-05-26 02:04:57 +000018** In the external interface, an "sqlite3_stmt*" is an opaque pointer
drh9a324642003-09-06 20:12:01 +000019** to a VDBE.
drh75897232000-05-29 14:26:00 +000020**
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
drh9cbf3422008-01-17 16:22:13 +000025** and 5 operands. Operands P1, P2, and P3 are integers. Operand P4
26** is a null-terminated string. Operand P5 is an unsigned character.
27** Few opcodes use all 5 operands.
drh75897232000-05-29 14:26:00 +000028**
drh9cbf3422008-01-17 16:22:13 +000029** Computation results are stored on a set of registers numbered beginning
30** with 1 and going up to Vdbe.nMem. Each register can store
31** either an integer, a null-terminated string, a floating point
shane21e7feb2008-05-30 15:59:49 +000032** number, or the SQL "NULL" value. An implicit conversion from one
drhb19a2bc2001-09-16 00:13:26 +000033** type to the other occurs as necessary.
drh75897232000-05-29 14:26:00 +000034**
danielk19774adee202004-05-08 08:23:19 +000035** Most of the code in this file is taken up by the sqlite3VdbeExec()
drh75897232000-05-29 14:26:00 +000036** 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**
drhac82fcf2002-09-08 17:23:41 +000040** 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**
drha3460582008-07-11 21:02:53 +000046** $Id: vdbe.c,v 1.761 2008/07/11 21:02:54 drh Exp $
drh75897232000-05-29 14:26:00 +000047*/
48#include "sqliteInt.h"
drh7c68d602000-10-11 19:28:51 +000049#include <ctype.h>
drh9a324642003-09-06 20:12:01 +000050#include "vdbeInt.h"
drh8f619cc2002-09-08 00:04:50 +000051
52/*
drh487ab3c2001-11-08 00:45:21 +000053** The following global variable is incremented every time a cursor
drh7cf6e4d2004-05-19 14:56:55 +000054** moves, either by the OP_MoveXX, OP_Next, or OP_Prev opcodes. The test
drh487ab3c2001-11-08 00:45:21 +000055** procedures use this information to make sure that indices are
drhac82fcf2002-09-08 17:23:41 +000056** working correctly. This variable has no function other than to
57** help verify the correct operation of the library.
drh487ab3c2001-11-08 00:45:21 +000058*/
drh0f7eb612006-08-08 13:51:43 +000059#ifdef SQLITE_TEST
danielk19776f8a5032004-05-10 10:34:51 +000060int sqlite3_search_count = 0;
drh0f7eb612006-08-08 13:51:43 +000061#endif
drh487ab3c2001-11-08 00:45:21 +000062
drhf6038712004-02-08 18:07:34 +000063/*
64** When this global variable is positive, it gets decremented once before
drh881feaa2006-07-26 01:39:30 +000065** each instruction in the VDBE. When reaches zero, the u1.isInterrupted
66** field of the sqlite3 structure is set in order to simulate and interrupt.
drhf6038712004-02-08 18:07:34 +000067**
68** This facility is used for testing purposes only. It does not function
69** in an ordinary build.
70*/
drh0f7eb612006-08-08 13:51:43 +000071#ifdef SQLITE_TEST
danielk19776f8a5032004-05-10 10:34:51 +000072int sqlite3_interrupt_count = 0;
drh0f7eb612006-08-08 13:51:43 +000073#endif
drh1350b032002-02-27 19:00:20 +000074
danielk19777e18c252004-05-25 11:47:24 +000075/*
drh6bf89572004-11-03 16:27:01 +000076** The next global variable is incremented each type the OP_Sort opcode
77** is executed. The test procedures use this information to make sure that
shane21e7feb2008-05-30 15:59:49 +000078** sorting is occurring or not occurring at appropriate times. This variable
drh6bf89572004-11-03 16:27:01 +000079** has no function other than to help verify the correct operation of the
80** library.
81*/
drh0f7eb612006-08-08 13:51:43 +000082#ifdef SQLITE_TEST
drh6bf89572004-11-03 16:27:01 +000083int sqlite3_sort_count = 0;
drh0f7eb612006-08-08 13:51:43 +000084#endif
drh6bf89572004-11-03 16:27:01 +000085
86/*
drhae7e1512007-05-02 16:51:59 +000087** The next global variable records the size of the largest MEM_Blob
drh9cbf3422008-01-17 16:22:13 +000088** or MEM_Str that has been used by a VDBE opcode. The test procedures
drhae7e1512007-05-02 16:51:59 +000089** use this information to make sure that the zero-blob functionality
90** is working correctly. This variable has no function other than to
91** help verify the correct operation of the library.
92*/
93#ifdef SQLITE_TEST
94int sqlite3_max_blobsize = 0;
drhca48c902008-01-18 14:08:24 +000095static void updateMaxBlobsize(Mem *p){
96 if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){
97 sqlite3_max_blobsize = p->n;
98 }
99}
drhae7e1512007-05-02 16:51:59 +0000100#endif
101
102/*
drhb7654112008-01-12 12:48:07 +0000103** Test a register to see if it exceeds the current maximum blob size.
104** If it does, record the new maximum blob size.
105*/
drh678ccce2008-03-31 18:19:54 +0000106#if defined(SQLITE_TEST) && !defined(SQLITE_OMIT_BUILTIN_TEST)
drhca48c902008-01-18 14:08:24 +0000107# define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P)
drhb7654112008-01-12 12:48:07 +0000108#else
109# define UPDATE_MAX_BLOBSIZE(P)
110#endif
111
112/*
drh9cbf3422008-01-17 16:22:13 +0000113** Release the memory associated with a register. This
drh6810ce62004-01-31 19:22:56 +0000114** leaves the Mem.flags field in an inconsistent state.
drhc61053b2000-06-04 12:58:36 +0000115*/
danielk1977d8123362004-06-12 09:25:12 +0000116#define Release(P) if((P)->flags&MEM_Dyn){ sqlite3VdbeMemRelease(P); }
drh6810ce62004-01-31 19:22:56 +0000117
118/*
drh9cbf3422008-01-17 16:22:13 +0000119** Convert the given register into a string if it isn't one
danielk1977bd7e4602004-05-24 07:34:48 +0000120** already. Return non-zero if a malloc() fails.
121*/
drhb21c8cd2007-08-21 19:33:56 +0000122#define Stringify(P, enc) \
123 if(((P)->flags&(MEM_Str|MEM_Blob))==0 && sqlite3VdbeMemStringify(P,enc)) \
drhf4479502004-05-27 03:12:53 +0000124 { goto no_mem; }
danielk1977bd7e4602004-05-24 07:34:48 +0000125
126/*
danielk1977bd7e4602004-05-24 07:34:48 +0000127** An ephemeral string value (signified by the MEM_Ephem flag) contains
128** a pointer to a dynamically allocated string where some other entity
drh9cbf3422008-01-17 16:22:13 +0000129** is responsible for deallocating that string. Because the register
130** does not control the string, it might be deleted without the register
131** knowing it.
danielk1977bd7e4602004-05-24 07:34:48 +0000132**
133** This routine converts an ephemeral string into a dynamically allocated
drh9cbf3422008-01-17 16:22:13 +0000134** string that the register itself controls. In other words, it
danielk1977bd7e4602004-05-24 07:34:48 +0000135** converts an MEM_Ephem string into an MEM_Dyn string.
136*/
drhb21c8cd2007-08-21 19:33:56 +0000137#define Deephemeralize(P) \
drheb2e1762004-05-27 01:53:56 +0000138 if( ((P)->flags&MEM_Ephem)!=0 \
drhb21c8cd2007-08-21 19:33:56 +0000139 && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;}
danielk197793d46752004-05-23 13:30:58 +0000140
141/*
danielk19771cc5ed82007-05-16 17:28:43 +0000142** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*)
143** P if required.
144*/
drhb21c8cd2007-08-21 19:33:56 +0000145#define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0)
danielk19771cc5ed82007-05-16 17:28:43 +0000146
147/*
shane21e7feb2008-05-30 15:59:49 +0000148** Argument pMem points at a register that will be passed to a
danielk1977c572ef72004-05-27 09:28:41 +0000149** user-defined function or returned to the user as the result of a query.
150** The second argument, 'db_enc' is the text encoding used by the vdbe for
drh9cbf3422008-01-17 16:22:13 +0000151** register variables. This routine sets the pMem->enc and pMem->type
danielk1977c572ef72004-05-27 09:28:41 +0000152** variables used by the sqlite3_value_*() routines.
153*/
drh3a41a3f2004-05-30 02:14:17 +0000154#define storeTypeInfo(A,B) _storeTypeInfo(A)
155static void _storeTypeInfo(Mem *pMem){
danielk1977c572ef72004-05-27 09:28:41 +0000156 int flags = pMem->flags;
157 if( flags & MEM_Null ){
drh9c054832004-05-31 18:51:57 +0000158 pMem->type = SQLITE_NULL;
danielk1977c572ef72004-05-27 09:28:41 +0000159 }
160 else if( flags & MEM_Int ){
drh9c054832004-05-31 18:51:57 +0000161 pMem->type = SQLITE_INTEGER;
danielk1977c572ef72004-05-27 09:28:41 +0000162 }
163 else if( flags & MEM_Real ){
drh9c054832004-05-31 18:51:57 +0000164 pMem->type = SQLITE_FLOAT;
danielk1977c572ef72004-05-27 09:28:41 +0000165 }
166 else if( flags & MEM_Str ){
drh9c054832004-05-31 18:51:57 +0000167 pMem->type = SQLITE_TEXT;
danielk1977c572ef72004-05-27 09:28:41 +0000168 }else{
drh9c054832004-05-31 18:51:57 +0000169 pMem->type = SQLITE_BLOB;
danielk1977c572ef72004-05-27 09:28:41 +0000170 }
171}
danielk19778a6b5412004-05-24 07:04:25 +0000172
173/*
drh3a40f692008-01-04 16:50:09 +0000174** Properties of opcodes. The OPFLG_INITIALIZER macro is
175** created by mkopcodeh.awk during compilation. Data is obtained
176** from the comments following the "case OP_xxxx:" statements in
177** this file.
drh3a40f692008-01-04 16:50:09 +0000178*/
drh9cbf3422008-01-17 16:22:13 +0000179static unsigned char opcodeProperty[] = OPFLG_INITIALIZER;
drh3a40f692008-01-04 16:50:09 +0000180
181/*
182** Return true if an opcode has any of the OPFLG_xxx properties
183** specified by mask.
184*/
185int sqlite3VdbeOpcodeHasProperty(int opcode, int mask){
186 assert( opcode>0 && opcode<sizeof(opcodeProperty) );
187 return (opcodeProperty[opcode]&mask)!=0;
188}
189
190/*
drh4774b132004-06-12 20:12:51 +0000191** Allocate cursor number iCur. Return a pointer to it. Return NULL
192** if we run out of memory.
drh8c74a8c2002-08-25 19:20:40 +0000193*/
danielk1977cd3e8f72008-03-25 09:47:35 +0000194static Cursor *allocateCursor(
195 Vdbe *p,
196 int iCur,
197 Op *pOp,
198 int iDb,
199 int isBtreeCursor
200){
201 /* Find the memory cell that will be used to store the blob of memory
202 ** required for this Cursor structure. It is convenient to use a
203 ** vdbe memory cell to manage the memory allocation required for a
204 ** Cursor structure for the following reasons:
205 **
206 ** * Sometimes cursor numbers are used for a couple of different
207 ** purposes in a vdbe program. The different uses might require
208 ** different sized allocations. Memory cells provide growable
209 ** allocations.
210 **
211 ** * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can
212 ** be freed lazily via the sqlite3_release_memory() API. This
213 ** minimizes the number of malloc calls made by the system.
214 **
215 ** Memory cells for cursors are allocated at the top of the address
216 ** space. Memory cell (p->nMem) corresponds to cursor 0. Space for
217 ** cursor 1 is managed by memory cell (p->nMem-1), etc.
218 */
219 Mem *pMem = &p->aMem[p->nMem-iCur];
220
danielk19775f096132008-03-28 15:44:09 +0000221 int nByte;
danielk1977cd3e8f72008-03-25 09:47:35 +0000222 Cursor *pCx = 0;
223 /* If the opcode of pOp is OP_SetNumColumns, then pOp->p2 contains
224 ** the number of fields in the records contained in the table or
225 ** index being opened. Use this to reserve space for the
226 ** Cursor.aType[] array.
227 */
228 int nField = 0;
229 if( pOp->opcode==OP_SetNumColumns || pOp->opcode==OP_OpenEphemeral ){
230 nField = pOp->p2;
231 }
danielk19775f096132008-03-28 15:44:09 +0000232 nByte =
danielk1977cd3e8f72008-03-25 09:47:35 +0000233 sizeof(Cursor) +
234 (isBtreeCursor?sqlite3BtreeCursorSize():0) +
235 2*nField*sizeof(u32);
236
drh290c1942004-08-21 17:54:45 +0000237 assert( iCur<p->nCursor );
238 if( p->apCsr[iCur] ){
danielk1977be718892006-06-23 08:05:19 +0000239 sqlite3VdbeFreeCursor(p, p->apCsr[iCur]);
danielk1977cd3e8f72008-03-25 09:47:35 +0000240 p->apCsr[iCur] = 0;
drh8c74a8c2002-08-25 19:20:40 +0000241 }
danielk1977cd3e8f72008-03-25 09:47:35 +0000242 if( SQLITE_OK==sqlite3VdbeMemGrow(pMem, nByte, 0) ){
243 p->apCsr[iCur] = pCx = (Cursor *)pMem->z;
244 memset(pMem->z, 0, nByte);
danielk197794eb6a12005-12-15 15:22:08 +0000245 pCx->iDb = iDb;
danielk1977cd3e8f72008-03-25 09:47:35 +0000246 pCx->nField = nField;
247 if( nField ){
248 pCx->aType = (u32 *)&pMem->z[sizeof(Cursor)];
249 }
250 if( isBtreeCursor ){
251 pCx->pCursor = (BtCursor *)&pMem->z[sizeof(Cursor)+2*nField*sizeof(u32)];
252 }
danielk197794eb6a12005-12-15 15:22:08 +0000253 }
drh4774b132004-06-12 20:12:51 +0000254 return pCx;
drh8c74a8c2002-08-25 19:20:40 +0000255}
256
danielk19773d1bfea2004-05-14 11:00:53 +0000257/*
drh29d72102006-02-09 22:13:41 +0000258** Try to convert a value into a numeric representation if we can
259** do so without loss of information. In other words, if the string
260** looks like a number, convert it into a number. If it does not
261** look like a number, leave it alone.
262*/
drhb21c8cd2007-08-21 19:33:56 +0000263static void applyNumericAffinity(Mem *pRec){
drh29d72102006-02-09 22:13:41 +0000264 if( (pRec->flags & (MEM_Real|MEM_Int))==0 ){
265 int realnum;
drhb21c8cd2007-08-21 19:33:56 +0000266 sqlite3VdbeMemNulTerminate(pRec);
drh29d72102006-02-09 22:13:41 +0000267 if( (pRec->flags&MEM_Str)
268 && sqlite3IsNumber(pRec->z, &realnum, pRec->enc) ){
269 i64 value;
drhb21c8cd2007-08-21 19:33:56 +0000270 sqlite3VdbeChangeEncoding(pRec, SQLITE_UTF8);
drhb6a9ece2007-06-26 00:37:27 +0000271 if( !realnum && sqlite3Atoi64(pRec->z, &value) ){
drh3c024d62007-03-30 11:23:45 +0000272 pRec->u.i = value;
danielk1977a7a8e142008-02-13 18:25:27 +0000273 MemSetTypeFlag(pRec, MEM_Int);
drh29d72102006-02-09 22:13:41 +0000274 }else{
275 sqlite3VdbeMemRealify(pRec);
276 }
277 }
278 }
279}
280
281/*
drh8a512562005-11-14 22:29:05 +0000282** Processing is determine by the affinity parameter:
danielk19773d1bfea2004-05-14 11:00:53 +0000283**
drh8a512562005-11-14 22:29:05 +0000284** SQLITE_AFF_INTEGER:
285** SQLITE_AFF_REAL:
286** SQLITE_AFF_NUMERIC:
287** Try to convert pRec to an integer representation or a
288** floating-point representation if an integer representation
289** is not possible. Note that the integer representation is
290** always preferred, even if the affinity is REAL, because
291** an integer representation is more space efficient on disk.
292**
293** SQLITE_AFF_TEXT:
294** Convert pRec to a text representation.
295**
296** SQLITE_AFF_NONE:
297** No-op. pRec is unchanged.
danielk19773d1bfea2004-05-14 11:00:53 +0000298*/
drh17435752007-08-16 04:30:38 +0000299static void applyAffinity(
drh17435752007-08-16 04:30:38 +0000300 Mem *pRec, /* The value to apply affinity to */
301 char affinity, /* The affinity to be applied */
302 u8 enc /* Use this text encoding */
303){
drh8a512562005-11-14 22:29:05 +0000304 if( affinity==SQLITE_AFF_TEXT ){
drh17c40292004-07-21 02:53:29 +0000305 /* Only attempt the conversion to TEXT if there is an integer or real
306 ** representation (blob and NULL do not get converted) but no string
307 ** representation.
308 */
309 if( 0==(pRec->flags&MEM_Str) && (pRec->flags&(MEM_Real|MEM_Int)) ){
drhb21c8cd2007-08-21 19:33:56 +0000310 sqlite3VdbeMemStringify(pRec, enc);
drh17c40292004-07-21 02:53:29 +0000311 }
312 pRec->flags &= ~(MEM_Real|MEM_Int);
drh8a512562005-11-14 22:29:05 +0000313 }else if( affinity!=SQLITE_AFF_NONE ){
314 assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL
315 || affinity==SQLITE_AFF_NUMERIC );
drhb21c8cd2007-08-21 19:33:56 +0000316 applyNumericAffinity(pRec);
drh29d72102006-02-09 22:13:41 +0000317 if( pRec->flags & MEM_Real ){
drh8df447f2005-11-01 15:48:24 +0000318 sqlite3VdbeIntegerAffinity(pRec);
drh17c40292004-07-21 02:53:29 +0000319 }
danielk19773d1bfea2004-05-14 11:00:53 +0000320 }
321}
322
danielk1977aee18ef2005-03-09 12:26:50 +0000323/*
drh29d72102006-02-09 22:13:41 +0000324** Try to convert the type of a function argument or a result column
325** into a numeric representation. Use either INTEGER or REAL whichever
326** is appropriate. But only do the conversion if it is possible without
327** loss of information and return the revised type of the argument.
328**
329** This is an EXPERIMENTAL api and is subject to change or removal.
330*/
331int sqlite3_value_numeric_type(sqlite3_value *pVal){
332 Mem *pMem = (Mem*)pVal;
drhb21c8cd2007-08-21 19:33:56 +0000333 applyNumericAffinity(pMem);
drh29d72102006-02-09 22:13:41 +0000334 storeTypeInfo(pMem, 0);
335 return pMem->type;
336}
337
338/*
danielk1977aee18ef2005-03-09 12:26:50 +0000339** Exported version of applyAffinity(). This one works on sqlite3_value*,
340** not the internal Mem* type.
341*/
danielk19771e536952007-08-16 10:09:01 +0000342void sqlite3ValueApplyAffinity(
danielk19771e536952007-08-16 10:09:01 +0000343 sqlite3_value *pVal,
344 u8 affinity,
345 u8 enc
346){
drhb21c8cd2007-08-21 19:33:56 +0000347 applyAffinity((Mem *)pVal, affinity, enc);
danielk1977aee18ef2005-03-09 12:26:50 +0000348}
349
danielk1977b5402fb2005-01-12 07:15:04 +0000350#ifdef SQLITE_DEBUG
drhb6f54522004-05-20 02:42:16 +0000351/*
danielk1977ca6b2912004-05-21 10:49:47 +0000352** Write a nice string representation of the contents of cell pMem
353** into buffer zBuf, length nBuf.
354*/
drh74161702006-02-24 02:53:49 +0000355void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
danielk1977ca6b2912004-05-21 10:49:47 +0000356 char *zCsr = zBuf;
357 int f = pMem->flags;
358
drh57196282004-10-06 15:41:16 +0000359 static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"};
danielk1977bfd6cce2004-06-18 04:24:54 +0000360
danielk1977ca6b2912004-05-21 10:49:47 +0000361 if( f&MEM_Blob ){
362 int i;
363 char c;
364 if( f & MEM_Dyn ){
365 c = 'z';
366 assert( (f & (MEM_Static|MEM_Ephem))==0 );
367 }else if( f & MEM_Static ){
368 c = 't';
369 assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
370 }else if( f & MEM_Ephem ){
371 c = 'e';
372 assert( (f & (MEM_Static|MEM_Dyn))==0 );
373 }else{
374 c = 's';
375 }
376
drh5bb3eb92007-05-04 13:15:55 +0000377 sqlite3_snprintf(100, zCsr, "%c", c);
378 zCsr += strlen(zCsr);
379 sqlite3_snprintf(100, zCsr, "%d[", pMem->n);
380 zCsr += strlen(zCsr);
danielk1977ca6b2912004-05-21 10:49:47 +0000381 for(i=0; i<16 && i<pMem->n; i++){
drh5bb3eb92007-05-04 13:15:55 +0000382 sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF));
383 zCsr += strlen(zCsr);
danielk1977ca6b2912004-05-21 10:49:47 +0000384 }
385 for(i=0; i<16 && i<pMem->n; i++){
386 char z = pMem->z[i];
387 if( z<32 || z>126 ) *zCsr++ = '.';
388 else *zCsr++ = z;
389 }
390
drhe718efe2007-05-10 21:14:03 +0000391 sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]);
drh5bb3eb92007-05-04 13:15:55 +0000392 zCsr += strlen(zCsr);
drhfdf972a2007-05-02 13:30:27 +0000393 if( f & MEM_Zero ){
drh5bb3eb92007-05-04 13:15:55 +0000394 sqlite3_snprintf(100, zCsr,"+%lldz",pMem->u.i);
395 zCsr += strlen(zCsr);
drhfdf972a2007-05-02 13:30:27 +0000396 }
danielk1977b1bc9532004-05-22 03:05:33 +0000397 *zCsr = '\0';
398 }else if( f & MEM_Str ){
399 int j, k;
400 zBuf[0] = ' ';
401 if( f & MEM_Dyn ){
402 zBuf[1] = 'z';
403 assert( (f & (MEM_Static|MEM_Ephem))==0 );
404 }else if( f & MEM_Static ){
405 zBuf[1] = 't';
406 assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
407 }else if( f & MEM_Ephem ){
408 zBuf[1] = 'e';
409 assert( (f & (MEM_Static|MEM_Dyn))==0 );
410 }else{
411 zBuf[1] = 's';
412 }
413 k = 2;
drh5bb3eb92007-05-04 13:15:55 +0000414 sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n);
415 k += strlen(&zBuf[k]);
danielk1977b1bc9532004-05-22 03:05:33 +0000416 zBuf[k++] = '[';
417 for(j=0; j<15 && j<pMem->n; j++){
418 u8 c = pMem->z[j];
danielk1977b1bc9532004-05-22 03:05:33 +0000419 if( c>=0x20 && c<0x7f ){
420 zBuf[k++] = c;
421 }else{
422 zBuf[k++] = '.';
423 }
424 }
425 zBuf[k++] = ']';
drh5bb3eb92007-05-04 13:15:55 +0000426 sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]);
427 k += strlen(&zBuf[k]);
danielk1977b1bc9532004-05-22 03:05:33 +0000428 zBuf[k++] = 0;
danielk1977ca6b2912004-05-21 10:49:47 +0000429 }
danielk1977ca6b2912004-05-21 10:49:47 +0000430}
431#endif
432
drh5b6afba2008-01-05 16:29:28 +0000433#ifdef SQLITE_DEBUG
434/*
435** Print the value of a register for tracing purposes:
436*/
437static void memTracePrint(FILE *out, Mem *p){
438 if( p->flags & MEM_Null ){
439 fprintf(out, " NULL");
440 }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
441 fprintf(out, " si:%lld", p->u.i);
442 }else if( p->flags & MEM_Int ){
443 fprintf(out, " i:%lld", p->u.i);
444 }else if( p->flags & MEM_Real ){
445 fprintf(out, " r:%g", p->r);
446 }else{
447 char zBuf[200];
448 sqlite3VdbeMemPrettyPrint(p, zBuf);
449 fprintf(out, " ");
450 fprintf(out, "%s", zBuf);
451 }
452}
453static void registerTrace(FILE *out, int iReg, Mem *p){
454 fprintf(out, "REG[%d] = ", iReg);
455 memTracePrint(out, p);
456 fprintf(out, "\n");
457}
458#endif
459
460#ifdef SQLITE_DEBUG
drhb21e7c72008-06-22 12:37:57 +0000461# define REGISTER_TRACE(R,M) if(p->trace)registerTrace(p->trace,R,M)
drh5b6afba2008-01-05 16:29:28 +0000462#else
463# define REGISTER_TRACE(R,M)
464#endif
465
danielk197784ac9d02004-05-18 09:58:06 +0000466
drh7b396862003-01-01 23:06:20 +0000467#ifdef VDBE_PROFILE
shane9bcbdad2008-05-29 20:22:37 +0000468
469/*
470** hwtime.h contains inline assembler code for implementing
471** high-performance timing routines.
drh7b396862003-01-01 23:06:20 +0000472*/
shane9bcbdad2008-05-29 20:22:37 +0000473#include "hwtime.h"
474
drh7b396862003-01-01 23:06:20 +0000475#endif
476
drh8c74a8c2002-08-25 19:20:40 +0000477/*
drhcaec2f12003-01-07 02:47:47 +0000478** The CHECK_FOR_INTERRUPT macro defined here looks to see if the
danielk19776f8a5032004-05-10 10:34:51 +0000479** sqlite3_interrupt() routine has been called. If it has been, then
drhcaec2f12003-01-07 02:47:47 +0000480** processing of the VDBE program is interrupted.
481**
482** This macro added to every instruction that does a jump in order to
483** implement a loop. This test used to be on every single instruction,
484** but that meant we more testing that we needed. By only testing the
485** flag on jump instructions, we get a (small) speed improvement.
486*/
487#define CHECK_FOR_INTERRUPT \
drh881feaa2006-07-26 01:39:30 +0000488 if( db->u1.isInterrupted ) goto abort_due_to_interrupt;
drhcaec2f12003-01-07 02:47:47 +0000489
danielk1977861f7452008-06-05 11:39:11 +0000490#ifdef SQLITE_DEBUG
491static int fileExists(sqlite3 *db, const char *zFile){
danielk1977ad0132d2008-06-07 08:58:22 +0000492 int res = 0;
493 int rc = SQLITE_OK;
494#ifdef SQLITE_TEST
495 /* If we are currently testing IO errors, then do not call OsAccess() to
496 ** test for the presence of zFile. This is because any IO error that
497 ** occurs here will not be reported, causing the test to fail.
498 */
499 extern int sqlite3_io_error_pending;
500 if( sqlite3_io_error_pending<=0 )
501#endif
502 rc = sqlite3OsAccess(db->pVfs, zFile, SQLITE_ACCESS_EXISTS, &res);
danielk1977861f7452008-06-05 11:39:11 +0000503 return (res && rc==SQLITE_OK);
504}
505#endif
drhcaec2f12003-01-07 02:47:47 +0000506
507/*
drhb86ccfb2003-01-28 23:13:10 +0000508** Execute as much of a VDBE program as we can then return.
509**
danielk19774adee202004-05-08 08:23:19 +0000510** sqlite3VdbeMakeReady() must be called before this routine in order to
drhb86ccfb2003-01-28 23:13:10 +0000511** close the program with a final OP_Halt and to set up the callbacks
512** and the error message pointer.
513**
514** Whenever a row or result data is available, this routine will either
515** invoke the result callback (if there is one) or return with
drh326dce72003-01-29 14:06:07 +0000516** SQLITE_ROW.
drhb86ccfb2003-01-28 23:13:10 +0000517**
518** If an attempt is made to open a locked database, then this routine
519** will either invoke the busy callback (if there is one) or it will
520** return SQLITE_BUSY.
521**
522** If an error occurs, an error message is written to memory obtained
drh17435752007-08-16 04:30:38 +0000523** from sqlite3_malloc() and p->zErrMsg is made to point to that memory.
drhb86ccfb2003-01-28 23:13:10 +0000524** The error code is stored in p->rc and this routine returns SQLITE_ERROR.
525**
526** If the callback ever returns non-zero, then the program exits
527** immediately. There will be no error message but the p->rc field is
528** set to SQLITE_ABORT and this routine will return SQLITE_ERROR.
529**
drh9468c7f2003-03-07 19:50:07 +0000530** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this
531** routine to return SQLITE_ERROR.
drhb86ccfb2003-01-28 23:13:10 +0000532**
533** Other fatal errors return SQLITE_ERROR.
534**
danielk19774adee202004-05-08 08:23:19 +0000535** After this routine has finished, sqlite3VdbeFinalize() should be
drhb86ccfb2003-01-28 23:13:10 +0000536** used to clean up the mess that was left behind.
537*/
danielk19774adee202004-05-08 08:23:19 +0000538int sqlite3VdbeExec(
drhb86ccfb2003-01-28 23:13:10 +0000539 Vdbe *p /* The VDBE */
540){
541 int pc; /* The program counter */
542 Op *pOp; /* Current operation */
543 int rc = SQLITE_OK; /* Value to return */
drh9bb575f2004-09-06 17:24:11 +0000544 sqlite3 *db = p->db; /* The database */
drh8079a0d2006-01-12 17:20:50 +0000545 u8 encoding = ENC(db); /* The database encoding */
drh5b6afba2008-01-05 16:29:28 +0000546 Mem *pIn1, *pIn2, *pIn3; /* Input operands */
drh4c583122008-01-04 22:01:03 +0000547 Mem *pOut; /* Output operand */
drhb1fdb2a2008-01-05 04:06:03 +0000548 u8 opProperty;
drh0acb7e42008-06-25 00:12:41 +0000549 int iCompare = 0; /* Result of last OP_Compare operation */
550 int *aPermute = 0; /* Permuation of columns for OP_Compare */
drhb86ccfb2003-01-28 23:13:10 +0000551#ifdef VDBE_PROFILE
shane9bcbdad2008-05-29 20:22:37 +0000552 u64 start; /* CPU clock count at start of opcode */
drhb86ccfb2003-01-28 23:13:10 +0000553 int origPc; /* Program counter at start of opcode */
554#endif
danielk1977348bb5d2003-10-18 09:37:26 +0000555#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
556 int nProgressOps = 0; /* Opcodes executed since progress callback. */
557#endif
drhb86ccfb2003-01-28 23:13:10 +0000558
drhca48c902008-01-18 14:08:24 +0000559 assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
drhb86ccfb2003-01-28 23:13:10 +0000560 assert( db->magic==SQLITE_MAGIC_BUSY );
drh4cf7c7f2007-08-28 23:28:07 +0000561 sqlite3BtreeMutexArrayEnter(&p->aMutex);
danielk19772e588c72005-12-09 14:25:08 +0000562 if( p->rc==SQLITE_NOMEM ){
563 /* This happens if a malloc() inside a call to sqlite3_column_text() or
564 ** sqlite3_column_text16() failed. */
565 goto no_mem;
566 }
drh3a840692003-01-29 22:58:26 +0000567 assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
568 p->rc = SQLITE_OK;
drhb86ccfb2003-01-28 23:13:10 +0000569 assert( p->explain==0 );
drhd4e70eb2008-01-02 00:34:36 +0000570 p->pResultSet = 0;
drha4afb652005-07-09 02:16:02 +0000571 db->busyHandler.nBusy = 0;
drh93581642004-02-12 13:02:55 +0000572 CHECK_FOR_INTERRUPT;
drh602c2372007-03-01 00:29:13 +0000573 sqlite3VdbeIOTraceSql(p);
drh3c23a882007-01-09 14:01:13 +0000574#ifdef SQLITE_DEBUG
danielk19772d1d86f2008-06-20 14:59:51 +0000575 sqlite3BeginBenignMalloc();
danielk1977861f7452008-06-05 11:39:11 +0000576 if( p->pc==0
577 && ((p->db->flags & SQLITE_VdbeListing) || fileExists(db, "vdbe_explain"))
drh3c23a882007-01-09 14:01:13 +0000578 ){
579 int i;
580 printf("VDBE Program Listing:\n");
581 sqlite3VdbePrintSql(p);
582 for(i=0; i<p->nOp; i++){
583 sqlite3VdbePrintOp(stdout, i, &p->aOp[i]);
584 }
585 }
danielk1977861f7452008-06-05 11:39:11 +0000586 if( fileExists(db, "vdbe_trace") ){
drh3c23a882007-01-09 14:01:13 +0000587 p->trace = stdout;
588 }
danielk19772d1d86f2008-06-20 14:59:51 +0000589 sqlite3EndBenignMalloc();
drh3c23a882007-01-09 14:01:13 +0000590#endif
drhb86ccfb2003-01-28 23:13:10 +0000591 for(pc=p->pc; rc==SQLITE_OK; pc++){
drhcaec2f12003-01-07 02:47:47 +0000592 assert( pc>=0 && pc<p->nOp );
drh17435752007-08-16 04:30:38 +0000593 if( db->mallocFailed ) goto no_mem;
drh7b396862003-01-01 23:06:20 +0000594#ifdef VDBE_PROFILE
drh8178a752003-01-05 21:41:40 +0000595 origPc = pc;
shane9bcbdad2008-05-29 20:22:37 +0000596 start = sqlite3Hwtime();
drh7b396862003-01-01 23:06:20 +0000597#endif
drh75897232000-05-29 14:26:00 +0000598 pOp = &p->aOp[pc];
drh6e142f52000-06-08 13:36:40 +0000599
danielk19778b60e0f2005-01-12 09:10:39 +0000600 /* Only allow tracing if SQLITE_DEBUG is defined.
drh6e142f52000-06-08 13:36:40 +0000601 */
danielk19778b60e0f2005-01-12 09:10:39 +0000602#ifdef SQLITE_DEBUG
drh75897232000-05-29 14:26:00 +0000603 if( p->trace ){
drh3f7d4e42004-07-24 14:35:58 +0000604 if( pc==0 ){
605 printf("VDBE Execution Trace:\n");
606 sqlite3VdbePrintSql(p);
607 }
danielk19774adee202004-05-08 08:23:19 +0000608 sqlite3VdbePrintOp(p->trace, pc, pOp);
drh75897232000-05-29 14:26:00 +0000609 }
drh19db9352008-03-27 22:42:51 +0000610 if( p->trace==0 && pc==0 ){
danielk19772d1d86f2008-06-20 14:59:51 +0000611 sqlite3BeginBenignMalloc();
danielk1977861f7452008-06-05 11:39:11 +0000612 if( fileExists(db, "vdbe_sqltrace") ){
drh19db9352008-03-27 22:42:51 +0000613 sqlite3VdbePrintSql(p);
614 }
danielk19772d1d86f2008-06-20 14:59:51 +0000615 sqlite3EndBenignMalloc();
drh3f7d4e42004-07-24 14:35:58 +0000616 }
617#endif
618
drh6e142f52000-06-08 13:36:40 +0000619
drhf6038712004-02-08 18:07:34 +0000620 /* Check to see if we need to simulate an interrupt. This only happens
621 ** if we have a special test build.
622 */
623#ifdef SQLITE_TEST
danielk19776f8a5032004-05-10 10:34:51 +0000624 if( sqlite3_interrupt_count>0 ){
625 sqlite3_interrupt_count--;
626 if( sqlite3_interrupt_count==0 ){
627 sqlite3_interrupt(db);
drhf6038712004-02-08 18:07:34 +0000628 }
629 }
630#endif
631
danielk1977348bb5d2003-10-18 09:37:26 +0000632#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
633 /* Call the progress callback if it is configured and the required number
634 ** of VDBE ops have been executed (either since this invocation of
danielk19774adee202004-05-08 08:23:19 +0000635 ** sqlite3VdbeExec() or since last time the progress callback was called).
danielk1977348bb5d2003-10-18 09:37:26 +0000636 ** If the progress callback returns non-zero, exit the virtual machine with
637 ** a return code SQLITE_ABORT.
638 */
drh3914aed2004-01-31 20:40:42 +0000639 if( db->xProgress ){
640 if( db->nProgressOps==nProgressOps ){
danielk1977de523ac2007-06-15 14:53:53 +0000641 int prc;
drhf8888bb2006-05-26 19:57:19 +0000642 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
danielk1977de523ac2007-06-15 14:53:53 +0000643 prc =db->xProgress(db->pProgressArg);
drhf8888bb2006-05-26 19:57:19 +0000644 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
danielk1977de523ac2007-06-15 14:53:53 +0000645 if( prc!=0 ){
646 rc = SQLITE_INTERRUPT;
drha05a7222008-01-19 03:35:58 +0000647 goto vdbe_error_halt;
danielk1977de523ac2007-06-15 14:53:53 +0000648 }
danielk19773fe11f32007-06-13 16:49:48 +0000649 nProgressOps = 0;
danielk1977348bb5d2003-10-18 09:37:26 +0000650 }
drh3914aed2004-01-31 20:40:42 +0000651 nProgressOps++;
danielk1977348bb5d2003-10-18 09:37:26 +0000652 }
danielk1977348bb5d2003-10-18 09:37:26 +0000653#endif
654
drh4c583122008-01-04 22:01:03 +0000655 /* Do common setup processing for any opcode that is marked
656 ** with the "out2-prerelease" tag. Such opcodes have a single
drh9cbf3422008-01-17 16:22:13 +0000657 ** output which is specified by the P2 parameter. The P2 register
drh4c583122008-01-04 22:01:03 +0000658 ** is initialized to a NULL.
659 */
drhb1fdb2a2008-01-05 04:06:03 +0000660 opProperty = opcodeProperty[pOp->opcode];
661 if( (opProperty & OPFLG_OUT2_PRERELEASE)!=0 ){
drh9cbf3422008-01-17 16:22:13 +0000662 assert( pOp->p2>0 );
663 assert( pOp->p2<=p->nMem );
664 pOut = &p->aMem[pOp->p2];
danielk19775f096132008-03-28 15:44:09 +0000665 sqlite3VdbeMemReleaseExternal(pOut);
drh4c583122008-01-04 22:01:03 +0000666 pOut->flags = MEM_Null;
drhb1fdb2a2008-01-05 04:06:03 +0000667 }else
668
669 /* Do common setup for opcodes marked with one of the following
670 ** combinations of properties.
671 **
672 ** in1
673 ** in1 in2
674 ** in1 in2 out3
675 ** in1 in3
drhb1fdb2a2008-01-05 04:06:03 +0000676 **
drh9cbf3422008-01-17 16:22:13 +0000677 ** Variables pIn1, pIn2, and pIn3 are made to point to appropriate
678 ** registers for inputs. Variable pOut points to the output register.
drhb1fdb2a2008-01-05 04:06:03 +0000679 */
680 if( (opProperty & OPFLG_IN1)!=0 ){
drh9cbf3422008-01-17 16:22:13 +0000681 assert( pOp->p1>0 );
682 assert( pOp->p1<=p->nMem );
683 pIn1 = &p->aMem[pOp->p1];
684 REGISTER_TRACE(pOp->p1, pIn1);
drhb1fdb2a2008-01-05 04:06:03 +0000685 if( (opProperty & OPFLG_IN2)!=0 ){
drh9cbf3422008-01-17 16:22:13 +0000686 assert( pOp->p2>0 );
drhaa9b8962008-01-08 02:57:55 +0000687 assert( pOp->p2<=p->nMem );
688 pIn2 = &p->aMem[pOp->p2];
689 REGISTER_TRACE(pOp->p2, pIn2);
drh9cbf3422008-01-17 16:22:13 +0000690 if( (opProperty & OPFLG_OUT3)!=0 ){
691 assert( pOp->p3>0 );
692 assert( pOp->p3<=p->nMem );
693 pOut = &p->aMem[pOp->p3];
694 }
695 }else if( (opProperty & OPFLG_IN3)!=0 ){
696 assert( pOp->p3>0 );
drhaa9b8962008-01-08 02:57:55 +0000697 assert( pOp->p3<=p->nMem );
698 pIn3 = &p->aMem[pOp->p3];
699 REGISTER_TRACE(pOp->p3, pIn3);
700 }
drh9cbf3422008-01-17 16:22:13 +0000701 }else if( (opProperty & OPFLG_IN2)!=0 ){
702 assert( pOp->p2>0 );
703 assert( pOp->p2<=p->nMem );
704 pIn2 = &p->aMem[pOp->p2];
705 REGISTER_TRACE(pOp->p2, pIn2);
706 }else if( (opProperty & OPFLG_IN3)!=0 ){
707 assert( pOp->p3>0 );
708 assert( pOp->p3<=p->nMem );
709 pIn3 = &p->aMem[pOp->p3];
710 REGISTER_TRACE(pOp->p3, pIn3);
drh4c583122008-01-04 22:01:03 +0000711 }
712
drh75897232000-05-29 14:26:00 +0000713 switch( pOp->opcode ){
drh75897232000-05-29 14:26:00 +0000714
drh5e00f6c2001-09-13 13:46:56 +0000715/*****************************************************************************
716** What follows is a massive switch statement where each case implements a
717** separate instruction in the virtual machine. If we follow the usual
718** indentation conventions, each case should be indented by 6 spaces. But
719** that is a lot of wasted space on the left margin. So the code within
720** the switch statement will break with convention and be flush-left. Another
721** big comment (similar to this one) will mark the point in the code where
722** we transition back to normal indentation.
drhac82fcf2002-09-08 17:23:41 +0000723**
724** The formatting of each case is important. The makefile for SQLite
725** generates two C files "opcodes.h" and "opcodes.c" by scanning this
726** file looking for lines that begin with "case OP_". The opcodes.h files
727** will be filled with #defines that give unique integer values to each
728** opcode and the opcodes.c file is filled with an array of strings where
drhf2bc0132004-10-04 13:19:23 +0000729** each string is the symbolic name for the corresponding opcode. If the
730** case statement is followed by a comment of the form "/# same as ... #/"
731** that comment is used to determine the particular value of the opcode.
drhac82fcf2002-09-08 17:23:41 +0000732**
drh9cbf3422008-01-17 16:22:13 +0000733** Other keywords in the comment that follows each case are used to
734** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[].
735** Keywords include: in1, in2, in3, out2_prerelease, out2, out3. See
736** the mkopcodeh.awk script for additional information.
danielk1977bc04f852005-03-29 08:26:13 +0000737**
drhac82fcf2002-09-08 17:23:41 +0000738** Documentation about VDBE opcodes is generated by scanning this file
739** for lines of that contain "Opcode:". That line and all subsequent
740** comment lines are used in the generation of the opcode.html documentation
741** file.
742**
743** SUMMARY:
744**
745** Formatting is important to scripts that scan this file.
746** Do not deviate from the formatting style currently in use.
747**
drh5e00f6c2001-09-13 13:46:56 +0000748*****************************************************************************/
drh75897232000-05-29 14:26:00 +0000749
drh9cbf3422008-01-17 16:22:13 +0000750/* Opcode: Goto * P2 * * *
drh5e00f6c2001-09-13 13:46:56 +0000751**
752** An unconditional jump to address P2.
753** The next instruction executed will be
754** the one at index P2 from the beginning of
755** the program.
756*/
drh9cbf3422008-01-17 16:22:13 +0000757case OP_Goto: { /* jump */
drhcaec2f12003-01-07 02:47:47 +0000758 CHECK_FOR_INTERRUPT;
drh5e00f6c2001-09-13 13:46:56 +0000759 pc = pOp->p2 - 1;
760 break;
761}
drh75897232000-05-29 14:26:00 +0000762
drh2eb95372008-06-06 15:04:36 +0000763/* Opcode: Gosub P1 P2 * * *
drh8c74a8c2002-08-25 19:20:40 +0000764**
drh2eb95372008-06-06 15:04:36 +0000765** Write the current address onto register P1
drh8c74a8c2002-08-25 19:20:40 +0000766** and then jump to address P2.
drh8c74a8c2002-08-25 19:20:40 +0000767*/
drh9cbf3422008-01-17 16:22:13 +0000768case OP_Gosub: { /* jump */
drh2eb95372008-06-06 15:04:36 +0000769 assert( pOp->p1>0 );
770 assert( pOp->p1<=p->nMem );
771 pIn1 = &p->aMem[pOp->p1];
772 assert( (pIn1->flags & MEM_Dyn)==0 );
773 pIn1->flags = MEM_Int;
774 pIn1->u.i = pc;
775 REGISTER_TRACE(pOp->p1, pIn1);
drh8c74a8c2002-08-25 19:20:40 +0000776 pc = pOp->p2 - 1;
777 break;
778}
779
drh2eb95372008-06-06 15:04:36 +0000780/* Opcode: Return P1 * * * *
drh8c74a8c2002-08-25 19:20:40 +0000781**
drh2eb95372008-06-06 15:04:36 +0000782** Jump to the next instruction after the address in register P1.
drh8c74a8c2002-08-25 19:20:40 +0000783*/
drh2eb95372008-06-06 15:04:36 +0000784case OP_Return: { /* in1 */
785 assert( pIn1->flags & MEM_Int );
786 pc = pIn1->u.i;
drh8c74a8c2002-08-25 19:20:40 +0000787 break;
788}
789
drhe00ee6e2008-06-20 15:24:01 +0000790/* Opcode: Yield P1 * * * *
791**
792** Swap the program counter with the value in register P1.
793*/
794case OP_Yield: {
795 int pcDest;
796 assert( pOp->p1>0 );
797 assert( pOp->p1<=p->nMem );
798 pIn1 = &p->aMem[pOp->p1];
799 assert( (pIn1->flags & MEM_Dyn)==0 );
800 pIn1->flags = MEM_Int;
801 pcDest = pIn1->u.i;
802 pIn1->u.i = pc;
803 REGISTER_TRACE(pOp->p1, pIn1);
804 pc = pcDest;
805 break;
806}
807
808
drh9cbf3422008-01-17 16:22:13 +0000809/* Opcode: Halt P1 P2 * P4 *
drh5e00f6c2001-09-13 13:46:56 +0000810**
drh0342b1f2005-09-01 03:07:44 +0000811** Exit immediately. All open cursors, Fifos, etc are closed
drh5e00f6c2001-09-13 13:46:56 +0000812** automatically.
drhb19a2bc2001-09-16 00:13:26 +0000813**
drh92f02c32004-09-02 14:57:08 +0000814** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(),
815** or sqlite3_finalize(). For a normal halt, this should be SQLITE_OK (0).
816** For errors, it can be some other value. If P1!=0 then P2 will determine
817** whether or not to rollback the current transaction. Do not rollback
818** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort,
819** then back out all changes that have occurred during this execution of the
drhb798fa62002-09-03 19:43:23 +0000820** VDBE, but do not rollback the transaction.
drh9cfcf5d2002-01-29 18:41:24 +0000821**
drh66a51672008-01-03 00:01:23 +0000822** If P4 is not null then it is an error message string.
drh7f057c92005-06-24 03:53:06 +0000823**
drh9cfcf5d2002-01-29 18:41:24 +0000824** There is an implied "Halt 0 0 0" instruction inserted at the very end of
drhb19a2bc2001-09-16 00:13:26 +0000825** every program. So a jump past the last instruction of the program
826** is the same as executing Halt.
drh5e00f6c2001-09-13 13:46:56 +0000827*/
drh9cbf3422008-01-17 16:22:13 +0000828case OP_Halt: {
drh92f02c32004-09-02 14:57:08 +0000829 p->rc = pOp->p1;
830 p->pc = pc;
831 p->errorAction = pOp->p2;
danielk19772dca4ac2008-01-03 11:50:29 +0000832 if( pOp->p4.z ){
drhf089aa42008-07-08 19:34:06 +0000833 sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z);
drh9cfcf5d2002-01-29 18:41:24 +0000834 }
drh92f02c32004-09-02 14:57:08 +0000835 rc = sqlite3VdbeHalt(p);
danielk197701427a62005-01-11 13:02:33 +0000836 assert( rc==SQLITE_BUSY || rc==SQLITE_OK );
drh92f02c32004-09-02 14:57:08 +0000837 if( rc==SQLITE_BUSY ){
drh900b31e2007-08-28 02:27:51 +0000838 p->rc = rc = SQLITE_BUSY;
839 }else{
840 rc = p->rc ? SQLITE_ERROR : SQLITE_DONE;
drh92f02c32004-09-02 14:57:08 +0000841 }
drh900b31e2007-08-28 02:27:51 +0000842 goto vdbe_return;
drh5e00f6c2001-09-13 13:46:56 +0000843}
drhc61053b2000-06-04 12:58:36 +0000844
drh4c583122008-01-04 22:01:03 +0000845/* Opcode: Integer P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +0000846**
drh9cbf3422008-01-17 16:22:13 +0000847** The 32-bit integer value P1 is written into register P2.
drh5e00f6c2001-09-13 13:46:56 +0000848*/
drh4c583122008-01-04 22:01:03 +0000849case OP_Integer: { /* out2-prerelease */
850 pOut->flags = MEM_Int;
851 pOut->u.i = pOp->p1;
drh29dda4a2005-07-21 18:23:20 +0000852 break;
853}
854
drh4c583122008-01-04 22:01:03 +0000855/* Opcode: Int64 * P2 * P4 *
drh29dda4a2005-07-21 18:23:20 +0000856**
drh66a51672008-01-03 00:01:23 +0000857** P4 is a pointer to a 64-bit integer value.
drh9cbf3422008-01-17 16:22:13 +0000858** Write that value into register P2.
drh29dda4a2005-07-21 18:23:20 +0000859*/
drh4c583122008-01-04 22:01:03 +0000860case OP_Int64: { /* out2-prerelease */
danielk19772dca4ac2008-01-03 11:50:29 +0000861 assert( pOp->p4.pI64!=0 );
drh4c583122008-01-04 22:01:03 +0000862 pOut->flags = MEM_Int;
863 pOut->u.i = *pOp->p4.pI64;
drhf4479502004-05-27 03:12:53 +0000864 break;
865}
drh4f26d6c2004-05-26 23:25:30 +0000866
drh4c583122008-01-04 22:01:03 +0000867/* Opcode: Real * P2 * P4 *
drhf4479502004-05-27 03:12:53 +0000868**
drh4c583122008-01-04 22:01:03 +0000869** P4 is a pointer to a 64-bit floating point value.
drh9cbf3422008-01-17 16:22:13 +0000870** Write that value into register P2.
drhf4479502004-05-27 03:12:53 +0000871*/
drh4c583122008-01-04 22:01:03 +0000872case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
873 pOut->flags = MEM_Real;
drh2eaf93d2008-04-29 00:15:20 +0000874 assert( !sqlite3IsNaN(*pOp->p4.pReal) );
drh4c583122008-01-04 22:01:03 +0000875 pOut->r = *pOp->p4.pReal;
drhf4479502004-05-27 03:12:53 +0000876 break;
877}
danielk1977cbb18d22004-05-28 11:37:27 +0000878
drh3c84ddf2008-01-09 02:15:38 +0000879/* Opcode: String8 * P2 * P4 *
danielk1977cbb18d22004-05-28 11:37:27 +0000880**
drh66a51672008-01-03 00:01:23 +0000881** P4 points to a nul terminated UTF-8 string. This opcode is transformed
danielk19770f69c1e2004-05-29 11:24:50 +0000882** into an OP_String before it is executed for the first time.
danielk1977cbb18d22004-05-28 11:37:27 +0000883*/
drh4c583122008-01-04 22:01:03 +0000884case OP_String8: { /* same as TK_STRING, out2-prerelease */
danielk19772dca4ac2008-01-03 11:50:29 +0000885 assert( pOp->p4.z!=0 );
drhed2df7f2005-11-16 04:34:32 +0000886 pOp->opcode = OP_String;
danielk19772dca4ac2008-01-03 11:50:29 +0000887 pOp->p1 = strlen(pOp->p4.z);
drhed2df7f2005-11-16 04:34:32 +0000888
889#ifndef SQLITE_OMIT_UTF16
drh8079a0d2006-01-12 17:20:50 +0000890 if( encoding!=SQLITE_UTF8 ){
drh4c583122008-01-04 22:01:03 +0000891 sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC);
892 if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem;
893 if( SQLITE_OK!=sqlite3VdbeMemDynamicify(pOut) ) goto no_mem;
danielk19775f096132008-03-28 15:44:09 +0000894 pOut->zMalloc = 0;
drh4c583122008-01-04 22:01:03 +0000895 pOut->flags |= MEM_Static;
drh191b54c2008-04-15 12:14:21 +0000896 pOut->flags &= ~MEM_Dyn;
drh66a51672008-01-03 00:01:23 +0000897 if( pOp->p4type==P4_DYNAMIC ){
danielk19772dca4ac2008-01-03 11:50:29 +0000898 sqlite3_free(pOp->p4.z);
danielk1977e0048402004-06-15 16:51:01 +0000899 }
drh66a51672008-01-03 00:01:23 +0000900 pOp->p4type = P4_DYNAMIC;
drh4c583122008-01-04 22:01:03 +0000901 pOp->p4.z = pOut->z;
902 pOp->p1 = pOut->n;
drhbb4957f2008-03-20 14:03:29 +0000903 if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhcbd2da92007-12-17 16:20:06 +0000904 goto too_big;
905 }
drhb7654112008-01-12 12:48:07 +0000906 UPDATE_MAX_BLOBSIZE(pOut);
danielk1977bfd6cce2004-06-18 04:24:54 +0000907 break;
danielk19770f69c1e2004-05-29 11:24:50 +0000908 }
danielk197793758c82005-01-21 08:13:14 +0000909#endif
drhbb4957f2008-03-20 14:03:29 +0000910 if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhcbd2da92007-12-17 16:20:06 +0000911 goto too_big;
912 }
913 /* Fall through to the next case, OP_String */
danielk1977cbb18d22004-05-28 11:37:27 +0000914}
drhf4479502004-05-27 03:12:53 +0000915
drh4c583122008-01-04 22:01:03 +0000916/* Opcode: String P1 P2 * P4 *
drhf4479502004-05-27 03:12:53 +0000917**
drh9cbf3422008-01-17 16:22:13 +0000918** The string value P4 of length P1 (bytes) is stored in register P2.
drhf4479502004-05-27 03:12:53 +0000919*/
drh4c583122008-01-04 22:01:03 +0000920case OP_String: { /* out2-prerelease */
danielk19772dca4ac2008-01-03 11:50:29 +0000921 assert( pOp->p4.z!=0 );
drh4c583122008-01-04 22:01:03 +0000922 pOut->flags = MEM_Str|MEM_Static|MEM_Term;
923 pOut->z = pOp->p4.z;
924 pOut->n = pOp->p1;
925 pOut->enc = encoding;
drhb7654112008-01-12 12:48:07 +0000926 UPDATE_MAX_BLOBSIZE(pOut);
danielk1977c572ef72004-05-27 09:28:41 +0000927 break;
928}
929
drh4c583122008-01-04 22:01:03 +0000930/* Opcode: Null * P2 * * *
drhf0863fe2005-06-12 21:35:51 +0000931**
drh9cbf3422008-01-17 16:22:13 +0000932** Write a NULL into register P2.
drhf0863fe2005-06-12 21:35:51 +0000933*/
drh4c583122008-01-04 22:01:03 +0000934case OP_Null: { /* out2-prerelease */
drhf0863fe2005-06-12 21:35:51 +0000935 break;
936}
937
938
drha71aa002004-11-03 13:59:04 +0000939#ifndef SQLITE_OMIT_BLOB_LITERAL
drh9de221d2008-01-05 06:51:30 +0000940/* Opcode: Blob P1 P2 * P4
danielk1977c572ef72004-05-27 09:28:41 +0000941**
drh9de221d2008-01-05 06:51:30 +0000942** P4 points to a blob of data P1 bytes long. Store this
943** blob in register P2. This instruction is not coded directly
danielk1977cbb18d22004-05-28 11:37:27 +0000944** by the compiler. Instead, the compiler layer specifies
945** an OP_HexBlob opcode, with the hex string representation of
drh66a51672008-01-03 00:01:23 +0000946** the blob as P4. This opcode is transformed to an OP_Blob
danielk197793758c82005-01-21 08:13:14 +0000947** the first time it is executed.
danielk1977c572ef72004-05-27 09:28:41 +0000948*/
drh4c583122008-01-04 22:01:03 +0000949case OP_Blob: { /* out2-prerelease */
drhcbd2da92007-12-17 16:20:06 +0000950 assert( pOp->p1 <= SQLITE_MAX_LENGTH );
drh4c583122008-01-04 22:01:03 +0000951 sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
drh9de221d2008-01-05 06:51:30 +0000952 pOut->enc = encoding;
drhb7654112008-01-12 12:48:07 +0000953 UPDATE_MAX_BLOBSIZE(pOut);
danielk1977a37cdde2004-05-16 11:15:36 +0000954 break;
955}
danielk197793758c82005-01-21 08:13:14 +0000956#endif /* SQLITE_OMIT_BLOB_LITERAL */
danielk1977a37cdde2004-05-16 11:15:36 +0000957
drh3c84ddf2008-01-09 02:15:38 +0000958/* Opcode: Variable P1 P2 * * *
drh50457892003-09-06 01:10:47 +0000959**
drh9cbf3422008-01-17 16:22:13 +0000960** The value of variable P1 is written into register P2. A variable is
danielk19776f8a5032004-05-10 10:34:51 +0000961** an unknown in the original SQL string as handed to sqlite3_compile().
shane21e7feb2008-05-30 15:59:49 +0000962** Any occurrence of the '?' character in the original SQL is considered
drh7c972de2003-09-06 22:18:07 +0000963** a variable. Variables in the SQL string are number from left to
964** right beginning with 1. The values of variables are set using the
danielk19776f8a5032004-05-10 10:34:51 +0000965** sqlite3_bind() API.
drh50457892003-09-06 01:10:47 +0000966*/
drh4c583122008-01-04 22:01:03 +0000967case OP_Variable: { /* out2-prerelease */
drh7c972de2003-09-06 22:18:07 +0000968 int j = pOp->p1 - 1;
drh023ae032007-05-08 12:12:16 +0000969 Mem *pVar;
danielk1977295ba552004-05-19 10:34:51 +0000970 assert( j>=0 && j<p->nVar );
971
drh023ae032007-05-08 12:12:16 +0000972 pVar = &p->aVar[j];
973 if( sqlite3VdbeMemTooBig(pVar) ){
974 goto too_big;
975 }
drh4c583122008-01-04 22:01:03 +0000976 sqlite3VdbeMemShallowCopy(pOut, &p->aVar[j], MEM_Static);
drhb7654112008-01-12 12:48:07 +0000977 UPDATE_MAX_BLOBSIZE(pOut);
danielk197793d46752004-05-23 13:30:58 +0000978 break;
979}
danielk1977295ba552004-05-19 10:34:51 +0000980
drhb21e7c72008-06-22 12:37:57 +0000981/* Opcode: Move P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +0000982**
drhb21e7c72008-06-22 12:37:57 +0000983** Move the values in register P1..P1+P3-1 over into
984** registers P2..P2+P3-1. Registers P1..P1+P1-1 are
985** left holding a NULL. It is an error for register ranges
986** P1..P1+P3-1 and P2..P2+P3-1 to overlap.
drh5e00f6c2001-09-13 13:46:56 +0000987*/
drhe1349cb2008-04-01 00:36:10 +0000988case OP_Move: {
989 char *zMalloc;
drhb21e7c72008-06-22 12:37:57 +0000990 int n = pOp->p3;
991 int p1 = pOp->p1;
992 int p2 = pOp->p2;
993 assert( n>0 );
994 assert( p1>0 );
995 assert( p1+n<p->nMem );
996 pIn1 = &p->aMem[p1];
997 assert( p2>0 );
998 assert( p2+n<p->nMem );
999 pOut = &p->aMem[p2];
1000 assert( p1+n<=p2 || p2+n<=p1 );
1001 while( n-- ){
drhb21e7c72008-06-22 12:37:57 +00001002 zMalloc = pOut->zMalloc;
1003 pOut->zMalloc = 0;
1004 sqlite3VdbeMemMove(pOut, pIn1);
1005 pIn1->zMalloc = zMalloc;
1006 REGISTER_TRACE(p2++, pOut);
1007 pIn1++;
1008 pOut++;
1009 }
drhe1349cb2008-04-01 00:36:10 +00001010 break;
1011}
1012
drhb1fdb2a2008-01-05 04:06:03 +00001013/* Opcode: Copy P1 P2 * * *
1014**
drh9cbf3422008-01-17 16:22:13 +00001015** Make a copy of register P1 into register P2.
drhb1fdb2a2008-01-05 04:06:03 +00001016**
1017** This instruction makes a deep copy of the value. A duplicate
1018** is made of any string or blob constant. See also OP_SCopy.
1019*/
drhe1349cb2008-04-01 00:36:10 +00001020case OP_Copy: {
1021 assert( pOp->p1>0 );
1022 assert( pOp->p1<=p->nMem );
1023 pIn1 = &p->aMem[pOp->p1];
drhe1349cb2008-04-01 00:36:10 +00001024 assert( pOp->p2>0 );
1025 assert( pOp->p2<=p->nMem );
1026 pOut = &p->aMem[pOp->p2];
1027 assert( pOut!=pIn1 );
1028 sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
1029 Deephemeralize(pOut);
1030 REGISTER_TRACE(pOp->p2, pOut);
1031 break;
1032}
1033
drhb1fdb2a2008-01-05 04:06:03 +00001034/* Opcode: SCopy P1 P2 * * *
1035**
drh9cbf3422008-01-17 16:22:13 +00001036** Make a shallow copy of register P1 into register P2.
drhb1fdb2a2008-01-05 04:06:03 +00001037**
1038** This instruction makes a shallow copy of the value. If the value
1039** is a string or blob, then the copy is only a pointer to the
1040** original and hence if the original changes so will the copy.
1041** Worse, if the original is deallocated, the copy becomes invalid.
1042** Thus the program must guarantee that the original will not change
1043** during the lifetime of the copy. Use OP_Copy to make a complete
1044** copy.
1045*/
drhb1fdb2a2008-01-05 04:06:03 +00001046case OP_SCopy: {
drh9cbf3422008-01-17 16:22:13 +00001047 assert( pOp->p1>0 );
1048 assert( pOp->p1<=p->nMem );
1049 pIn1 = &p->aMem[pOp->p1];
1050 REGISTER_TRACE(pOp->p1, pIn1);
1051 assert( pOp->p2>0 );
1052 assert( pOp->p2<=p->nMem );
1053 pOut = &p->aMem[pOp->p2];
drh2d401ab2008-01-10 23:50:11 +00001054 assert( pOut!=pIn1 );
drhe1349cb2008-04-01 00:36:10 +00001055 sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
drh5b6afba2008-01-05 16:29:28 +00001056 REGISTER_TRACE(pOp->p2, pOut);
drh5e00f6c2001-09-13 13:46:56 +00001057 break;
1058}
drh75897232000-05-29 14:26:00 +00001059
drh9cbf3422008-01-17 16:22:13 +00001060/* Opcode: ResultRow P1 P2 * * *
drhd4e70eb2008-01-02 00:34:36 +00001061**
shane21e7feb2008-05-30 15:59:49 +00001062** The registers P1 through P1+P2-1 contain a single row of
drhd4e70eb2008-01-02 00:34:36 +00001063** results. This opcode causes the sqlite3_step() call to terminate
1064** with an SQLITE_ROW return code and it sets up the sqlite3_stmt
1065** structure to provide access to the top P1 values as the result
drh9cbf3422008-01-17 16:22:13 +00001066** row.
drhd4e70eb2008-01-02 00:34:36 +00001067*/
drh9cbf3422008-01-17 16:22:13 +00001068case OP_ResultRow: {
drhd4e70eb2008-01-02 00:34:36 +00001069 Mem *pMem;
1070 int i;
1071 assert( p->nResColumn==pOp->p2 );
drh0a07c102008-01-03 18:03:08 +00001072 assert( pOp->p1>0 );
1073 assert( pOp->p1+pOp->p2<=p->nMem );
drhd4e70eb2008-01-02 00:34:36 +00001074
drhd4e70eb2008-01-02 00:34:36 +00001075 /* Invalidate all ephemeral cursor row caches */
1076 p->cacheCtr = (p->cacheCtr + 2)|1;
1077
1078 /* Make sure the results of the current row are \000 terminated
shane21e7feb2008-05-30 15:59:49 +00001079 ** and have an assigned type. The results are de-ephemeralized as
drhd4e70eb2008-01-02 00:34:36 +00001080 ** as side effect.
1081 */
1082 pMem = p->pResultSet = &p->aMem[pOp->p1];
1083 for(i=0; i<pOp->p2; i++){
1084 sqlite3VdbeMemNulTerminate(&pMem[i]);
1085 storeTypeInfo(&pMem[i], encoding);
drh0acb7e42008-06-25 00:12:41 +00001086 REGISTER_TRACE(pOp->p1+i, &pMem[i]);
drhd4e70eb2008-01-02 00:34:36 +00001087 }
drh28039692008-03-17 16:54:01 +00001088 if( db->mallocFailed ) goto no_mem;
drhd4e70eb2008-01-02 00:34:36 +00001089
1090 /* Return SQLITE_ROW
1091 */
1092 p->nCallback++;
drhd4e70eb2008-01-02 00:34:36 +00001093 p->pc = pc + 1;
drhd4e70eb2008-01-02 00:34:36 +00001094 rc = SQLITE_ROW;
1095 goto vdbe_return;
1096}
1097
drh5b6afba2008-01-05 16:29:28 +00001098/* Opcode: Concat P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001099**
drh5b6afba2008-01-05 16:29:28 +00001100** Add the text in register P1 onto the end of the text in
1101** register P2 and store the result in register P3.
1102** If either the P1 or P2 text are NULL then store NULL in P3.
danielk1977a7a8e142008-02-13 18:25:27 +00001103**
1104** P3 = P2 || P1
1105**
1106** It is illegal for P1 and P3 to be the same register. Sometimes,
1107** if P3 is the same register as P2, the implementation is able
1108** to avoid a memcpy().
drh5e00f6c2001-09-13 13:46:56 +00001109*/
drh5b6afba2008-01-05 16:29:28 +00001110case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
drh023ae032007-05-08 12:12:16 +00001111 i64 nByte;
danielk19778a6b5412004-05-24 07:04:25 +00001112
danielk1977a7a8e142008-02-13 18:25:27 +00001113 assert( pIn1!=pOut );
drh5b6afba2008-01-05 16:29:28 +00001114 if( (pIn1->flags | pIn2->flags) & MEM_Null ){
danielk1977a7a8e142008-02-13 18:25:27 +00001115 sqlite3VdbeMemSetNull(pOut);
drh5b6afba2008-01-05 16:29:28 +00001116 break;
drh5e00f6c2001-09-13 13:46:56 +00001117 }
drh5b6afba2008-01-05 16:29:28 +00001118 ExpandBlob(pIn1);
1119 Stringify(pIn1, encoding);
1120 ExpandBlob(pIn2);
1121 Stringify(pIn2, encoding);
1122 nByte = pIn1->n + pIn2->n;
drhbb4957f2008-03-20 14:03:29 +00001123 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh5b6afba2008-01-05 16:29:28 +00001124 goto too_big;
drh5e00f6c2001-09-13 13:46:56 +00001125 }
danielk1977a7a8e142008-02-13 18:25:27 +00001126 MemSetTypeFlag(pOut, MEM_Str);
1127 if( sqlite3VdbeMemGrow(pOut, nByte+2, pOut==pIn2) ){
drh5b6afba2008-01-05 16:29:28 +00001128 goto no_mem;
1129 }
danielk1977a7a8e142008-02-13 18:25:27 +00001130 if( pOut!=pIn2 ){
1131 memcpy(pOut->z, pIn2->z, pIn2->n);
1132 }
1133 memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n);
1134 pOut->z[nByte] = 0;
1135 pOut->z[nByte+1] = 0;
1136 pOut->flags |= MEM_Term;
drh5b6afba2008-01-05 16:29:28 +00001137 pOut->n = nByte;
drh5b6afba2008-01-05 16:29:28 +00001138 pOut->enc = encoding;
drhb7654112008-01-12 12:48:07 +00001139 UPDATE_MAX_BLOBSIZE(pOut);
drh5e00f6c2001-09-13 13:46:56 +00001140 break;
1141}
drh75897232000-05-29 14:26:00 +00001142
drh3c84ddf2008-01-09 02:15:38 +00001143/* Opcode: Add P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001144**
drh60a713c2008-01-21 16:22:45 +00001145** Add the value in register P1 to the value in register P2
shane21e7feb2008-05-30 15:59:49 +00001146** and store the result in register P3.
drh60a713c2008-01-21 16:22:45 +00001147** If either input is NULL, the result is NULL.
drh5e00f6c2001-09-13 13:46:56 +00001148*/
drh3c84ddf2008-01-09 02:15:38 +00001149/* Opcode: Multiply P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001150**
drh3c84ddf2008-01-09 02:15:38 +00001151**
shane21e7feb2008-05-30 15:59:49 +00001152** Multiply the value in register P1 by the value in register P2
drh60a713c2008-01-21 16:22:45 +00001153** and store the result in register P3.
1154** If either input is NULL, the result is NULL.
drh5e00f6c2001-09-13 13:46:56 +00001155*/
drh3c84ddf2008-01-09 02:15:38 +00001156/* Opcode: Subtract P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001157**
drh60a713c2008-01-21 16:22:45 +00001158** Subtract the value in register P1 from the value in register P2
1159** and store the result in register P3.
1160** If either input is NULL, the result is NULL.
drh5e00f6c2001-09-13 13:46:56 +00001161*/
drh9cbf3422008-01-17 16:22:13 +00001162/* Opcode: Divide P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001163**
drh60a713c2008-01-21 16:22:45 +00001164** Divide the value in register P1 by the value in register P2
1165** and store the result in register P3. If the value in register P2
1166** is zero, then the result is NULL.
1167** If either input is NULL, the result is NULL.
drh5e00f6c2001-09-13 13:46:56 +00001168*/
drh9cbf3422008-01-17 16:22:13 +00001169/* Opcode: Remainder P1 P2 P3 * *
drhbf4133c2001-10-13 02:59:08 +00001170**
drh3c84ddf2008-01-09 02:15:38 +00001171** Compute the remainder after integer division of the value in
1172** register P1 by the value in register P2 and store the result in P3.
1173** If the value in register P2 is zero the result is NULL.
drhf5905aa2002-05-26 20:54:33 +00001174** If either operand is NULL, the result is NULL.
drhbf4133c2001-10-13 02:59:08 +00001175*/
drh5b6afba2008-01-05 16:29:28 +00001176case OP_Add: /* same as TK_PLUS, in1, in2, out3 */
1177case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */
1178case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */
1179case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */
1180case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
drh8a512562005-11-14 22:29:05 +00001181 int flags;
drh5b6afba2008-01-05 16:29:28 +00001182 flags = pIn1->flags | pIn2->flags;
drha05a7222008-01-19 03:35:58 +00001183 if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null;
1184 if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){
danielk1977cfcdaef2004-05-12 07:33:33 +00001185 i64 a, b;
drh5b6afba2008-01-05 16:29:28 +00001186 a = pIn1->u.i;
1187 b = pIn2->u.i;
drh5e00f6c2001-09-13 13:46:56 +00001188 switch( pOp->opcode ){
1189 case OP_Add: b += a; break;
1190 case OP_Subtract: b -= a; break;
1191 case OP_Multiply: b *= a; break;
drhbf4133c2001-10-13 02:59:08 +00001192 case OP_Divide: {
drha05a7222008-01-19 03:35:58 +00001193 if( a==0 ) goto arithmetic_result_is_null;
danielk197742d4ef22007-06-26 11:13:25 +00001194 /* Dividing the largest possible negative 64-bit integer (1<<63) by
drh0f050352008-05-09 18:03:13 +00001195 ** -1 returns an integer too large to store in a 64-bit data-type. On
danielk197742d4ef22007-06-26 11:13:25 +00001196 ** some architectures, the value overflows to (1<<63). On others,
1197 ** a SIGFPE is issued. The following statement normalizes this
shane21e7feb2008-05-30 15:59:49 +00001198 ** behavior so that all architectures behave as if integer
1199 ** overflow occurred.
danielk197742d4ef22007-06-26 11:13:25 +00001200 */
drh0f050352008-05-09 18:03:13 +00001201 if( a==-1 && b==SMALLEST_INT64 ) a = 1;
drh5e00f6c2001-09-13 13:46:56 +00001202 b /= a;
drh75897232000-05-29 14:26:00 +00001203 break;
1204 }
drhbf4133c2001-10-13 02:59:08 +00001205 default: {
drha05a7222008-01-19 03:35:58 +00001206 if( a==0 ) goto arithmetic_result_is_null;
danielk197742d4ef22007-06-26 11:13:25 +00001207 if( a==-1 ) a = 1;
drhbf4133c2001-10-13 02:59:08 +00001208 b %= a;
1209 break;
1210 }
drh75897232000-05-29 14:26:00 +00001211 }
drh5b6afba2008-01-05 16:29:28 +00001212 pOut->u.i = b;
danielk1977a7a8e142008-02-13 18:25:27 +00001213 MemSetTypeFlag(pOut, MEM_Int);
drh5e00f6c2001-09-13 13:46:56 +00001214 }else{
1215 double a, b;
drh5b6afba2008-01-05 16:29:28 +00001216 a = sqlite3VdbeRealValue(pIn1);
1217 b = sqlite3VdbeRealValue(pIn2);
drh5e00f6c2001-09-13 13:46:56 +00001218 switch( pOp->opcode ){
1219 case OP_Add: b += a; break;
1220 case OP_Subtract: b -= a; break;
1221 case OP_Multiply: b *= a; break;
drhbf4133c2001-10-13 02:59:08 +00001222 case OP_Divide: {
drha05a7222008-01-19 03:35:58 +00001223 if( a==0.0 ) goto arithmetic_result_is_null;
drh5e00f6c2001-09-13 13:46:56 +00001224 b /= a;
1225 break;
1226 }
drhbf4133c2001-10-13 02:59:08 +00001227 default: {
danielk19774b5710e2007-05-08 13:57:34 +00001228 i64 ia = (i64)a;
1229 i64 ib = (i64)b;
drha05a7222008-01-19 03:35:58 +00001230 if( ia==0 ) goto arithmetic_result_is_null;
danielk197742d4ef22007-06-26 11:13:25 +00001231 if( ia==-1 ) ia = 1;
drhbf4133c2001-10-13 02:59:08 +00001232 b = ib % ia;
1233 break;
1234 }
drh5e00f6c2001-09-13 13:46:56 +00001235 }
drh0de3ae92008-04-28 16:55:26 +00001236 if( sqlite3IsNaN(b) ){
drha05a7222008-01-19 03:35:58 +00001237 goto arithmetic_result_is_null;
drh53c14022007-05-10 17:23:11 +00001238 }
drh5b6afba2008-01-05 16:29:28 +00001239 pOut->r = b;
danielk1977a7a8e142008-02-13 18:25:27 +00001240 MemSetTypeFlag(pOut, MEM_Real);
drh8a512562005-11-14 22:29:05 +00001241 if( (flags & MEM_Real)==0 ){
drh5b6afba2008-01-05 16:29:28 +00001242 sqlite3VdbeIntegerAffinity(pOut);
drh8a512562005-11-14 22:29:05 +00001243 }
drh5e00f6c2001-09-13 13:46:56 +00001244 }
1245 break;
1246
drha05a7222008-01-19 03:35:58 +00001247arithmetic_result_is_null:
1248 sqlite3VdbeMemSetNull(pOut);
drh5e00f6c2001-09-13 13:46:56 +00001249 break;
1250}
1251
drh66a51672008-01-03 00:01:23 +00001252/* Opcode: CollSeq * * P4
danielk1977dc1bdc42004-06-11 10:51:27 +00001253**
drh66a51672008-01-03 00:01:23 +00001254** P4 is a pointer to a CollSeq struct. If the next call to a user function
danielk1977dc1bdc42004-06-11 10:51:27 +00001255** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will
1256** be returned. This is used by the built-in min(), max() and nullif()
drhe6f85e72004-12-25 01:03:13 +00001257** functions.
danielk1977dc1bdc42004-06-11 10:51:27 +00001258**
1259** The interface used by the implementation of the aforementioned functions
1260** to retrieve the collation sequence set by this opcode is not available
1261** publicly, only to user functions defined in func.c.
1262*/
drh9cbf3422008-01-17 16:22:13 +00001263case OP_CollSeq: {
drh66a51672008-01-03 00:01:23 +00001264 assert( pOp->p4type==P4_COLLSEQ );
danielk1977dc1bdc42004-06-11 10:51:27 +00001265 break;
1266}
1267
drh98757152008-01-09 23:04:12 +00001268/* Opcode: Function P1 P2 P3 P4 P5
drh8e0a2f92002-02-23 23:45:45 +00001269**
drh66a51672008-01-03 00:01:23 +00001270** Invoke a user function (P4 is a pointer to a Function structure that
drh98757152008-01-09 23:04:12 +00001271** defines the function) with P5 arguments taken from register P2 and
drh9cbf3422008-01-17 16:22:13 +00001272** successors. The result of the function is stored in register P3.
danielk1977a7a8e142008-02-13 18:25:27 +00001273** Register P3 must not be one of the function inputs.
danielk1977682f68b2004-06-05 10:22:17 +00001274**
drh13449892005-09-07 21:22:45 +00001275** P1 is a 32-bit bitmask indicating whether or not each argument to the
danielk1977682f68b2004-06-05 10:22:17 +00001276** function was determined to be constant at compile time. If the first
drh13449892005-09-07 21:22:45 +00001277** argument was constant then bit 0 of P1 is set. This is used to determine
danielk1977682f68b2004-06-05 10:22:17 +00001278** whether meta data associated with a user function argument using the
1279** sqlite3_set_auxdata() API may be safely retained until the next
1280** invocation of this opcode.
drh1350b032002-02-27 19:00:20 +00001281**
drh13449892005-09-07 21:22:45 +00001282** See also: AggStep and AggFinal
drh8e0a2f92002-02-23 23:45:45 +00001283*/
drh0bce8352002-02-28 00:41:10 +00001284case OP_Function: {
danielk197751ad0ec2004-05-24 12:39:02 +00001285 int i;
drh6810ce62004-01-31 19:22:56 +00001286 Mem *pArg;
danielk197722322fd2004-05-25 23:35:17 +00001287 sqlite3_context ctx;
danielk197751ad0ec2004-05-24 12:39:02 +00001288 sqlite3_value **apVal;
drh98757152008-01-09 23:04:12 +00001289 int n = pOp->p5;
drh1350b032002-02-27 19:00:20 +00001290
danielk19776ddcca52004-05-24 23:48:25 +00001291 apVal = p->apArg;
danielk197751ad0ec2004-05-24 12:39:02 +00001292 assert( apVal || n==0 );
1293
drh9cbf3422008-01-17 16:22:13 +00001294 assert( n==0 || (pOp->p2>0 && pOp->p2+n<=p->nMem) );
danielk1977a7a8e142008-02-13 18:25:27 +00001295 assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
drh9cbf3422008-01-17 16:22:13 +00001296 pArg = &p->aMem[pOp->p2];
drh6810ce62004-01-31 19:22:56 +00001297 for(i=0; i<n; i++, pArg++){
danielk197751ad0ec2004-05-24 12:39:02 +00001298 apVal[i] = pArg;
drh8079a0d2006-01-12 17:20:50 +00001299 storeTypeInfo(pArg, encoding);
drh2dcef112008-01-12 19:03:48 +00001300 REGISTER_TRACE(pOp->p2, pArg);
drh8e0a2f92002-02-23 23:45:45 +00001301 }
danielk197751ad0ec2004-05-24 12:39:02 +00001302
drh66a51672008-01-03 00:01:23 +00001303 assert( pOp->p4type==P4_FUNCDEF || pOp->p4type==P4_VDBEFUNC );
1304 if( pOp->p4type==P4_FUNCDEF ){
danielk19772dca4ac2008-01-03 11:50:29 +00001305 ctx.pFunc = pOp->p4.pFunc;
danielk1977682f68b2004-06-05 10:22:17 +00001306 ctx.pVdbeFunc = 0;
1307 }else{
danielk19772dca4ac2008-01-03 11:50:29 +00001308 ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc;
danielk1977682f68b2004-06-05 10:22:17 +00001309 ctx.pFunc = ctx.pVdbeFunc->pFunc;
1310 }
1311
danielk1977a7a8e142008-02-13 18:25:27 +00001312 assert( pOp->p3>0 && pOp->p3<=p->nMem );
1313 pOut = &p->aMem[pOp->p3];
drh00706be2004-01-30 14:49:16 +00001314 ctx.s.flags = MEM_Null;
drhfa4a4b92008-03-19 21:45:51 +00001315 ctx.s.db = db;
danielk19775f096132008-03-28 15:44:09 +00001316 ctx.s.xDel = 0;
1317 ctx.s.zMalloc = 0;
danielk1977a7a8e142008-02-13 18:25:27 +00001318
1319 /* The output cell may already have a buffer allocated. Move
1320 ** the pointer to ctx.s so in case the user-function can use
1321 ** the already allocated buffer instead of allocating a new one.
1322 */
1323 sqlite3VdbeMemMove(&ctx.s, pOut);
1324 MemSetTypeFlag(&ctx.s, MEM_Null);
1325
drh8e0a2f92002-02-23 23:45:45 +00001326 ctx.isError = 0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001327 if( ctx.pFunc->needCollSeq ){
1328 assert( pOp>p->aOp );
drh66a51672008-01-03 00:01:23 +00001329 assert( pOp[-1].p4type==P4_COLLSEQ );
danielk1977dc1bdc42004-06-11 10:51:27 +00001330 assert( pOp[-1].opcode==OP_CollSeq );
danielk19772dca4ac2008-01-03 11:50:29 +00001331 ctx.pColl = pOp[-1].p4.pColl;
danielk1977dc1bdc42004-06-11 10:51:27 +00001332 }
danielk19774adee202004-05-08 08:23:19 +00001333 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
danielk197751ad0ec2004-05-24 12:39:02 +00001334 (*ctx.pFunc->xFunc)(&ctx, n, apVal);
danielk197775eb0162008-03-28 19:16:33 +00001335 if( sqlite3SafetyOn(db) ){
1336 sqlite3VdbeMemRelease(&ctx.s);
1337 goto abort_due_to_misuse;
1338 }
drh17435752007-08-16 04:30:38 +00001339 if( db->mallocFailed ){
danielk1977e0fc5262007-07-26 06:50:05 +00001340 /* Even though a malloc() has failed, the implementation of the
1341 ** user function may have called an sqlite3_result_XXX() function
1342 ** to return a value. The following call releases any resources
1343 ** associated with such a value.
1344 **
1345 ** Note: Maybe MemRelease() should be called if sqlite3SafetyOn()
1346 ** fails also (the if(...) statement above). But if people are
1347 ** misusing sqlite, they have bigger problems than a leaked value.
1348 */
1349 sqlite3VdbeMemRelease(&ctx.s);
1350 goto no_mem;
1351 }
danielk19777e18c252004-05-25 11:47:24 +00001352
shane21e7feb2008-05-30 15:59:49 +00001353 /* If any auxiliary data functions have been called by this user function,
danielk1977682f68b2004-06-05 10:22:17 +00001354 ** immediately call the destructor for any non-static values.
1355 */
1356 if( ctx.pVdbeFunc ){
drh13449892005-09-07 21:22:45 +00001357 sqlite3VdbeDeleteAuxData(ctx.pVdbeFunc, pOp->p1);
danielk19772dca4ac2008-01-03 11:50:29 +00001358 pOp->p4.pVdbeFunc = ctx.pVdbeFunc;
drh66a51672008-01-03 00:01:23 +00001359 pOp->p4type = P4_VDBEFUNC;
danielk1977682f68b2004-06-05 10:22:17 +00001360 }
1361
drh90669c12006-01-20 15:45:36 +00001362 /* If the function returned an error, throw an exception */
1363 if( ctx.isError ){
drhf089aa42008-07-08 19:34:06 +00001364 sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s));
drh69544ec2008-02-06 14:11:34 +00001365 rc = ctx.isError;
drh90669c12006-01-20 15:45:36 +00001366 }
1367
drh9cbf3422008-01-17 16:22:13 +00001368 /* Copy the result of the function into register P3 */
drhb21c8cd2007-08-21 19:33:56 +00001369 sqlite3VdbeChangeEncoding(&ctx.s, encoding);
drh98757152008-01-09 23:04:12 +00001370 sqlite3VdbeMemMove(pOut, &ctx.s);
1371 if( sqlite3VdbeMemTooBig(pOut) ){
drh023ae032007-05-08 12:12:16 +00001372 goto too_big;
1373 }
drh2dcef112008-01-12 19:03:48 +00001374 REGISTER_TRACE(pOp->p3, pOut);
drhb7654112008-01-12 12:48:07 +00001375 UPDATE_MAX_BLOBSIZE(pOut);
drh8e0a2f92002-02-23 23:45:45 +00001376 break;
1377}
1378
drh98757152008-01-09 23:04:12 +00001379/* Opcode: BitAnd P1 P2 P3 * *
drhbf4133c2001-10-13 02:59:08 +00001380**
drh98757152008-01-09 23:04:12 +00001381** Take the bit-wise AND of the values in register P1 and P2 and
1382** store the result in register P3.
drh60a713c2008-01-21 16:22:45 +00001383** If either input is NULL, the result is NULL.
drhbf4133c2001-10-13 02:59:08 +00001384*/
drh98757152008-01-09 23:04:12 +00001385/* Opcode: BitOr P1 P2 P3 * *
drhbf4133c2001-10-13 02:59:08 +00001386**
drh98757152008-01-09 23:04:12 +00001387** Take the bit-wise OR of the values in register P1 and P2 and
1388** store the result in register P3.
drh60a713c2008-01-21 16:22:45 +00001389** If either input is NULL, the result is NULL.
drhbf4133c2001-10-13 02:59:08 +00001390*/
drh98757152008-01-09 23:04:12 +00001391/* Opcode: ShiftLeft P1 P2 P3 * *
drhbf4133c2001-10-13 02:59:08 +00001392**
drh98757152008-01-09 23:04:12 +00001393** Shift the integer value in register P2 to the left by the
drh60a713c2008-01-21 16:22:45 +00001394** number of bits specified by the integer in regiser P1.
drh98757152008-01-09 23:04:12 +00001395** Store the result in register P3.
drh60a713c2008-01-21 16:22:45 +00001396** If either input is NULL, the result is NULL.
drhbf4133c2001-10-13 02:59:08 +00001397*/
drh98757152008-01-09 23:04:12 +00001398/* Opcode: ShiftRight P1 P2 P3 * *
drhbf4133c2001-10-13 02:59:08 +00001399**
drh98757152008-01-09 23:04:12 +00001400** Shift the integer value in register P2 to the right by the
drh60a713c2008-01-21 16:22:45 +00001401** number of bits specified by the integer in register P1.
drh98757152008-01-09 23:04:12 +00001402** Store the result in register P3.
drh60a713c2008-01-21 16:22:45 +00001403** If either input is NULL, the result is NULL.
drhbf4133c2001-10-13 02:59:08 +00001404*/
drh5b6afba2008-01-05 16:29:28 +00001405case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */
1406case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */
1407case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */
1408case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */
drhb1276122005-10-29 15:48:30 +00001409 i64 a, b;
drh6810ce62004-01-31 19:22:56 +00001410
drh5b6afba2008-01-05 16:29:28 +00001411 if( (pIn1->flags | pIn2->flags) & MEM_Null ){
drha05a7222008-01-19 03:35:58 +00001412 sqlite3VdbeMemSetNull(pOut);
drhf5905aa2002-05-26 20:54:33 +00001413 break;
1414 }
drh5b6afba2008-01-05 16:29:28 +00001415 a = sqlite3VdbeIntValue(pIn2);
1416 b = sqlite3VdbeIntValue(pIn1);
drhbf4133c2001-10-13 02:59:08 +00001417 switch( pOp->opcode ){
1418 case OP_BitAnd: a &= b; break;
1419 case OP_BitOr: a |= b; break;
1420 case OP_ShiftLeft: a <<= b; break;
drha05a7222008-01-19 03:35:58 +00001421 default: assert( pOp->opcode==OP_ShiftRight );
1422 a >>= b; break;
drhbf4133c2001-10-13 02:59:08 +00001423 }
drh5b6afba2008-01-05 16:29:28 +00001424 pOut->u.i = a;
danielk1977a7a8e142008-02-13 18:25:27 +00001425 MemSetTypeFlag(pOut, MEM_Int);
drhbf4133c2001-10-13 02:59:08 +00001426 break;
1427}
1428
drh8558cde2008-01-05 05:20:10 +00001429/* Opcode: AddImm P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00001430**
danielk19770cdc0222008-06-26 18:04:03 +00001431** Add the constant P2 to the value in register P1.
drh8558cde2008-01-05 05:20:10 +00001432** The result is always an integer.
drh4a324312001-12-21 14:30:42 +00001433**
drh8558cde2008-01-05 05:20:10 +00001434** To force any register to be an integer, just add 0.
drh5e00f6c2001-09-13 13:46:56 +00001435*/
drh9cbf3422008-01-17 16:22:13 +00001436case OP_AddImm: { /* in1 */
drh8558cde2008-01-05 05:20:10 +00001437 sqlite3VdbeMemIntegerify(pIn1);
1438 pIn1->u.i += pOp->p2;
drh5e00f6c2001-09-13 13:46:56 +00001439 break;
1440}
1441
drh41c2bf02008-01-05 05:38:21 +00001442/* Opcode: ForceInt P1 P2 P3 * *
drh1dd59e02003-07-06 17:22:25 +00001443**
drh41c2bf02008-01-05 05:38:21 +00001444** Convert value in register P1 into an integer. If the value
1445** in P1 is not numeric (meaning that is is a NULL or a string that
1446** does not look like an integer or floating point number) then
1447** jump to P2. If the value in P1 is numeric then
drh751f4122004-01-14 21:59:22 +00001448** convert it into the least integer that is greater than or equal to its
drh41c2bf02008-01-05 05:38:21 +00001449** current value if P3==0, or to the least integer that is strictly
1450** greater than its current value if P3==1.
drh1dd59e02003-07-06 17:22:25 +00001451*/
drh9cbf3422008-01-17 16:22:13 +00001452case OP_ForceInt: { /* jump, in1 */
drhf4f8fd52005-03-31 18:40:04 +00001453 i64 v;
drh41c2bf02008-01-05 05:38:21 +00001454 applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
1455 if( (pIn1->flags & (MEM_Int|MEM_Real))==0 ){
drh1dd59e02003-07-06 17:22:25 +00001456 pc = pOp->p2 - 1;
drh751f4122004-01-14 21:59:22 +00001457 break;
drh1dd59e02003-07-06 17:22:25 +00001458 }
drh41c2bf02008-01-05 05:38:21 +00001459 if( pIn1->flags & MEM_Int ){
1460 v = pIn1->u.i + (pOp->p3!=0);
drh751f4122004-01-14 21:59:22 +00001461 }else{
drh41c2bf02008-01-05 05:38:21 +00001462 assert( pIn1->flags & MEM_Real );
1463 v = (sqlite3_int64)pIn1->r;
1464 if( pIn1->r>(double)v ) v++;
1465 if( pOp->p3 && pIn1->r==(double)v ) v++;
drh751f4122004-01-14 21:59:22 +00001466 }
drh41c2bf02008-01-05 05:38:21 +00001467 pIn1->u.i = v;
danielk1977a7a8e142008-02-13 18:25:27 +00001468 MemSetTypeFlag(pIn1, MEM_Int);
drh1dd59e02003-07-06 17:22:25 +00001469 break;
1470}
1471
drh9cbf3422008-01-17 16:22:13 +00001472/* Opcode: MustBeInt P1 P2 * * *
drh8aff1012001-12-22 14:49:24 +00001473**
drh9cbf3422008-01-17 16:22:13 +00001474** Force the value in register P1 to be an integer. If the value
1475** in P1 is not an integer and cannot be converted into an integer
danielk19779a96b662007-11-29 17:05:18 +00001476** without data loss, then jump immediately to P2, or if P2==0
drh8aff1012001-12-22 14:49:24 +00001477** raise an SQLITE_MISMATCH exception.
1478*/
drh9cbf3422008-01-17 16:22:13 +00001479case OP_MustBeInt: { /* jump, in1 */
drh3c84ddf2008-01-09 02:15:38 +00001480 applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
1481 if( (pIn1->flags & MEM_Int)==0 ){
drh17c40292004-07-21 02:53:29 +00001482 if( pOp->p2==0 ){
1483 rc = SQLITE_MISMATCH;
1484 goto abort_due_to_error;
drh3c84ddf2008-01-09 02:15:38 +00001485 }else{
drh17c40292004-07-21 02:53:29 +00001486 pc = pOp->p2 - 1;
drh8aff1012001-12-22 14:49:24 +00001487 }
drh8aff1012001-12-22 14:49:24 +00001488 }else{
danielk1977a7a8e142008-02-13 18:25:27 +00001489 MemSetTypeFlag(pIn1, MEM_Int);
drh8aff1012001-12-22 14:49:24 +00001490 }
1491 break;
1492}
1493
drh8558cde2008-01-05 05:20:10 +00001494/* Opcode: RealAffinity P1 * * * *
drh487e2622005-06-25 18:42:14 +00001495**
drh2133d822008-01-03 18:44:59 +00001496** If register P1 holds an integer convert it to a real value.
drh487e2622005-06-25 18:42:14 +00001497**
drh8a512562005-11-14 22:29:05 +00001498** This opcode is used when extracting information from a column that
1499** has REAL affinity. Such column values may still be stored as
1500** integers, for space efficiency, but after extraction we want them
1501** to have only a real value.
drh487e2622005-06-25 18:42:14 +00001502*/
drh9cbf3422008-01-17 16:22:13 +00001503case OP_RealAffinity: { /* in1 */
drh8558cde2008-01-05 05:20:10 +00001504 if( pIn1->flags & MEM_Int ){
1505 sqlite3VdbeMemRealify(pIn1);
drh8a512562005-11-14 22:29:05 +00001506 }
drh487e2622005-06-25 18:42:14 +00001507 break;
1508}
1509
drh8df447f2005-11-01 15:48:24 +00001510#ifndef SQLITE_OMIT_CAST
drh8558cde2008-01-05 05:20:10 +00001511/* Opcode: ToText P1 * * * *
drh487e2622005-06-25 18:42:14 +00001512**
drh8558cde2008-01-05 05:20:10 +00001513** Force the value in register P1 to be text.
drh31beae92005-11-24 14:34:36 +00001514** If the value is numeric, convert it to a string using the
drh487e2622005-06-25 18:42:14 +00001515** equivalent of printf(). Blob values are unchanged and
1516** are afterwards simply interpreted as text.
1517**
1518** A NULL value is not changed by this routine. It remains NULL.
1519*/
drh9cbf3422008-01-17 16:22:13 +00001520case OP_ToText: { /* same as TK_TO_TEXT, in1 */
drh8558cde2008-01-05 05:20:10 +00001521 if( pIn1->flags & MEM_Null ) break;
drh487e2622005-06-25 18:42:14 +00001522 assert( MEM_Str==(MEM_Blob>>3) );
drh8558cde2008-01-05 05:20:10 +00001523 pIn1->flags |= (pIn1->flags&MEM_Blob)>>3;
1524 applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
1525 rc = ExpandBlob(pIn1);
danielk1977a7a8e142008-02-13 18:25:27 +00001526 assert( pIn1->flags & MEM_Str || db->mallocFailed );
drh8558cde2008-01-05 05:20:10 +00001527 pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_Blob);
drhb7654112008-01-12 12:48:07 +00001528 UPDATE_MAX_BLOBSIZE(pIn1);
drh487e2622005-06-25 18:42:14 +00001529 break;
1530}
1531
drh8558cde2008-01-05 05:20:10 +00001532/* Opcode: ToBlob P1 * * * *
drh487e2622005-06-25 18:42:14 +00001533**
drh8558cde2008-01-05 05:20:10 +00001534** Force the value in register P1 to be a BLOB.
drh487e2622005-06-25 18:42:14 +00001535** If the value is numeric, convert it to a string first.
1536** Strings are simply reinterpreted as blobs with no change
1537** to the underlying data.
1538**
1539** A NULL value is not changed by this routine. It remains NULL.
1540*/
drh9cbf3422008-01-17 16:22:13 +00001541case OP_ToBlob: { /* same as TK_TO_BLOB, in1 */
drh8558cde2008-01-05 05:20:10 +00001542 if( pIn1->flags & MEM_Null ) break;
1543 if( (pIn1->flags & MEM_Blob)==0 ){
1544 applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
danielk1977a7a8e142008-02-13 18:25:27 +00001545 assert( pIn1->flags & MEM_Str || db->mallocFailed );
drh487e2622005-06-25 18:42:14 +00001546 }
danielk1977a7a8e142008-02-13 18:25:27 +00001547 MemSetTypeFlag(pIn1, MEM_Blob);
drhb7654112008-01-12 12:48:07 +00001548 UPDATE_MAX_BLOBSIZE(pIn1);
drh487e2622005-06-25 18:42:14 +00001549 break;
1550}
drh8a512562005-11-14 22:29:05 +00001551
drh8558cde2008-01-05 05:20:10 +00001552/* Opcode: ToNumeric P1 * * * *
drh8a512562005-11-14 22:29:05 +00001553**
drh8558cde2008-01-05 05:20:10 +00001554** Force the value in register P1 to be numeric (either an
drh8a512562005-11-14 22:29:05 +00001555** integer or a floating-point number.)
1556** If the value is text or blob, try to convert it to an using the
1557** equivalent of atoi() or atof() and store 0 if no such conversion
1558** is possible.
1559**
1560** A NULL value is not changed by this routine. It remains NULL.
1561*/
drh9cbf3422008-01-17 16:22:13 +00001562case OP_ToNumeric: { /* same as TK_TO_NUMERIC, in1 */
drh8558cde2008-01-05 05:20:10 +00001563 if( (pIn1->flags & (MEM_Null|MEM_Int|MEM_Real))==0 ){
1564 sqlite3VdbeMemNumerify(pIn1);
drh8a512562005-11-14 22:29:05 +00001565 }
1566 break;
1567}
1568#endif /* SQLITE_OMIT_CAST */
1569
drh8558cde2008-01-05 05:20:10 +00001570/* Opcode: ToInt P1 * * * *
drh8a512562005-11-14 22:29:05 +00001571**
drh8558cde2008-01-05 05:20:10 +00001572** Force the value in register P1 be an integer. If
drh8a512562005-11-14 22:29:05 +00001573** The value is currently a real number, drop its fractional part.
1574** If the value is text or blob, try to convert it to an integer using the
1575** equivalent of atoi() and store 0 if no such conversion is possible.
1576**
1577** A NULL value is not changed by this routine. It remains NULL.
1578*/
drh9cbf3422008-01-17 16:22:13 +00001579case OP_ToInt: { /* same as TK_TO_INT, in1 */
drh8558cde2008-01-05 05:20:10 +00001580 if( (pIn1->flags & MEM_Null)==0 ){
1581 sqlite3VdbeMemIntegerify(pIn1);
drh8a512562005-11-14 22:29:05 +00001582 }
1583 break;
1584}
1585
1586#ifndef SQLITE_OMIT_CAST
drh8558cde2008-01-05 05:20:10 +00001587/* Opcode: ToReal P1 * * * *
drh8a512562005-11-14 22:29:05 +00001588**
drh8558cde2008-01-05 05:20:10 +00001589** Force the value in register P1 to be a floating point number.
drh8a512562005-11-14 22:29:05 +00001590** If The value is currently an integer, convert it.
1591** If the value is text or blob, try to convert it to an integer using the
drh60a713c2008-01-21 16:22:45 +00001592** equivalent of atoi() and store 0.0 if no such conversion is possible.
drh8a512562005-11-14 22:29:05 +00001593**
1594** A NULL value is not changed by this routine. It remains NULL.
1595*/
drh9cbf3422008-01-17 16:22:13 +00001596case OP_ToReal: { /* same as TK_TO_REAL, in1 */
drh8558cde2008-01-05 05:20:10 +00001597 if( (pIn1->flags & MEM_Null)==0 ){
1598 sqlite3VdbeMemRealify(pIn1);
drh8a512562005-11-14 22:29:05 +00001599 }
1600 break;
1601}
drh487e2622005-06-25 18:42:14 +00001602#endif /* SQLITE_OMIT_CAST */
1603
drh35573352008-01-08 23:54:25 +00001604/* Opcode: Lt P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00001605**
drh35573352008-01-08 23:54:25 +00001606** Compare the values in register P1 and P3. If reg(P3)<reg(P1) then
1607** jump to address P2.
drhf5905aa2002-05-26 20:54:33 +00001608**
drh35573352008-01-08 23:54:25 +00001609** If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or
1610** reg(P3) is NULL then take the jump. If the SQLITE_JUMPIFNULL
1611** bit is clear then fall thru if either operand is NULL.
drh4f686232005-09-20 13:55:18 +00001612**
drh35573352008-01-08 23:54:25 +00001613** The SQLITE_AFF_MASK portion of P5 must be an affinity character -
drh8a512562005-11-14 22:29:05 +00001614** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made
drh60a713c2008-01-21 16:22:45 +00001615** to coerce both inputs according to this affinity before the
drh35573352008-01-08 23:54:25 +00001616** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric
drh60a713c2008-01-21 16:22:45 +00001617** affinity is used. Note that the affinity conversions are stored
1618** back into the input registers P1 and P3. So this opcode can cause
1619** persistent changes to registers P1 and P3.
danielk1977a37cdde2004-05-16 11:15:36 +00001620**
1621** Once any conversions have taken place, and neither value is NULL,
drh35573352008-01-08 23:54:25 +00001622** the values are compared. If both values are blobs then memcmp() is
1623** used to determine the results of the comparison. If both values
1624** are text, then the appropriate collating function specified in
1625** P4 is used to do the comparison. If P4 is not specified then
1626** memcmp() is used to compare text string. If both values are
1627** numeric, then a numeric comparison is used. If the two values
1628** are of different types, then numbers are considered less than
1629** strings and strings are considered less than blobs.
drhc9b84a12002-06-20 11:36:48 +00001630**
drh35573352008-01-08 23:54:25 +00001631** If the SQLITE_STOREP2 bit of P5 is set, then do not jump. Instead,
1632** store a boolean result (either 0, or 1, or NULL) in register P2.
drh5e00f6c2001-09-13 13:46:56 +00001633*/
drh9cbf3422008-01-17 16:22:13 +00001634/* Opcode: Ne P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00001635**
drh35573352008-01-08 23:54:25 +00001636** This works just like the Lt opcode except that the jump is taken if
1637** the operands in registers P1 and P3 are not equal. See the Lt opcode for
drh53db1452004-05-20 13:54:53 +00001638** additional information.
drh5e00f6c2001-09-13 13:46:56 +00001639*/
drh9cbf3422008-01-17 16:22:13 +00001640/* Opcode: Eq P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00001641**
drh35573352008-01-08 23:54:25 +00001642** This works just like the Lt opcode except that the jump is taken if
1643** the operands in registers P1 and P3 are equal.
1644** See the Lt opcode for additional information.
drh5e00f6c2001-09-13 13:46:56 +00001645*/
drh9cbf3422008-01-17 16:22:13 +00001646/* Opcode: Le P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00001647**
drh35573352008-01-08 23:54:25 +00001648** This works just like the Lt opcode except that the jump is taken if
1649** the content of register P3 is less than or equal to the content of
1650** register P1. See the Lt opcode for additional information.
drh5e00f6c2001-09-13 13:46:56 +00001651*/
drh9cbf3422008-01-17 16:22:13 +00001652/* Opcode: Gt P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00001653**
drh35573352008-01-08 23:54:25 +00001654** This works just like the Lt opcode except that the jump is taken if
1655** the content of register P3 is greater than the content of
1656** register P1. See the Lt opcode for additional information.
drh5e00f6c2001-09-13 13:46:56 +00001657*/
drh9cbf3422008-01-17 16:22:13 +00001658/* Opcode: Ge P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00001659**
drh35573352008-01-08 23:54:25 +00001660** This works just like the Lt opcode except that the jump is taken if
1661** the content of register P3 is greater than or equal to the content of
1662** register P1. See the Lt opcode for additional information.
drh5e00f6c2001-09-13 13:46:56 +00001663*/
drh9cbf3422008-01-17 16:22:13 +00001664case OP_Eq: /* same as TK_EQ, jump, in1, in3 */
1665case OP_Ne: /* same as TK_NE, jump, in1, in3 */
1666case OP_Lt: /* same as TK_LT, jump, in1, in3 */
1667case OP_Le: /* same as TK_LE, jump, in1, in3 */
1668case OP_Gt: /* same as TK_GT, jump, in1, in3 */
1669case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
danielk1977a37cdde2004-05-16 11:15:36 +00001670 int flags;
1671 int res;
1672 char affinity;
1673
drh35573352008-01-08 23:54:25 +00001674 flags = pIn1->flags|pIn3->flags;
danielk1977a37cdde2004-05-16 11:15:36 +00001675
danielk1977a37cdde2004-05-16 11:15:36 +00001676 if( flags&MEM_Null ){
drh93a960a2008-07-10 00:32:42 +00001677 /* If either operand is NULL then the result is always NULL.
1678 ** The jump is taken if the SQLITE_JUMPIFNULL bit is set.
1679 */
1680 if( pOp->p5 & SQLITE_STOREP2 ){
1681 pOut = &p->aMem[pOp->p2];
1682 MemSetTypeFlag(pOut, MEM_Null);
1683 REGISTER_TRACE(pOp->p2, pOut);
1684 }else if( pOp->p5 & SQLITE_JUMPIFNULL ){
1685 pc = pOp->p2-1;
danielk1977a37cdde2004-05-16 11:15:36 +00001686 }
drh93a960a2008-07-10 00:32:42 +00001687 break;
danielk1977a37cdde2004-05-16 11:15:36 +00001688 }
1689
drh35573352008-01-08 23:54:25 +00001690 affinity = pOp->p5 & SQLITE_AFF_MASK;
drhe51c44f2004-05-30 20:46:09 +00001691 if( affinity ){
drh35573352008-01-08 23:54:25 +00001692 applyAffinity(pIn1, affinity, encoding);
1693 applyAffinity(pIn3, affinity, encoding);
drhe51c44f2004-05-30 20:46:09 +00001694 }
danielk1977a37cdde2004-05-16 11:15:36 +00001695
danielk19772dca4ac2008-01-03 11:50:29 +00001696 assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 );
drh35573352008-01-08 23:54:25 +00001697 ExpandBlob(pIn1);
1698 ExpandBlob(pIn3);
1699 res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl);
danielk1977a37cdde2004-05-16 11:15:36 +00001700 switch( pOp->opcode ){
1701 case OP_Eq: res = res==0; break;
1702 case OP_Ne: res = res!=0; break;
1703 case OP_Lt: res = res<0; break;
1704 case OP_Le: res = res<=0; break;
1705 case OP_Gt: res = res>0; break;
1706 default: res = res>=0; break;
1707 }
1708
drh35573352008-01-08 23:54:25 +00001709 if( pOp->p5 & SQLITE_STOREP2 ){
1710 pOut = &p->aMem[pOp->p2];
danielk1977a7a8e142008-02-13 18:25:27 +00001711 MemSetTypeFlag(pOut, MEM_Int);
drh35573352008-01-08 23:54:25 +00001712 pOut->u.i = res;
1713 REGISTER_TRACE(pOp->p2, pOut);
1714 }else if( res ){
1715 pc = pOp->p2-1;
danielk1977a37cdde2004-05-16 11:15:36 +00001716 }
1717 break;
1718}
drhc9b84a12002-06-20 11:36:48 +00001719
drh0acb7e42008-06-25 00:12:41 +00001720/* Opcode: Permutation * * * P4 *
1721**
1722** Set the permuation used by the OP_Compare operator to be the array
1723** of integers in P4.
1724**
1725** The permutation is only valid until the next OP_Permutation, OP_Compare,
1726** OP_Halt, or OP_ResultRow. Typically the OP_Permutation should occur
1727** immediately prior to the OP_Compare.
1728*/
1729case OP_Permutation: {
1730 assert( pOp->p4type==P4_INTARRAY );
1731 assert( pOp->p4.ai );
1732 aPermute = pOp->p4.ai;
1733 break;
1734}
1735
drh16ee60f2008-06-20 18:13:25 +00001736/* Opcode: Compare P1 P2 P3 P4 *
1737**
1738** Compare to vectors of registers in reg(P1)..reg(P1+P3-1) (all this
1739** one "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of
1740** the comparison for use by the next OP_Jump instruct.
1741**
drh0acb7e42008-06-25 00:12:41 +00001742** P4 is a KeyInfo structure that defines collating sequences and sort
1743** orders for the comparison. The permutation applies to registers
1744** only. The KeyInfo elements are used sequentially.
1745**
1746** The comparison is a sort comparison, so NULLs compare equal,
1747** NULLs are less than numbers, numbers are less than strings,
drh16ee60f2008-06-20 18:13:25 +00001748** and strings are less than blobs.
1749*/
1750case OP_Compare: {
1751 int n = pOp->p3;
1752 int i, p1, p2;
1753 const KeyInfo *pKeyInfo = pOp->p4.pKeyInfo;
1754 assert( n>0 );
drh93a960a2008-07-10 00:32:42 +00001755 assert( pKeyInfo!=0 );
drh16ee60f2008-06-20 18:13:25 +00001756 p1 = pOp->p1;
1757 assert( p1>0 && p1+n-1<p->nMem );
1758 p2 = pOp->p2;
1759 assert( p2>0 && p2+n-1<p->nMem );
drh0acb7e42008-06-25 00:12:41 +00001760 for(i=0; i<n; i++){
1761 int idx = aPermute ? aPermute[i] : i;
1762 CollSeq *pColl; /* Collating sequence to use on this term */
1763 int bRev; /* True for DESCENDING sort order */
drh0acb7e42008-06-25 00:12:41 +00001764 REGISTER_TRACE(p1+idx, &p->aMem[p1+idx]);
1765 REGISTER_TRACE(p2+idx, &p->aMem[p2+idx]);
drh93a960a2008-07-10 00:32:42 +00001766 assert( i<pKeyInfo->nField );
1767 pColl = pKeyInfo->aColl[i];
1768 bRev = pKeyInfo->aSortOrder[i];
drh0acb7e42008-06-25 00:12:41 +00001769 iCompare = sqlite3MemCompare(&p->aMem[p1+idx], &p->aMem[p2+idx], pColl);
1770 if( iCompare ){
1771 if( bRev ) iCompare = -iCompare;
1772 break;
1773 }
drh16ee60f2008-06-20 18:13:25 +00001774 }
drh0acb7e42008-06-25 00:12:41 +00001775 aPermute = 0;
drh16ee60f2008-06-20 18:13:25 +00001776 break;
1777}
1778
1779/* Opcode: Jump P1 P2 P3 * *
1780**
1781** Jump to the instruction at address P1, P2, or P3 depending on whether
1782** in the most recent OP_Compare instruction the P1 vector was less than
1783** equal to, or greater than the P2 vector, respectively.
1784*/
drh0acb7e42008-06-25 00:12:41 +00001785case OP_Jump: { /* jump */
1786 if( iCompare<0 ){
drh16ee60f2008-06-20 18:13:25 +00001787 pc = pOp->p1 - 1;
drh0acb7e42008-06-25 00:12:41 +00001788 }else if( iCompare==0 ){
drh16ee60f2008-06-20 18:13:25 +00001789 pc = pOp->p2 - 1;
1790 }else{
1791 pc = pOp->p3 - 1;
1792 }
1793 break;
1794}
1795
drh5b6afba2008-01-05 16:29:28 +00001796/* Opcode: And P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001797**
drh5b6afba2008-01-05 16:29:28 +00001798** Take the logical AND of the values in registers P1 and P2 and
1799** write the result into register P3.
drh5e00f6c2001-09-13 13:46:56 +00001800**
drh5b6afba2008-01-05 16:29:28 +00001801** If either P1 or P2 is 0 (false) then the result is 0 even if
1802** the other input is NULL. A NULL and true or two NULLs give
1803** a NULL output.
drh5e00f6c2001-09-13 13:46:56 +00001804*/
drh5b6afba2008-01-05 16:29:28 +00001805/* Opcode: Or P1 P2 P3 * *
1806**
1807** Take the logical OR of the values in register P1 and P2 and
1808** store the answer in register P3.
1809**
1810** If either P1 or P2 is nonzero (true) then the result is 1 (true)
1811** even if the other input is NULL. A NULL and false or two NULLs
1812** give a NULL output.
1813*/
1814case OP_And: /* same as TK_AND, in1, in2, out3 */
1815case OP_Or: { /* same as TK_OR, in1, in2, out3 */
1816 int v1, v2; /* 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
drhbb113512002-05-27 01:04:51 +00001817
drh5b6afba2008-01-05 16:29:28 +00001818 if( pIn1->flags & MEM_Null ){
drhbb113512002-05-27 01:04:51 +00001819 v1 = 2;
drh5e00f6c2001-09-13 13:46:56 +00001820 }else{
drh5b6afba2008-01-05 16:29:28 +00001821 v1 = sqlite3VdbeIntValue(pIn1)!=0;
drhbb113512002-05-27 01:04:51 +00001822 }
drh5b6afba2008-01-05 16:29:28 +00001823 if( pIn2->flags & MEM_Null ){
drhbb113512002-05-27 01:04:51 +00001824 v2 = 2;
1825 }else{
drh5b6afba2008-01-05 16:29:28 +00001826 v2 = sqlite3VdbeIntValue(pIn2)!=0;
drhbb113512002-05-27 01:04:51 +00001827 }
1828 if( pOp->opcode==OP_And ){
drh5b6afba2008-01-05 16:29:28 +00001829 static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
drhbb113512002-05-27 01:04:51 +00001830 v1 = and_logic[v1*3+v2];
1831 }else{
drh5b6afba2008-01-05 16:29:28 +00001832 static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
drhbb113512002-05-27 01:04:51 +00001833 v1 = or_logic[v1*3+v2];
drh5e00f6c2001-09-13 13:46:56 +00001834 }
drhbb113512002-05-27 01:04:51 +00001835 if( v1==2 ){
danielk1977a7a8e142008-02-13 18:25:27 +00001836 MemSetTypeFlag(pOut, MEM_Null);
drhbb113512002-05-27 01:04:51 +00001837 }else{
drh5b6afba2008-01-05 16:29:28 +00001838 pOut->u.i = v1;
danielk1977a7a8e142008-02-13 18:25:27 +00001839 MemSetTypeFlag(pOut, MEM_Int);
drhbb113512002-05-27 01:04:51 +00001840 }
drh5e00f6c2001-09-13 13:46:56 +00001841 break;
1842}
1843
drh98757152008-01-09 23:04:12 +00001844/* Opcode: Not P1 * * * *
drh5e00f6c2001-09-13 13:46:56 +00001845**
drh98757152008-01-09 23:04:12 +00001846** Interpret the value in register P1 as a boolean value. Replace it
1847** with its complement. If the value in register P1 is NULL its value
drhf5905aa2002-05-26 20:54:33 +00001848** is unchanged.
drh5e00f6c2001-09-13 13:46:56 +00001849*/
drh9cbf3422008-01-17 16:22:13 +00001850case OP_Not: { /* same as TK_NOT, in1 */
drh3c84ddf2008-01-09 02:15:38 +00001851 if( pIn1->flags & MEM_Null ) break; /* Do nothing to NULLs */
1852 sqlite3VdbeMemIntegerify(pIn1);
drh98757152008-01-09 23:04:12 +00001853 pIn1->u.i = !pIn1->u.i;
danielk1977a7a8e142008-02-13 18:25:27 +00001854 assert( pIn1->flags&MEM_Int );
drh5e00f6c2001-09-13 13:46:56 +00001855 break;
1856}
1857
drh98757152008-01-09 23:04:12 +00001858/* Opcode: BitNot P1 * * * *
drhbf4133c2001-10-13 02:59:08 +00001859**
drh98757152008-01-09 23:04:12 +00001860** Interpret the content of register P1 as an integer. Replace it
1861** with its ones-complement. If the value is originally NULL, leave
1862** it unchanged.
drhbf4133c2001-10-13 02:59:08 +00001863*/
drh9cbf3422008-01-17 16:22:13 +00001864case OP_BitNot: { /* same as TK_BITNOT, in1 */
drh3c84ddf2008-01-09 02:15:38 +00001865 if( pIn1->flags & MEM_Null ) break; /* Do nothing to NULLs */
1866 sqlite3VdbeMemIntegerify(pIn1);
drh98757152008-01-09 23:04:12 +00001867 pIn1->u.i = ~pIn1->u.i;
danielk1977a7a8e142008-02-13 18:25:27 +00001868 assert( pIn1->flags&MEM_Int );
drhbf4133c2001-10-13 02:59:08 +00001869 break;
1870}
1871
drh3c84ddf2008-01-09 02:15:38 +00001872/* Opcode: If P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00001873**
drh3c84ddf2008-01-09 02:15:38 +00001874** Jump to P2 if the value in register P1 is true. The value is
1875** is considered true if it is numeric and non-zero. If the value
1876** in P1 is NULL then take the jump if P3 is true.
drh5e00f6c2001-09-13 13:46:56 +00001877*/
drh3c84ddf2008-01-09 02:15:38 +00001878/* Opcode: IfNot P1 P2 P3 * *
drhf5905aa2002-05-26 20:54:33 +00001879**
drh3c84ddf2008-01-09 02:15:38 +00001880** Jump to P2 if the value in register P1 is False. The value is
1881** is considered true if it has a numeric value of zero. If the value
1882** in P1 is NULL then take the jump if P3 is true.
drhf5905aa2002-05-26 20:54:33 +00001883*/
drh9cbf3422008-01-17 16:22:13 +00001884case OP_If: /* jump, in1 */
1885case OP_IfNot: { /* jump, in1 */
drh5e00f6c2001-09-13 13:46:56 +00001886 int c;
drh3c84ddf2008-01-09 02:15:38 +00001887 if( pIn1->flags & MEM_Null ){
1888 c = pOp->p3;
drhf5905aa2002-05-26 20:54:33 +00001889 }else{
drhba0232a2005-06-06 17:27:19 +00001890#ifdef SQLITE_OMIT_FLOATING_POINT
drh3c84ddf2008-01-09 02:15:38 +00001891 c = sqlite3VdbeIntValue(pIn1);
drhba0232a2005-06-06 17:27:19 +00001892#else
drh3c84ddf2008-01-09 02:15:38 +00001893 c = sqlite3VdbeRealValue(pIn1)!=0.0;
drhba0232a2005-06-06 17:27:19 +00001894#endif
drhf5905aa2002-05-26 20:54:33 +00001895 if( pOp->opcode==OP_IfNot ) c = !c;
1896 }
drh3c84ddf2008-01-09 02:15:38 +00001897 if( c ){
1898 pc = pOp->p2-1;
1899 }
drh5e00f6c2001-09-13 13:46:56 +00001900 break;
1901}
1902
drh2d401ab2008-01-10 23:50:11 +00001903/* Opcode: IsNull P1 P2 P3 * *
drh477df4b2008-01-05 18:48:24 +00001904**
drh2d401ab2008-01-10 23:50:11 +00001905** Jump to P2 if the value in register P1 is NULL. If P3 is greater
1906** than zero, then check all values reg(P1), reg(P1+1),
1907** reg(P1+2), ..., reg(P1+P3-1).
drh477df4b2008-01-05 18:48:24 +00001908*/
drh9cbf3422008-01-17 16:22:13 +00001909case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */
drh2d401ab2008-01-10 23:50:11 +00001910 int n = pOp->p3;
1911 assert( pOp->p3==0 || pOp->p1>0 );
1912 do{
1913 if( (pIn1->flags & MEM_Null)!=0 ){
1914 pc = pOp->p2 - 1;
1915 break;
1916 }
1917 pIn1++;
1918 }while( --n > 0 );
drh477df4b2008-01-05 18:48:24 +00001919 break;
1920}
1921
drh98757152008-01-09 23:04:12 +00001922/* Opcode: NotNull P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00001923**
drh6a288a32008-01-07 19:20:24 +00001924** Jump to P2 if the value in register P1 is not NULL.
drh5e00f6c2001-09-13 13:46:56 +00001925*/
drh9cbf3422008-01-17 16:22:13 +00001926case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */
drh6a288a32008-01-07 19:20:24 +00001927 if( (pIn1->flags & MEM_Null)==0 ){
1928 pc = pOp->p2 - 1;
1929 }
drh5e00f6c2001-09-13 13:46:56 +00001930 break;
1931}
1932
danielk1977cd3e8f72008-03-25 09:47:35 +00001933/* Opcode: SetNumColumns * P2 * * *
danielk1977b4964b72004-05-18 01:23:38 +00001934**
danielk1977cd3e8f72008-03-25 09:47:35 +00001935** This opcode sets the number of columns for the cursor opened by the
1936** following instruction to P2.
danielk1977b4964b72004-05-18 01:23:38 +00001937**
danielk1977cd3e8f72008-03-25 09:47:35 +00001938** An OP_SetNumColumns is only useful if it occurs immediately before
1939** one of the following opcodes:
danielk1977ac171782005-02-05 06:49:54 +00001940**
danielk1977cd3e8f72008-03-25 09:47:35 +00001941** OpenRead
1942** OpenWrite
1943** OpenPseudo
1944**
1945** If the OP_Column opcode is to be executed on a cursor, then
1946** this opcode must be present immediately before the opcode that
1947** opens the cursor.
danielk1977b4964b72004-05-18 01:23:38 +00001948*/
drh9cbf3422008-01-17 16:22:13 +00001949case OP_SetNumColumns: {
danielk1977b4964b72004-05-18 01:23:38 +00001950 break;
1951}
1952
danielk197760585dd2008-01-03 08:08:40 +00001953/* Opcode: Column P1 P2 P3 P4 *
danielk1977192ac1d2004-05-10 07:17:30 +00001954**
danielk1977cfcdaef2004-05-12 07:33:33 +00001955** Interpret the data that cursor P1 points to as a structure built using
1956** the MakeRecord instruction. (See the MakeRecord opcode for additional
drhd4e70eb2008-01-02 00:34:36 +00001957** information about the format of the data.) Extract the P2-th column
1958** from this record. If there are less that (P2+1)
1959** values in the record, extract a NULL.
1960**
drh9cbf3422008-01-17 16:22:13 +00001961** The value extracted is stored in register P3.
danielk1977192ac1d2004-05-10 07:17:30 +00001962**
danielk1977cfcdaef2004-05-12 07:33:33 +00001963** If the KeyAsData opcode has previously executed on this cursor, then the
1964** field might be extracted from the key rather than the data.
danielk1977192ac1d2004-05-10 07:17:30 +00001965**
danielk19771f4aa332008-01-03 09:51:55 +00001966** If the column contains fewer than P2 fields, then extract a NULL. Or,
1967** if the P4 argument is a P4_MEM use the value of the P4 argument as
1968** the result.
danielk1977192ac1d2004-05-10 07:17:30 +00001969*/
danielk1977cfcdaef2004-05-12 07:33:33 +00001970case OP_Column: {
danielk1977e0d4b062004-06-28 01:11:46 +00001971 u32 payloadSize; /* Number of bytes in the record */
drhd3194f52004-05-27 19:59:32 +00001972 int p1 = pOp->p1; /* P1 value of the opcode */
danielk1977cfcdaef2004-05-12 07:33:33 +00001973 int p2 = pOp->p2; /* column number to retrieve */
drhd3194f52004-05-27 19:59:32 +00001974 Cursor *pC = 0; /* The VDBE cursor */
drhe61cffc2004-06-12 18:12:15 +00001975 char *zRec; /* Pointer to complete record-data */
drhd3194f52004-05-27 19:59:32 +00001976 BtCursor *pCrsr; /* The BTree cursor */
1977 u32 *aType; /* aType[i] holds the numeric type of the i-th column */
1978 u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
drh25aa1b42004-05-28 01:39:01 +00001979 u32 nField; /* number of fields in the record */
danielk1977cfcdaef2004-05-12 07:33:33 +00001980 int len; /* The length of the serialized data for the column */
drhd3194f52004-05-27 19:59:32 +00001981 int i; /* Loop counter */
1982 char *zData; /* Part of the record being decoded */
drhd4e70eb2008-01-02 00:34:36 +00001983 Mem *pDest; /* Where to write the extracted value */
drhd3194f52004-05-27 19:59:32 +00001984 Mem sMem; /* For storing the record being decoded */
danielk1977192ac1d2004-05-10 07:17:30 +00001985
drhb6f54522004-05-20 02:42:16 +00001986 sMem.flags = 0;
danielk1977a7a8e142008-02-13 18:25:27 +00001987 sMem.db = 0;
danielk19775f096132008-03-28 15:44:09 +00001988 sMem.zMalloc = 0;
drhd3194f52004-05-27 19:59:32 +00001989 assert( p1<p->nCursor );
drh9cbf3422008-01-17 16:22:13 +00001990 assert( pOp->p3>0 && pOp->p3<=p->nMem );
1991 pDest = &p->aMem[pOp->p3];
danielk1977a7a8e142008-02-13 18:25:27 +00001992 MemSetTypeFlag(pDest, MEM_Null);
danielk1977cfcdaef2004-05-12 07:33:33 +00001993
drhe61cffc2004-06-12 18:12:15 +00001994 /* This block sets the variable payloadSize to be the total number of
1995 ** bytes in the record.
1996 **
1997 ** zRec is set to be the complete text of the record if it is available.
drhb73857f2006-03-17 00:25:59 +00001998 ** The complete record text is always available for pseudo-tables
1999 ** If the record is stored in a cursor, the complete record text
2000 ** might be available in the pC->aRow cache. Or it might not be.
2001 ** If the data is unavailable, zRec is set to NULL.
drhd3194f52004-05-27 19:59:32 +00002002 **
2003 ** We also compute the number of columns in the record. For cursors,
drh9cbf3422008-01-17 16:22:13 +00002004 ** the number of columns is stored in the Cursor.nField element.
danielk1977cfcdaef2004-05-12 07:33:33 +00002005 */
drhb73857f2006-03-17 00:25:59 +00002006 pC = p->apCsr[p1];
danielk19776c924092007-11-12 08:09:34 +00002007 assert( pC!=0 );
danielk19770817d0d2007-02-14 09:19:36 +00002008#ifndef SQLITE_OMIT_VIRTUALTABLE
2009 assert( pC->pVtabCursor==0 );
2010#endif
drhb73857f2006-03-17 00:25:59 +00002011 if( pC->pCursor!=0 ){
drhe61cffc2004-06-12 18:12:15 +00002012 /* The record is stored in a B-Tree */
drh536065a2005-01-26 21:55:31 +00002013 rc = sqlite3VdbeCursorMoveto(pC);
drh52f159e2005-01-27 00:33:21 +00002014 if( rc ) goto abort_due_to_error;
danielk1977192ac1d2004-05-10 07:17:30 +00002015 zRec = 0;
2016 pCrsr = pC->pCursor;
2017 if( pC->nullRow ){
2018 payloadSize = 0;
drh76873ab2006-01-07 18:48:26 +00002019 }else if( pC->cacheStatus==p->cacheCtr ){
drh9188b382004-05-14 21:12:22 +00002020 payloadSize = pC->payloadSize;
drh2646da72005-12-09 20:02:05 +00002021 zRec = (char*)pC->aRow;
drhf0863fe2005-06-12 21:35:51 +00002022 }else if( pC->isIndex ){
danielk197796fc5fe2004-05-13 11:34:16 +00002023 i64 payloadSize64;
danielk1977192ac1d2004-05-10 07:17:30 +00002024 sqlite3BtreeKeySize(pCrsr, &payloadSize64);
2025 payloadSize = payloadSize64;
2026 }else{
2027 sqlite3BtreeDataSize(pCrsr, &payloadSize);
2028 }
drhd3194f52004-05-27 19:59:32 +00002029 nField = pC->nField;
drha05a7222008-01-19 03:35:58 +00002030 }else{
2031 assert( pC->pseudoTable );
drhe61cffc2004-06-12 18:12:15 +00002032 /* The record is the sole entry of a pseudo-table */
danielk1977192ac1d2004-05-10 07:17:30 +00002033 payloadSize = pC->nData;
2034 zRec = pC->pData;
drh76873ab2006-01-07 18:48:26 +00002035 pC->cacheStatus = CACHE_STALE;
danielk1977192ac1d2004-05-10 07:17:30 +00002036 assert( payloadSize==0 || zRec!=0 );
drhd3194f52004-05-27 19:59:32 +00002037 nField = pC->nField;
danielk1977f7df9cc2004-06-16 12:02:47 +00002038 pCrsr = 0;
danielk1977192ac1d2004-05-10 07:17:30 +00002039 }
2040
drh9cbf3422008-01-17 16:22:13 +00002041 /* If payloadSize is 0, then just store a NULL */
danielk1977192ac1d2004-05-10 07:17:30 +00002042 if( payloadSize==0 ){
danielk1977a7a8e142008-02-13 18:25:27 +00002043 assert( pDest->flags&MEM_Null );
drhd4e70eb2008-01-02 00:34:36 +00002044 goto op_column_out;
danielk1977192ac1d2004-05-10 07:17:30 +00002045 }
drhbb4957f2008-03-20 14:03:29 +00002046 if( payloadSize>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh023ae032007-05-08 12:12:16 +00002047 goto too_big;
2048 }
danielk1977192ac1d2004-05-10 07:17:30 +00002049
drhd3194f52004-05-27 19:59:32 +00002050 assert( p2<nField );
danielk1977b4964b72004-05-18 01:23:38 +00002051
drh9188b382004-05-14 21:12:22 +00002052 /* Read and parse the table header. Store the results of the parse
2053 ** into the record header cache fields of the cursor.
danielk1977192ac1d2004-05-10 07:17:30 +00002054 */
danielk1977cd3e8f72008-03-25 09:47:35 +00002055 aType = pC->aType;
drha05a7222008-01-19 03:35:58 +00002056 if( pC->cacheStatus==p->cacheCtr ){
drhd3194f52004-05-27 19:59:32 +00002057 aOffset = pC->aOffset;
2058 }else{
danielk1977dedf45b2006-01-13 17:12:01 +00002059 u8 *zIdx; /* Index into header */
2060 u8 *zEndHdr; /* Pointer to first byte after the header */
2061 u32 offset; /* Offset into the data */
drh0ac07192006-02-10 14:02:07 +00002062 int szHdrSz; /* Size of the header size field at start of record */
danielk1977dedf45b2006-01-13 17:12:01 +00002063 int avail; /* Number of bytes of available data */
drhb73857f2006-03-17 00:25:59 +00002064
danielk1977cd3e8f72008-03-25 09:47:35 +00002065 assert(aType);
drhb73857f2006-03-17 00:25:59 +00002066 pC->aOffset = aOffset = &aType[nField];
2067 pC->payloadSize = payloadSize;
2068 pC->cacheStatus = p->cacheCtr;
danielk1977192ac1d2004-05-10 07:17:30 +00002069
drhd3194f52004-05-27 19:59:32 +00002070 /* Figure out how many bytes are in the header */
danielk197784ac9d02004-05-18 09:58:06 +00002071 if( zRec ){
2072 zData = zRec;
2073 }else{
drhf0863fe2005-06-12 21:35:51 +00002074 if( pC->isIndex ){
drhe51c44f2004-05-30 20:46:09 +00002075 zData = (char*)sqlite3BtreeKeyFetch(pCrsr, &avail);
drhd3194f52004-05-27 19:59:32 +00002076 }else{
drhe51c44f2004-05-30 20:46:09 +00002077 zData = (char*)sqlite3BtreeDataFetch(pCrsr, &avail);
drh9188b382004-05-14 21:12:22 +00002078 }
drhe61cffc2004-06-12 18:12:15 +00002079 /* If KeyFetch()/DataFetch() managed to get the entire payload,
2080 ** save the payload in the pC->aRow cache. That will save us from
2081 ** having to make additional calls to fetch the content portion of
2082 ** the record.
2083 */
2084 if( avail>=payloadSize ){
drh2646da72005-12-09 20:02:05 +00002085 zRec = zData;
2086 pC->aRow = (u8*)zData;
drhe61cffc2004-06-12 18:12:15 +00002087 }else{
2088 pC->aRow = 0;
2089 }
drhd3194f52004-05-27 19:59:32 +00002090 }
drh588f5bc2007-01-02 18:41:54 +00002091 /* The following assert is true in all cases accept when
2092 ** the database file has been corrupted externally.
2093 ** assert( zRec!=0 || avail>=payloadSize || avail>=9 ); */
shane3f8d5cf2008-04-24 19:15:09 +00002094 szHdrSz = getVarint32((u8*)zData, offset);
drhe61cffc2004-06-12 18:12:15 +00002095
2096 /* The KeyFetch() or DataFetch() above are fast and will get the entire
2097 ** record header in most cases. But they will fail to get the complete
2098 ** record header if the record header does not fit on a single page
2099 ** in the B-Tree. When that happens, use sqlite3VdbeMemFromBtree() to
2100 ** acquire the complete header text.
2101 */
danielk1977dedf45b2006-01-13 17:12:01 +00002102 if( !zRec && avail<offset ){
danielk1977a7a8e142008-02-13 18:25:27 +00002103 sMem.flags = 0;
2104 sMem.db = 0;
drhb21c8cd2007-08-21 19:33:56 +00002105 rc = sqlite3VdbeMemFromBtree(pCrsr, 0, offset, pC->isIndex, &sMem);
danielk197784ac9d02004-05-18 09:58:06 +00002106 if( rc!=SQLITE_OK ){
danielk19773c9cc8d2005-01-17 03:40:08 +00002107 goto op_column_out;
drh9188b382004-05-14 21:12:22 +00002108 }
drhb6f54522004-05-20 02:42:16 +00002109 zData = sMem.z;
drh9188b382004-05-14 21:12:22 +00002110 }
drh0ac07192006-02-10 14:02:07 +00002111 zEndHdr = (u8 *)&zData[offset];
2112 zIdx = (u8 *)&zData[szHdrSz];
drh9188b382004-05-14 21:12:22 +00002113
drhd3194f52004-05-27 19:59:32 +00002114 /* Scan the header and use it to fill in the aType[] and aOffset[]
2115 ** arrays. aType[i] will contain the type integer for the i-th
2116 ** column and aOffset[i] will contain the offset from the beginning
2117 ** of the record to the start of the data for the i-th column
drh9188b382004-05-14 21:12:22 +00002118 */
danielk1977dedf45b2006-01-13 17:12:01 +00002119 for(i=0; i<nField; i++){
2120 if( zIdx<zEndHdr ){
2121 aOffset[i] = offset;
shane3f8d5cf2008-04-24 19:15:09 +00002122 zIdx += getVarint32(zIdx, aType[i]);
danielk1977dedf45b2006-01-13 17:12:01 +00002123 offset += sqlite3VdbeSerialTypeLen(aType[i]);
2124 }else{
2125 /* If i is less that nField, then there are less fields in this
2126 ** record than SetNumColumns indicated there are columns in the
2127 ** table. Set the offset for any extra columns not present in
drh9cbf3422008-01-17 16:22:13 +00002128 ** the record to 0. This tells code below to store a NULL
2129 ** instead of deserializing a value from the record.
danielk1977dedf45b2006-01-13 17:12:01 +00002130 */
2131 aOffset[i] = 0;
2132 }
drh9188b382004-05-14 21:12:22 +00002133 }
danielk19775f096132008-03-28 15:44:09 +00002134 sqlite3VdbeMemRelease(&sMem);
drhd3194f52004-05-27 19:59:32 +00002135 sMem.flags = MEM_Null;
2136
danielk19779792eef2006-01-13 15:58:43 +00002137 /* If we have read more header data than was contained in the header,
2138 ** or if the end of the last field appears to be past the end of the
shane2ca8bc02008-05-07 18:59:28 +00002139 ** record, or if the end of the last field appears to be before the end
2140 ** of the record (when all fields present), then we must be dealing
2141 ** with a corrupt database.
drhd3194f52004-05-27 19:59:32 +00002142 */
shane2ca8bc02008-05-07 18:59:28 +00002143 if( zIdx>zEndHdr || offset>payloadSize || (zIdx==zEndHdr && offset!=payloadSize) ){
drh49285702005-09-17 15:20:26 +00002144 rc = SQLITE_CORRUPT_BKPT;
danielk19773c9cc8d2005-01-17 03:40:08 +00002145 goto op_column_out;
drhd3194f52004-05-27 19:59:32 +00002146 }
danielk1977cfcdaef2004-05-12 07:33:33 +00002147 }
danielk1977192ac1d2004-05-10 07:17:30 +00002148
danielk197736963fd2005-02-19 08:18:05 +00002149 /* Get the column information. If aOffset[p2] is non-zero, then
2150 ** deserialize the value from the record. If aOffset[p2] is zero,
2151 ** then there are not enough fields in the record to satisfy the
drh66a51672008-01-03 00:01:23 +00002152 ** request. In this case, set the value NULL or to P4 if P4 is
drh29dda4a2005-07-21 18:23:20 +00002153 ** a pointer to a Mem object.
drh9188b382004-05-14 21:12:22 +00002154 */
danielk197736963fd2005-02-19 08:18:05 +00002155 if( aOffset[p2] ){
2156 assert( rc==SQLITE_OK );
2157 if( zRec ){
danielk1977a7a8e142008-02-13 18:25:27 +00002158 if( pDest->flags&MEM_Dyn ){
2159 sqlite3VdbeSerialGet((u8 *)&zRec[aOffset[p2]], aType[p2], &sMem);
2160 sMem.db = db;
danielk19775f096132008-03-28 15:44:09 +00002161 rc = sqlite3VdbeMemCopy(pDest, &sMem);
danielk1977a7a8e142008-02-13 18:25:27 +00002162 assert( !(sMem.flags&MEM_Dyn) );
danielk19775f096132008-03-28 15:44:09 +00002163 if( rc!=SQLITE_OK ){
2164 goto op_column_out;
2165 }
danielk1977a7a8e142008-02-13 18:25:27 +00002166 }else{
2167 sqlite3VdbeSerialGet((u8 *)&zRec[aOffset[p2]], aType[p2], pDest);
2168 }
danielk197736963fd2005-02-19 08:18:05 +00002169 }else{
2170 len = sqlite3VdbeSerialTypeLen(aType[p2]);
danielk1977a7a8e142008-02-13 18:25:27 +00002171 sqlite3VdbeMemMove(&sMem, pDest);
drhb21c8cd2007-08-21 19:33:56 +00002172 rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, pC->isIndex, &sMem);
danielk197736963fd2005-02-19 08:18:05 +00002173 if( rc!=SQLITE_OK ){
2174 goto op_column_out;
2175 }
2176 zData = sMem.z;
danielk1977a7a8e142008-02-13 18:25:27 +00002177 sqlite3VdbeSerialGet((u8*)zData, aType[p2], pDest);
danielk19777701e812005-01-10 12:59:51 +00002178 }
drhd4e70eb2008-01-02 00:34:36 +00002179 pDest->enc = encoding;
danielk197736963fd2005-02-19 08:18:05 +00002180 }else{
danielk197760585dd2008-01-03 08:08:40 +00002181 if( pOp->p4type==P4_MEM ){
danielk19772dca4ac2008-01-03 11:50:29 +00002182 sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static);
danielk1977aee18ef2005-03-09 12:26:50 +00002183 }else{
danielk1977a7a8e142008-02-13 18:25:27 +00002184 assert( pDest->flags&MEM_Null );
danielk1977aee18ef2005-03-09 12:26:50 +00002185 }
danielk1977cfcdaef2004-05-12 07:33:33 +00002186 }
drhfebe1062004-08-28 18:17:48 +00002187
2188 /* If we dynamically allocated space to hold the data (in the
2189 ** sqlite3VdbeMemFromBtree() call above) then transfer control of that
drhd4e70eb2008-01-02 00:34:36 +00002190 ** dynamically allocated space over to the pDest structure.
drhfebe1062004-08-28 18:17:48 +00002191 ** This prevents a memory copy.
2192 */
danielk19775f096132008-03-28 15:44:09 +00002193 if( sMem.zMalloc ){
2194 assert( sMem.z==sMem.zMalloc );
danielk1977a7a8e142008-02-13 18:25:27 +00002195 assert( !(pDest->flags & MEM_Dyn) );
2196 assert( !(pDest->flags & (MEM_Blob|MEM_Str)) || pDest->z==sMem.z );
2197 pDest->flags &= ~(MEM_Ephem|MEM_Static);
danielk19775f096132008-03-28 15:44:09 +00002198 pDest->flags |= MEM_Term;
danielk1977a7a8e142008-02-13 18:25:27 +00002199 pDest->z = sMem.z;
danielk19775f096132008-03-28 15:44:09 +00002200 pDest->zMalloc = sMem.zMalloc;
danielk1977b1bc9532004-05-22 03:05:33 +00002201 }
drhfebe1062004-08-28 18:17:48 +00002202
drhd4e70eb2008-01-02 00:34:36 +00002203 rc = sqlite3VdbeMemMakeWriteable(pDest);
drhd3194f52004-05-27 19:59:32 +00002204
danielk19773c9cc8d2005-01-17 03:40:08 +00002205op_column_out:
drhb7654112008-01-12 12:48:07 +00002206 UPDATE_MAX_BLOBSIZE(pDest);
drh5b6afba2008-01-05 16:29:28 +00002207 REGISTER_TRACE(pOp->p3, pDest);
danielk1977192ac1d2004-05-10 07:17:30 +00002208 break;
2209}
2210
danielk1977751de562008-04-18 09:01:15 +00002211/* Opcode: Affinity P1 P2 * P4 *
2212**
2213** Apply affinities to a range of P2 registers starting with P1.
2214**
2215** P4 is a string that is P2 characters long. The nth character of the
2216** string indicates the column affinity that should be used for the nth
2217** memory cell in the range.
2218*/
2219case OP_Affinity: {
2220 char *zAffinity = pOp->p4.z;
2221 Mem *pData0 = &p->aMem[pOp->p1];
2222 Mem *pLast = &pData0[pOp->p2-1];
2223 Mem *pRec;
2224
2225 for(pRec=pData0; pRec<=pLast; pRec++){
danielk1977b790c6c2008-04-18 10:25:24 +00002226 ExpandBlob(pRec);
danielk1977751de562008-04-18 09:01:15 +00002227 applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
2228 }
2229 break;
2230}
2231
drh1db639c2008-01-17 02:36:28 +00002232/* Opcode: MakeRecord P1 P2 P3 P4 *
drh7a224de2004-06-02 01:22:02 +00002233**
drh1db639c2008-01-17 02:36:28 +00002234** Convert P2 registers beginning with P1 into a single entry
drh7a224de2004-06-02 01:22:02 +00002235** suitable for use as a data record in a database table or as a key
shane21e7feb2008-05-30 15:59:49 +00002236** in an index. The details of the format are irrelevant as long as
drh1e968a02008-03-25 00:22:21 +00002237** the OP_Column opcode can decode the record later.
2238** Refer to source code comments for the details of the record
drh7a224de2004-06-02 01:22:02 +00002239** format.
2240**
danielk1977751de562008-04-18 09:01:15 +00002241** P4 may be a string that is P2 characters long. The nth character of the
drh7a224de2004-06-02 01:22:02 +00002242** string indicates the column affinity that should be used for the nth
drh9cbf3422008-01-17 16:22:13 +00002243** field of the index key.
drh7a224de2004-06-02 01:22:02 +00002244**
drh8a512562005-11-14 22:29:05 +00002245** The mapping from character to affinity is given by the SQLITE_AFF_
2246** macros defined in sqliteInt.h.
drh7a224de2004-06-02 01:22:02 +00002247**
drh66a51672008-01-03 00:01:23 +00002248** If P4 is NULL then all index fields have the affinity NONE.
drh7f057c92005-06-24 03:53:06 +00002249*/
drh1db639c2008-01-17 02:36:28 +00002250case OP_MakeRecord: {
drhf3218fe2004-05-28 08:21:02 +00002251 /* Assuming the record contains N fields, the record format looks
2252 ** like this:
2253 **
drh7a224de2004-06-02 01:22:02 +00002254 ** ------------------------------------------------------------------------
2255 ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 |
2256 ** ------------------------------------------------------------------------
drhf3218fe2004-05-28 08:21:02 +00002257 **
drh9cbf3422008-01-17 16:22:13 +00002258 ** Data(0) is taken from register P1. Data(1) comes from register P1+1
2259 ** and so froth.
drhf3218fe2004-05-28 08:21:02 +00002260 **
2261 ** Each type field is a varint representing the serial type of the
2262 ** corresponding data element (see sqlite3VdbeSerialType()). The
drh7a224de2004-06-02 01:22:02 +00002263 ** hdr-size field is also a varint which is the offset from the beginning
2264 ** of the record to data0.
drhf3218fe2004-05-28 08:21:02 +00002265 */
drhfdf972a2007-05-02 13:30:27 +00002266 u8 *zNewRecord; /* A buffer to hold the data for the new record */
2267 Mem *pRec; /* The new record */
drh023ae032007-05-08 12:12:16 +00002268 u64 nData = 0; /* Number of bytes of data space */
danielk1977ededfd52004-06-17 07:53:01 +00002269 int nHdr = 0; /* Number of bytes of header space */
drh023ae032007-05-08 12:12:16 +00002270 u64 nByte = 0; /* Data space required for this record */
drhfdf972a2007-05-02 13:30:27 +00002271 int nZero = 0; /* Number of zero bytes at the end of the record */
drhcb9882a2005-03-17 03:15:40 +00002272 int nVarint; /* Number of bytes in a varint */
danielk1977ededfd52004-06-17 07:53:01 +00002273 u32 serial_type; /* Type field */
drh1db639c2008-01-17 02:36:28 +00002274 Mem *pData0; /* First field to be combined into the record */
2275 Mem *pLast; /* Last field of the record */
danielk1977ededfd52004-06-17 07:53:01 +00002276 int nField; /* Number of fields in the record */
danielk1977ededfd52004-06-17 07:53:01 +00002277 char *zAffinity; /* The affinity string for the record */
drhd946db02005-12-29 19:23:06 +00002278 int file_format; /* File format to use for encoding */
drhfdf972a2007-05-02 13:30:27 +00002279 int i; /* Space used in zNewRecord[] */
danielk1977ededfd52004-06-17 07:53:01 +00002280
drh1db639c2008-01-17 02:36:28 +00002281 nField = pOp->p1;
danielk19772dca4ac2008-01-03 11:50:29 +00002282 zAffinity = pOp->p4.z;
drh1db639c2008-01-17 02:36:28 +00002283 assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=p->nMem );
2284 pData0 = &p->aMem[nField];
2285 nField = pOp->p2;
2286 pLast = &pData0[nField-1];
drhd946db02005-12-29 19:23:06 +00002287 file_format = p->minWriteFileFormat;
danielk19778d059842004-05-12 11:24:02 +00002288
drhf3218fe2004-05-28 08:21:02 +00002289 /* Loop through the elements that will make up the record to figure
2290 ** out how much space is required for the new record.
danielk19778d059842004-05-12 11:24:02 +00002291 */
drha2a49dc2008-01-02 14:28:13 +00002292 for(pRec=pData0; pRec<=pLast; pRec++){
drhae7e1512007-05-02 16:51:59 +00002293 int len;
drhd3d39e92004-05-20 22:16:29 +00002294 if( zAffinity ){
drhb21c8cd2007-08-21 19:33:56 +00002295 applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
drhd3d39e92004-05-20 22:16:29 +00002296 }
danielk1977d908f5a2007-05-11 07:08:28 +00002297 if( pRec->flags&MEM_Zero && pRec->n>0 ){
drha05a7222008-01-19 03:35:58 +00002298 sqlite3VdbeMemExpandBlob(pRec);
danielk1977d908f5a2007-05-11 07:08:28 +00002299 }
drhd946db02005-12-29 19:23:06 +00002300 serial_type = sqlite3VdbeSerialType(pRec, file_format);
drhae7e1512007-05-02 16:51:59 +00002301 len = sqlite3VdbeSerialTypeLen(serial_type);
2302 nData += len;
drhf3218fe2004-05-28 08:21:02 +00002303 nHdr += sqlite3VarintLen(serial_type);
drhfdf972a2007-05-02 13:30:27 +00002304 if( pRec->flags & MEM_Zero ){
2305 /* Only pure zero-filled BLOBs can be input to this Opcode.
2306 ** We do not allow blobs with a prefix and a zero-filled tail. */
drhfdf972a2007-05-02 13:30:27 +00002307 nZero += pRec->u.i;
drhae7e1512007-05-02 16:51:59 +00002308 }else if( len ){
drhfdf972a2007-05-02 13:30:27 +00002309 nZero = 0;
2310 }
danielk19778d059842004-05-12 11:24:02 +00002311 }
danielk19773d1bfea2004-05-14 11:00:53 +00002312
drhf3218fe2004-05-28 08:21:02 +00002313 /* Add the initial header varint and total the size */
drhcb9882a2005-03-17 03:15:40 +00002314 nHdr += nVarint = sqlite3VarintLen(nHdr);
2315 if( nVarint<sqlite3VarintLen(nHdr) ){
2316 nHdr++;
2317 }
drhfdf972a2007-05-02 13:30:27 +00002318 nByte = nHdr+nData-nZero;
drhbb4957f2008-03-20 14:03:29 +00002319 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh023ae032007-05-08 12:12:16 +00002320 goto too_big;
2321 }
drhf3218fe2004-05-28 08:21:02 +00002322
danielk1977a7a8e142008-02-13 18:25:27 +00002323 /* Make sure the output register has a buffer large enough to store
2324 ** the new record. The output register (pOp->p3) is not allowed to
2325 ** be one of the input registers (because the following call to
2326 ** sqlite3VdbeMemGrow() could clobber the value before it is used).
2327 */
2328 assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 );
2329 pOut = &p->aMem[pOp->p3];
2330 if( sqlite3VdbeMemGrow(pOut, nByte, 0) ){
2331 goto no_mem;
danielk19778d059842004-05-12 11:24:02 +00002332 }
danielk1977a7a8e142008-02-13 18:25:27 +00002333 zNewRecord = (u8 *)pOut->z;
drhf3218fe2004-05-28 08:21:02 +00002334
2335 /* Write the record */
shane3f8d5cf2008-04-24 19:15:09 +00002336 i = putVarint32(zNewRecord, nHdr);
drha2a49dc2008-01-02 14:28:13 +00002337 for(pRec=pData0; pRec<=pLast; pRec++){
drhd946db02005-12-29 19:23:06 +00002338 serial_type = sqlite3VdbeSerialType(pRec, file_format);
shane3f8d5cf2008-04-24 19:15:09 +00002339 i += putVarint32(&zNewRecord[i], serial_type); /* serial type */
danielk19778d059842004-05-12 11:24:02 +00002340 }
drha2a49dc2008-01-02 14:28:13 +00002341 for(pRec=pData0; pRec<=pLast; pRec++){ /* serial data */
drhfdf972a2007-05-02 13:30:27 +00002342 i += sqlite3VdbeSerialPut(&zNewRecord[i], nByte-i, pRec, file_format);
drhf3218fe2004-05-28 08:21:02 +00002343 }
drhfdf972a2007-05-02 13:30:27 +00002344 assert( i==nByte );
drhf3218fe2004-05-28 08:21:02 +00002345
drh9cbf3422008-01-17 16:22:13 +00002346 assert( pOp->p3>0 && pOp->p3<=p->nMem );
drh477df4b2008-01-05 18:48:24 +00002347 pOut->n = nByte;
danielk1977a7a8e142008-02-13 18:25:27 +00002348 pOut->flags = MEM_Blob | MEM_Dyn;
2349 pOut->xDel = 0;
drhfdf972a2007-05-02 13:30:27 +00002350 if( nZero ){
drh477df4b2008-01-05 18:48:24 +00002351 pOut->u.i = nZero;
2352 pOut->flags |= MEM_Zero;
drhfdf972a2007-05-02 13:30:27 +00002353 }
drh477df4b2008-01-05 18:48:24 +00002354 pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */
drh1013c932008-01-06 00:25:21 +00002355 REGISTER_TRACE(pOp->p3, pOut);
drhb7654112008-01-12 12:48:07 +00002356 UPDATE_MAX_BLOBSIZE(pOut);
danielk19778d059842004-05-12 11:24:02 +00002357 break;
2358}
2359
drh98757152008-01-09 23:04:12 +00002360/* Opcode: Statement P1 * * * *
drh663fc632002-02-02 18:49:19 +00002361**
drh7f0f12e2004-05-21 13:39:50 +00002362** Begin an individual statement transaction which is part of a larger
drh82ed1e52008-04-25 12:25:42 +00002363** transaction. This is needed so that the statement
drh7f0f12e2004-05-21 13:39:50 +00002364** can be rolled back after an error without having to roll back the
2365** entire transaction. The statement transaction will automatically
2366** commit when the VDBE halts.
drh001bbcb2003-03-19 03:14:00 +00002367**
drh82ed1e52008-04-25 12:25:42 +00002368** If the database connection is currently in autocommit mode (that
2369** is to say, if it is in between BEGIN and COMMIT)
2370** and if there are no other active statements on the same database
2371** connection, then this operation is a no-op. No statement transaction
2372** is needed since any error can use the normal ROLLBACK process to
2373** undo changes.
2374**
2375** If a statement transaction is started, then a statement journal file
2376** will be allocated and initialized.
2377**
drh7f0f12e2004-05-21 13:39:50 +00002378** The statement is begun on the database file with index P1. The main
drh001bbcb2003-03-19 03:14:00 +00002379** database file has an index of 0 and the file used for temporary tables
2380** has an index of 1.
drh663fc632002-02-02 18:49:19 +00002381*/
drh9cbf3422008-01-17 16:22:13 +00002382case OP_Statement: {
drha05a7222008-01-19 03:35:58 +00002383 if( db->autoCommit==0 || db->activeVdbeCnt>1 ){
2384 int i = pOp->p1;
2385 Btree *pBt;
2386 assert( i>=0 && i<db->nDb );
2387 assert( db->aDb[i].pBt!=0 );
2388 pBt = db->aDb[i].pBt;
danielk19771d850a72004-05-31 08:26:49 +00002389 assert( sqlite3BtreeIsInTrans(pBt) );
drhfb982642007-08-30 01:19:59 +00002390 assert( (p->btreeMask & (1<<i))!=0 );
danielk19771d850a72004-05-31 08:26:49 +00002391 if( !sqlite3BtreeIsInStmt(pBt) ){
2392 rc = sqlite3BtreeBeginStmt(pBt);
danielk1977182c4ba2007-06-27 15:53:34 +00002393 p->openedStatement = 1;
danielk19771d850a72004-05-31 08:26:49 +00002394 }
2395 }
2396 break;
2397}
2398
drh98757152008-01-09 23:04:12 +00002399/* Opcode: AutoCommit P1 P2 * * *
danielk19771d850a72004-05-31 08:26:49 +00002400**
2401** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll
danielk197746c43ed2004-06-30 06:30:25 +00002402** back any currently active btree transactions. If there are any active
2403** VMs (apart from this one), then the COMMIT or ROLLBACK statement fails.
drh92f02c32004-09-02 14:57:08 +00002404**
2405** This instruction causes the VM to halt.
danielk19771d850a72004-05-31 08:26:49 +00002406*/
drh9cbf3422008-01-17 16:22:13 +00002407case OP_AutoCommit: {
danielk19771d850a72004-05-31 08:26:49 +00002408 u8 i = pOp->p1;
2409 u8 rollback = pOp->p2;
2410
2411 assert( i==1 || i==0 );
2412 assert( i==1 || rollback==0 );
2413
drh92f02c32004-09-02 14:57:08 +00002414 assert( db->activeVdbeCnt>0 ); /* At least this one VM is active */
danielk197746c43ed2004-06-30 06:30:25 +00002415
2416 if( db->activeVdbeCnt>1 && i && !db->autoCommit ){
2417 /* If this instruction implements a COMMIT or ROLLBACK, other VMs are
2418 ** still running, and a transaction is active, return an error indicating
2419 ** that the other VMs must complete first.
2420 */
drhf089aa42008-07-08 19:34:06 +00002421 sqlite3SetString(&p->zErrMsg, db, "cannot %s transaction - "
2422 "SQL statements in progress",
2423 rollback ? "rollback" : "commit");
danielk197746c43ed2004-06-30 06:30:25 +00002424 rc = SQLITE_ERROR;
2425 }else if( i!=db->autoCommit ){
danielk19771d850a72004-05-31 08:26:49 +00002426 if( pOp->p2 ){
drh92f02c32004-09-02 14:57:08 +00002427 assert( i==1 );
danielk19771d850a72004-05-31 08:26:49 +00002428 sqlite3RollbackAll(db);
danielk1977f3f06bb2005-12-16 15:24:28 +00002429 db->autoCommit = 1;
2430 }else{
2431 db->autoCommit = i;
2432 if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
danielk1977f3f06bb2005-12-16 15:24:28 +00002433 p->pc = pc;
2434 db->autoCommit = 1-i;
drh900b31e2007-08-28 02:27:51 +00002435 p->rc = rc = SQLITE_BUSY;
2436 goto vdbe_return;
danielk1977f3f06bb2005-12-16 15:24:28 +00002437 }
danielk19771d850a72004-05-31 08:26:49 +00002438 }
drh83968c42007-04-18 16:45:24 +00002439 if( p->rc==SQLITE_OK ){
drh900b31e2007-08-28 02:27:51 +00002440 rc = SQLITE_DONE;
drh83968c42007-04-18 16:45:24 +00002441 }else{
drh900b31e2007-08-28 02:27:51 +00002442 rc = SQLITE_ERROR;
drh83968c42007-04-18 16:45:24 +00002443 }
drh900b31e2007-08-28 02:27:51 +00002444 goto vdbe_return;
danielk19771d850a72004-05-31 08:26:49 +00002445 }else{
drhf089aa42008-07-08 19:34:06 +00002446 sqlite3SetString(&p->zErrMsg, db,
danielk19771d850a72004-05-31 08:26:49 +00002447 (!i)?"cannot start a transaction within a transaction":(
2448 (rollback)?"cannot rollback - no transaction is active":
drhf089aa42008-07-08 19:34:06 +00002449 "cannot commit - no transaction is active"));
danielk19771d850a72004-05-31 08:26:49 +00002450
2451 rc = SQLITE_ERROR;
drh663fc632002-02-02 18:49:19 +00002452 }
2453 break;
2454}
2455
drh98757152008-01-09 23:04:12 +00002456/* Opcode: Transaction P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00002457**
2458** Begin a transaction. The transaction ends when a Commit or Rollback
drh663fc632002-02-02 18:49:19 +00002459** opcode is encountered. Depending on the ON CONFLICT setting, the
2460** transaction might also be rolled back if an error is encountered.
drh5e00f6c2001-09-13 13:46:56 +00002461**
drh001bbcb2003-03-19 03:14:00 +00002462** P1 is the index of the database file on which the transaction is
2463** started. Index 0 is the main database file and index 1 is the
drh60a713c2008-01-21 16:22:45 +00002464** file used for temporary tables. Indices of 2 or more are used for
2465** attached databases.
drhcabb0812002-09-14 13:47:32 +00002466**
drh80242052004-06-09 00:48:12 +00002467** If P2 is non-zero, then a write-transaction is started. A RESERVED lock is
danielk1977ee5741e2004-05-31 10:01:34 +00002468** obtained on the database file when a write-transaction is started. No
drh80242052004-06-09 00:48:12 +00002469** other process can start another write transaction while this transaction is
2470** underway. Starting a write transaction also creates a rollback journal. A
2471** write transaction must be started before any changes can be made to the
drh684917c2004-10-05 02:41:42 +00002472** database. If P2 is 2 or greater then an EXCLUSIVE lock is also obtained
2473** on the file.
danielk1977ee5741e2004-05-31 10:01:34 +00002474**
2475** If P2 is zero, then a read-lock is obtained on the database file.
drh5e00f6c2001-09-13 13:46:56 +00002476*/
drh9cbf3422008-01-17 16:22:13 +00002477case OP_Transaction: {
drh001bbcb2003-03-19 03:14:00 +00002478 int i = pOp->p1;
danielk19771d850a72004-05-31 08:26:49 +00002479 Btree *pBt;
2480
drh8bf8dc92003-05-17 17:35:10 +00002481 assert( i>=0 && i<db->nDb );
drhfb982642007-08-30 01:19:59 +00002482 assert( (p->btreeMask & (1<<i))!=0 );
danielk19771d850a72004-05-31 08:26:49 +00002483 pBt = db->aDb[i].pBt;
2484
danielk197724162fe2004-06-04 06:22:00 +00002485 if( pBt ){
danielk197740b38dc2004-06-26 08:38:24 +00002486 rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
danielk197724162fe2004-06-04 06:22:00 +00002487 if( rc==SQLITE_BUSY ){
danielk19772a764eb2004-06-12 01:43:26 +00002488 p->pc = pc;
drh900b31e2007-08-28 02:27:51 +00002489 p->rc = rc = SQLITE_BUSY;
drh900b31e2007-08-28 02:27:51 +00002490 goto vdbe_return;
danielk197724162fe2004-06-04 06:22:00 +00002491 }
danielk19772ef68482008-07-07 17:13:08 +00002492 if( rc!=SQLITE_OK && rc!=SQLITE_READONLY /* && rc!=SQLITE_BUSY */ ){
danielk197724162fe2004-06-04 06:22:00 +00002493 goto abort_due_to_error;
drh90bfcda2001-09-23 19:46:51 +00002494 }
drhb86ccfb2003-01-28 23:13:10 +00002495 }
drh5e00f6c2001-09-13 13:46:56 +00002496 break;
2497}
2498
drhb1fdb2a2008-01-05 04:06:03 +00002499/* Opcode: ReadCookie P1 P2 P3 * *
drh50e5dad2001-09-15 00:57:28 +00002500**
drh9cbf3422008-01-17 16:22:13 +00002501** Read cookie number P3 from database P1 and write it into register P2.
drh4c583122008-01-04 22:01:03 +00002502** P3==0 is the schema version. P3==1 is the database format.
2503** P3==2 is the recommended pager cache size, and so forth. P1==0 is
drh001bbcb2003-03-19 03:14:00 +00002504** the main database file and P1==1 is the database file used to store
2505** temporary tables.
drh4a324312001-12-21 14:30:42 +00002506**
danielk1977418899a2007-06-24 10:14:00 +00002507** If P1 is negative, then this is a request to read the size of a
drh4c583122008-01-04 22:01:03 +00002508** databases free-list. P3 must be set to 1 in this case. The actual
danielk1977418899a2007-06-24 10:14:00 +00002509** database accessed is ((P1+1)*-1). For example, a P1 parameter of -1
danielk1977d62e76c2007-06-24 16:11:03 +00002510** corresponds to database 0 ("main"), a P1 of -2 is database 1 ("temp").
danielk1977418899a2007-06-24 10:14:00 +00002511**
drh50e5dad2001-09-15 00:57:28 +00002512** There must be a read-lock on the database (either a transaction
drhb19a2bc2001-09-16 00:13:26 +00002513** must be started or there must be an open cursor) before
drh50e5dad2001-09-15 00:57:28 +00002514** executing this instruction.
2515*/
drh4c583122008-01-04 22:01:03 +00002516case OP_ReadCookie: { /* out2-prerelease */
drhf328bc82004-05-10 23:29:49 +00002517 int iMeta;
danielk1977180b56a2007-06-24 08:00:42 +00002518 int iDb = pOp->p1;
drh4c583122008-01-04 22:01:03 +00002519 int iCookie = pOp->p3;
danielk1977180b56a2007-06-24 08:00:42 +00002520
drhb7654112008-01-12 12:48:07 +00002521 assert( pOp->p3<SQLITE_N_BTREE_META );
danielk1977180b56a2007-06-24 08:00:42 +00002522 if( iDb<0 ){
2523 iDb = (-1*(iDb+1));
2524 iCookie *= -1;
2525 }
2526 assert( iDb>=0 && iDb<db->nDb );
2527 assert( db->aDb[iDb].pBt!=0 );
drhfb982642007-08-30 01:19:59 +00002528 assert( (p->btreeMask & (1<<iDb))!=0 );
drha3b321d2004-05-11 09:31:31 +00002529 /* The indexing of meta values at the schema layer is off by one from
2530 ** the indexing in the btree layer. The btree considers meta[0] to
2531 ** be the number of free pages in the database (a read-only value)
2532 ** and meta[1] to be the schema cookie. The schema layer considers
2533 ** meta[1] to be the schema cookie. So we have to shift the index
2534 ** by one in the following statement.
2535 */
danielk1977180b56a2007-06-24 08:00:42 +00002536 rc = sqlite3BtreeGetMeta(db->aDb[iDb].pBt, 1 + iCookie, (u32 *)&iMeta);
drh4c583122008-01-04 22:01:03 +00002537 pOut->u.i = iMeta;
danielk1977a7a8e142008-02-13 18:25:27 +00002538 MemSetTypeFlag(pOut, MEM_Int);
drh50e5dad2001-09-15 00:57:28 +00002539 break;
2540}
2541
drh98757152008-01-09 23:04:12 +00002542/* Opcode: SetCookie P1 P2 P3 * *
drh50e5dad2001-09-15 00:57:28 +00002543**
drh98757152008-01-09 23:04:12 +00002544** Write the content of register P3 (interpreted as an integer)
2545** into cookie number P2 of database P1.
drh001bbcb2003-03-19 03:14:00 +00002546** P2==0 is the schema version. P2==1 is the database format.
2547** P2==2 is the recommended pager cache size, and so forth. P1==0 is
2548** the main database file and P1==1 is the database file used to store
2549** temporary tables.
drh50e5dad2001-09-15 00:57:28 +00002550**
2551** A transaction must be started before executing this opcode.
2552*/
drh9cbf3422008-01-17 16:22:13 +00002553case OP_SetCookie: { /* in3 */
drh3f7d4e42004-07-24 14:35:58 +00002554 Db *pDb;
drh4a324312001-12-21 14:30:42 +00002555 assert( pOp->p2<SQLITE_N_BTREE_META );
drh001bbcb2003-03-19 03:14:00 +00002556 assert( pOp->p1>=0 && pOp->p1<db->nDb );
drhfb982642007-08-30 01:19:59 +00002557 assert( (p->btreeMask & (1<<pOp->p1))!=0 );
drh3f7d4e42004-07-24 14:35:58 +00002558 pDb = &db->aDb[pOp->p1];
2559 assert( pDb->pBt!=0 );
drh98757152008-01-09 23:04:12 +00002560 sqlite3VdbeMemIntegerify(pIn3);
drha3b321d2004-05-11 09:31:31 +00002561 /* See note about index shifting on OP_ReadCookie */
drh98757152008-01-09 23:04:12 +00002562 rc = sqlite3BtreeUpdateMeta(pDb->pBt, 1+pOp->p2, (int)pIn3->u.i);
drh3f7d4e42004-07-24 14:35:58 +00002563 if( pOp->p2==0 ){
2564 /* When the schema cookie changes, record the new cookie internally */
drh98757152008-01-09 23:04:12 +00002565 pDb->pSchema->schema_cookie = pIn3->u.i;
drh3f7d4e42004-07-24 14:35:58 +00002566 db->flags |= SQLITE_InternChanges;
drhd28bcb32005-12-21 14:43:11 +00002567 }else if( pOp->p2==1 ){
2568 /* Record changes in the file format */
drh98757152008-01-09 23:04:12 +00002569 pDb->pSchema->file_format = pIn3->u.i;
drh3f7d4e42004-07-24 14:35:58 +00002570 }
drhfd426c62006-01-30 15:34:22 +00002571 if( pOp->p1==1 ){
2572 /* Invalidate all prepared statements whenever the TEMP database
2573 ** schema is changed. Ticket #1644 */
2574 sqlite3ExpirePreparedStatements(db);
2575 }
drh50e5dad2001-09-15 00:57:28 +00002576 break;
2577}
2578
drh4a324312001-12-21 14:30:42 +00002579/* Opcode: VerifyCookie P1 P2 *
drh50e5dad2001-09-15 00:57:28 +00002580**
drh001bbcb2003-03-19 03:14:00 +00002581** Check the value of global database parameter number 0 (the
2582** schema version) and make sure it is equal to P2.
2583** P1 is the database number which is 0 for the main database file
2584** and 1 for the file holding temporary tables and some higher number
2585** for auxiliary databases.
drh50e5dad2001-09-15 00:57:28 +00002586**
2587** The cookie changes its value whenever the database schema changes.
drhb19a2bc2001-09-16 00:13:26 +00002588** This operation is used to detect when that the cookie has changed
drh50e5dad2001-09-15 00:57:28 +00002589** and that the current process needs to reread the schema.
2590**
2591** Either a transaction needs to have been started or an OP_Open needs
2592** to be executed (to establish a read lock) before this opcode is
2593** invoked.
2594*/
drh9cbf3422008-01-17 16:22:13 +00002595case OP_VerifyCookie: {
drhf328bc82004-05-10 23:29:49 +00002596 int iMeta;
drhc275b4e2004-07-19 17:25:24 +00002597 Btree *pBt;
drh001bbcb2003-03-19 03:14:00 +00002598 assert( pOp->p1>=0 && pOp->p1<db->nDb );
drhfb982642007-08-30 01:19:59 +00002599 assert( (p->btreeMask & (1<<pOp->p1))!=0 );
drhc275b4e2004-07-19 17:25:24 +00002600 pBt = db->aDb[pOp->p1].pBt;
2601 if( pBt ){
2602 rc = sqlite3BtreeGetMeta(pBt, 1, (u32 *)&iMeta);
2603 }else{
2604 rc = SQLITE_OK;
2605 iMeta = 0;
2606 }
drhf328bc82004-05-10 23:29:49 +00002607 if( rc==SQLITE_OK && iMeta!=pOp->p2 ){
danielk1977a1644fd2007-08-29 12:31:25 +00002608 sqlite3_free(p->zErrMsg);
2609 p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
danielk1977896e7922007-04-17 08:32:33 +00002610 /* If the schema-cookie from the database file matches the cookie
2611 ** stored with the in-memory representation of the schema, do
2612 ** not reload the schema from the database file.
2613 **
shane21e7feb2008-05-30 15:59:49 +00002614 ** If virtual-tables are in use, this is not just an optimization.
danielk1977896e7922007-04-17 08:32:33 +00002615 ** Often, v-tables store their data in other SQLite tables, which
2616 ** are queried from within xNext() and other v-table methods using
2617 ** prepared queries. If such a query is out-of-date, we do not want to
2618 ** discard the database schema, as the user code implementing the
2619 ** v-table would have to be ready for the sqlite3_vtab structure itself
2620 ** to be invalidated whenever sqlite3_step() is called from within
2621 ** a v-table method.
2622 */
2623 if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){
2624 sqlite3ResetInternalSchema(db, pOp->p1);
2625 }
2626
drhf6d8ab82007-01-12 23:43:42 +00002627 sqlite3ExpirePreparedStatements(db);
drh50e5dad2001-09-15 00:57:28 +00002628 rc = SQLITE_SCHEMA;
2629 }
2630 break;
2631}
2632
drh98757152008-01-09 23:04:12 +00002633/* Opcode: OpenRead P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00002634**
drhecdc7532001-09-23 02:35:53 +00002635** Open a read-only cursor for the database table whose root page is
danielk1977207872a2008-01-03 07:54:23 +00002636** P2 in a database file. The database file is determined by P3.
drh60a713c2008-01-21 16:22:45 +00002637** P3==0 means the main database, P3==1 means the database used for
2638** temporary tables, and P3>1 means used the corresponding attached
2639** database. Give the new cursor an identifier of P1. The P1
danielk1977207872a2008-01-03 07:54:23 +00002640** values need not be contiguous but all P1 values should be small integers.
2641** It is an error for P1 to be negative.
drh5e00f6c2001-09-13 13:46:56 +00002642**
drh98757152008-01-09 23:04:12 +00002643** If P5!=0 then use the content of register P2 as the root page, not
2644** the value of P2 itself.
drh5edc3122001-09-13 21:53:09 +00002645**
drhb19a2bc2001-09-16 00:13:26 +00002646** There will be a read lock on the database whenever there is an
2647** open cursor. If the database was unlocked prior to this instruction
2648** then a read lock is acquired as part of this instruction. A read
2649** lock allows other processes to read the database but prohibits
2650** any other process from modifying the database. The read lock is
2651** released when all cursors are closed. If this instruction attempts
2652** to get a read lock but fails, the script terminates with an
2653** SQLITE_BUSY error code.
2654**
drh66a51672008-01-03 00:01:23 +00002655** The P4 value is a pointer to a KeyInfo structure that defines the
2656** content and collating sequence of indices. P4 is NULL for cursors
drhd3d39e92004-05-20 22:16:29 +00002657** that are not pointing to indices.
drhf57b3392001-10-08 13:22:32 +00002658**
drh001bbcb2003-03-19 03:14:00 +00002659** See also OpenWrite.
drh5e00f6c2001-09-13 13:46:56 +00002660*/
drh98757152008-01-09 23:04:12 +00002661/* Opcode: OpenWrite P1 P2 P3 P4 P5
drhecdc7532001-09-23 02:35:53 +00002662**
2663** Open a read/write cursor named P1 on the table or index whose root
drh98757152008-01-09 23:04:12 +00002664** page is P2. Or if P5!=0 use the content of register P2 to find the
2665** root page.
drhecdc7532001-09-23 02:35:53 +00002666**
drh66a51672008-01-03 00:01:23 +00002667** The P4 value is a pointer to a KeyInfo structure that defines the
2668** content and collating sequence of indices. P4 is NULL for cursors
drhd3d39e92004-05-20 22:16:29 +00002669** that are not pointing to indices.
jplyon5a564222003-06-02 06:15:58 +00002670**
drh001bbcb2003-03-19 03:14:00 +00002671** This instruction works just like OpenRead except that it opens the cursor
drhecdc7532001-09-23 02:35:53 +00002672** in read/write mode. For a given table, there can be one or more read-only
2673** cursors or a single read/write cursor but not both.
drhf57b3392001-10-08 13:22:32 +00002674**
drh001bbcb2003-03-19 03:14:00 +00002675** See also OpenRead.
drhecdc7532001-09-23 02:35:53 +00002676*/
drh9cbf3422008-01-17 16:22:13 +00002677case OP_OpenRead:
2678case OP_OpenWrite: {
drh5e00f6c2001-09-13 13:46:56 +00002679 int i = pOp->p1;
drh5edc3122001-09-13 21:53:09 +00002680 int p2 = pOp->p2;
danielk1977207872a2008-01-03 07:54:23 +00002681 int iDb = pOp->p3;
drhf57b3392001-10-08 13:22:32 +00002682 int wrFlag;
2683 Btree *pX;
drhf328bc82004-05-10 23:29:49 +00002684 Cursor *pCur;
drhd946db02005-12-29 19:23:06 +00002685 Db *pDb;
drh001bbcb2003-03-19 03:14:00 +00002686
drh6810ce62004-01-31 19:22:56 +00002687 assert( iDb>=0 && iDb<db->nDb );
drhfb982642007-08-30 01:19:59 +00002688 assert( (p->btreeMask & (1<<iDb))!=0 );
drhd946db02005-12-29 19:23:06 +00002689 pDb = &db->aDb[iDb];
2690 pX = pDb->pBt;
drh6810ce62004-01-31 19:22:56 +00002691 assert( pX!=0 );
drhd946db02005-12-29 19:23:06 +00002692 if( pOp->opcode==OP_OpenWrite ){
2693 wrFlag = 1;
danielk1977da184232006-01-05 11:34:32 +00002694 if( pDb->pSchema->file_format < p->minWriteFileFormat ){
2695 p->minWriteFileFormat = pDb->pSchema->file_format;
drhd946db02005-12-29 19:23:06 +00002696 }
2697 }else{
2698 wrFlag = 0;
2699 }
drh98757152008-01-09 23:04:12 +00002700 if( pOp->p5 ){
drh9cbf3422008-01-17 16:22:13 +00002701 assert( p2>0 );
2702 assert( p2<=p->nMem );
2703 pIn2 = &p->aMem[p2];
2704 sqlite3VdbeMemIntegerify(pIn2);
2705 p2 = pIn2->u.i;
drha6110402005-07-28 20:51:19 +00002706 assert( p2>=2 );
drh5edc3122001-09-13 21:53:09 +00002707 }
drh6810ce62004-01-31 19:22:56 +00002708 assert( i>=0 );
danielk1977cd3e8f72008-03-25 09:47:35 +00002709 pCur = allocateCursor(p, i, &pOp[-1], iDb, 1);
drh4774b132004-06-12 20:12:51 +00002710 if( pCur==0 ) goto no_mem;
drhf328bc82004-05-10 23:29:49 +00002711 pCur->nullRow = 1;
danielk1977cd3e8f72008-03-25 09:47:35 +00002712 rc = sqlite3BtreeCursor(pX, p2, wrFlag, pOp->p4.p, pCur->pCursor);
drh66a51672008-01-03 00:01:23 +00002713 if( pOp->p4type==P4_KEYINFO ){
danielk19772dca4ac2008-01-03 11:50:29 +00002714 pCur->pKeyInfo = pOp->p4.pKeyInfo;
danielk197724162fe2004-06-04 06:22:00 +00002715 pCur->pIncrKey = &pCur->pKeyInfo->incrKey;
danielk197714db2662006-01-09 16:12:04 +00002716 pCur->pKeyInfo->enc = ENC(p->db);
danielk197724162fe2004-06-04 06:22:00 +00002717 }else{
drhf0863fe2005-06-12 21:35:51 +00002718 pCur->pKeyInfo = 0;
danielk197724162fe2004-06-04 06:22:00 +00002719 pCur->pIncrKey = &pCur->bogusIncrKey;
2720 }
2721 switch( rc ){
2722 case SQLITE_BUSY: {
danielk19772a764eb2004-06-12 01:43:26 +00002723 p->pc = pc;
drh900b31e2007-08-28 02:27:51 +00002724 p->rc = rc = SQLITE_BUSY;
drh900b31e2007-08-28 02:27:51 +00002725 goto vdbe_return;
drhd3d39e92004-05-20 22:16:29 +00002726 }
danielk197724162fe2004-06-04 06:22:00 +00002727 case SQLITE_OK: {
2728 int flags = sqlite3BtreeFlags(pCur->pCursor);
drhf0863fe2005-06-12 21:35:51 +00002729 /* Sanity checking. Only the lower four bits of the flags byte should
danielk1977ad0132d2008-06-07 08:58:22 +00002730 ** be used. Bit 3 (mask 0x08) is unpredictable. The lower 3 bits
drhf0863fe2005-06-12 21:35:51 +00002731 ** (mask 0x07) should be either 5 (intkey+leafdata for tables) or
2732 ** 2 (zerodata for indices). If these conditions are not met it can
2733 ** only mean that we are dealing with a corrupt database file
2734 */
2735 if( (flags & 0xf0)!=0 || ((flags & 0x07)!=5 && (flags & 0x07)!=2) ){
drh49285702005-09-17 15:20:26 +00002736 rc = SQLITE_CORRUPT_BKPT;
drhf0863fe2005-06-12 21:35:51 +00002737 goto abort_due_to_error;
2738 }
2739 pCur->isTable = (flags & BTREE_INTKEY)!=0;
2740 pCur->isIndex = (flags & BTREE_ZERODATA)!=0;
drh66a51672008-01-03 00:01:23 +00002741 /* If P4==0 it means we are expected to open a table. If P4!=0 then
drhf0863fe2005-06-12 21:35:51 +00002742 ** we expect to be opening an index. If this is not what happened,
2743 ** then the database is corrupt
2744 */
drh66a51672008-01-03 00:01:23 +00002745 if( (pCur->isTable && pOp->p4type==P4_KEYINFO)
2746 || (pCur->isIndex && pOp->p4type!=P4_KEYINFO) ){
drh49285702005-09-17 15:20:26 +00002747 rc = SQLITE_CORRUPT_BKPT;
drhf0863fe2005-06-12 21:35:51 +00002748 goto abort_due_to_error;
2749 }
danielk197724162fe2004-06-04 06:22:00 +00002750 break;
drh5e00f6c2001-09-13 13:46:56 +00002751 }
danielk197724162fe2004-06-04 06:22:00 +00002752 case SQLITE_EMPTY: {
drh66a51672008-01-03 00:01:23 +00002753 pCur->isTable = pOp->p4type!=P4_KEYINFO;
drhf0863fe2005-06-12 21:35:51 +00002754 pCur->isIndex = !pCur->isTable;
danielk1977cd3e8f72008-03-25 09:47:35 +00002755 pCur->pCursor = 0;
danielk197724162fe2004-06-04 06:22:00 +00002756 rc = SQLITE_OK;
2757 break;
2758 }
2759 default: {
2760 goto abort_due_to_error;
2761 }
2762 }
drh5e00f6c2001-09-13 13:46:56 +00002763 break;
2764}
2765
drh98757152008-01-09 23:04:12 +00002766/* Opcode: OpenEphemeral P1 P2 * P4 *
drh5e00f6c2001-09-13 13:46:56 +00002767**
drhb9bb7c12006-06-11 23:41:55 +00002768** Open a new cursor P1 to a transient table.
drh9170dd72005-07-08 17:13:46 +00002769** The cursor is always opened read/write even if
2770** the main database is read-only. The transient or virtual
2771** table is deleted automatically when the cursor is closed.
drhc6b52df2002-01-04 03:09:29 +00002772**
drh0342b1f2005-09-01 03:07:44 +00002773** P2 is the number of columns in the virtual table.
drh66a51672008-01-03 00:01:23 +00002774** The cursor points to a BTree table if P4==0 and to a BTree index
2775** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure
drhd3d39e92004-05-20 22:16:29 +00002776** that defines the format of keys in the index.
drhb9bb7c12006-06-11 23:41:55 +00002777**
2778** This opcode was once called OpenTemp. But that created
2779** confusion because the term "temp table", might refer either
2780** to a TEMP table at the SQL level, or to a table opened by
2781** this opcode. Then this opcode was call OpenVirtual. But
2782** that created confusion with the whole virtual-table idea.
drh5e00f6c2001-09-13 13:46:56 +00002783*/
drh9cbf3422008-01-17 16:22:13 +00002784case OP_OpenEphemeral: {
drh5e00f6c2001-09-13 13:46:56 +00002785 int i = pOp->p1;
2786 Cursor *pCx;
drh33f4e022007-09-03 15:19:34 +00002787 static const int openFlags =
2788 SQLITE_OPEN_READWRITE |
2789 SQLITE_OPEN_CREATE |
2790 SQLITE_OPEN_EXCLUSIVE |
2791 SQLITE_OPEN_DELETEONCLOSE |
2792 SQLITE_OPEN_TRANSIENT_DB;
2793
drh6810ce62004-01-31 19:22:56 +00002794 assert( i>=0 );
danielk1977cd3e8f72008-03-25 09:47:35 +00002795 pCx = allocateCursor(p, i, pOp, -1, 1);
drh4774b132004-06-12 20:12:51 +00002796 if( pCx==0 ) goto no_mem;
drh17f71932002-02-21 12:01:27 +00002797 pCx->nullRow = 1;
drh33f4e022007-09-03 15:19:34 +00002798 rc = sqlite3BtreeFactory(db, 0, 1, SQLITE_DEFAULT_TEMP_CACHE_SIZE, openFlags,
2799 &pCx->pBt);
drh5e00f6c2001-09-13 13:46:56 +00002800 if( rc==SQLITE_OK ){
danielk197740b38dc2004-06-26 08:38:24 +00002801 rc = sqlite3BtreeBeginTrans(pCx->pBt, 1);
drh5e00f6c2001-09-13 13:46:56 +00002802 }
2803 if( rc==SQLITE_OK ){
danielk19774adee202004-05-08 08:23:19 +00002804 /* If a transient index is required, create it by calling
2805 ** sqlite3BtreeCreateTable() with the BTREE_ZERODATA flag before
2806 ** opening it. If a transient table is required, just use the
danielk19770dbe72b2004-05-11 04:54:49 +00002807 ** automatically created table with root-page 1 (an INTKEY table).
danielk19774adee202004-05-08 08:23:19 +00002808 */
danielk19772dca4ac2008-01-03 11:50:29 +00002809 if( pOp->p4.pKeyInfo ){
drhc6b52df2002-01-04 03:09:29 +00002810 int pgno;
drh66a51672008-01-03 00:01:23 +00002811 assert( pOp->p4type==P4_KEYINFO );
danielk19774adee202004-05-08 08:23:19 +00002812 rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_ZERODATA);
drhc6b52df2002-01-04 03:09:29 +00002813 if( rc==SQLITE_OK ){
drhf328bc82004-05-10 23:29:49 +00002814 assert( pgno==MASTER_ROOT+1 );
drh1e968a02008-03-25 00:22:21 +00002815 rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1,
danielk1977cd3e8f72008-03-25 09:47:35 +00002816 (KeyInfo*)pOp->p4.z, pCx->pCursor);
danielk19772dca4ac2008-01-03 11:50:29 +00002817 pCx->pKeyInfo = pOp->p4.pKeyInfo;
danielk197714db2662006-01-09 16:12:04 +00002818 pCx->pKeyInfo->enc = ENC(p->db);
drhd3d39e92004-05-20 22:16:29 +00002819 pCx->pIncrKey = &pCx->pKeyInfo->incrKey;
drhc6b52df2002-01-04 03:09:29 +00002820 }
drhf0863fe2005-06-12 21:35:51 +00002821 pCx->isTable = 0;
drhc6b52df2002-01-04 03:09:29 +00002822 }else{
danielk1977cd3e8f72008-03-25 09:47:35 +00002823 rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, 1, 0, pCx->pCursor);
drhf0863fe2005-06-12 21:35:51 +00002824 pCx->isTable = 1;
drhd3d39e92004-05-20 22:16:29 +00002825 pCx->pIncrKey = &pCx->bogusIncrKey;
drhc6b52df2002-01-04 03:09:29 +00002826 }
drh5e00f6c2001-09-13 13:46:56 +00002827 }
drhf0863fe2005-06-12 21:35:51 +00002828 pCx->isIndex = !pCx->isTable;
drh5e00f6c2001-09-13 13:46:56 +00002829 break;
2830}
2831
danielk19779882d992008-03-27 17:59:01 +00002832/* Opcode: OpenPseudo P1 P2 * * *
drh70ce3f02003-04-15 19:22:22 +00002833**
2834** Open a new cursor that points to a fake table that contains a single
2835** row of data. Any attempt to write a second row of data causes the
2836** first row to be deleted. All data is deleted when the cursor is
2837** closed.
2838**
2839** A pseudo-table created by this opcode is useful for holding the
drhcdd536f2006-03-17 00:04:03 +00002840** NEW or OLD tables in a trigger. Also used to hold the a single
2841** row output from the sorter so that the row can be decomposed into
2842** individual columns using the OP_Column opcode.
danielk19779882d992008-03-27 17:59:01 +00002843**
2844** When OP_Insert is executed to insert a row in to the pseudo table,
2845** the pseudo-table cursor may or may not make it's own copy of the
2846** original row data. If P2 is 0, then the pseudo-table will copy the
2847** original row data. Otherwise, a pointer to the original memory cell
2848** is stored. In this case, the vdbe program must ensure that the
2849** memory cell containing the row data is not overwritten until the
2850** pseudo table is closed (or a new row is inserted into it).
drh70ce3f02003-04-15 19:22:22 +00002851*/
drh9cbf3422008-01-17 16:22:13 +00002852case OP_OpenPseudo: {
drh70ce3f02003-04-15 19:22:22 +00002853 int i = pOp->p1;
2854 Cursor *pCx;
drh6810ce62004-01-31 19:22:56 +00002855 assert( i>=0 );
danielk1977cd3e8f72008-03-25 09:47:35 +00002856 pCx = allocateCursor(p, i, &pOp[-1], -1, 0);
drh4774b132004-06-12 20:12:51 +00002857 if( pCx==0 ) goto no_mem;
drh70ce3f02003-04-15 19:22:22 +00002858 pCx->nullRow = 1;
2859 pCx->pseudoTable = 1;
danielk19779882d992008-03-27 17:59:01 +00002860 pCx->ephemPseudoTable = pOp->p2;
drhd3d39e92004-05-20 22:16:29 +00002861 pCx->pIncrKey = &pCx->bogusIncrKey;
drhf0863fe2005-06-12 21:35:51 +00002862 pCx->isTable = 1;
2863 pCx->isIndex = 0;
drh70ce3f02003-04-15 19:22:22 +00002864 break;
2865}
2866
drh98757152008-01-09 23:04:12 +00002867/* Opcode: Close P1 * * * *
drh5e00f6c2001-09-13 13:46:56 +00002868**
2869** Close a cursor previously opened as P1. If P1 is not
2870** currently open, this instruction is a no-op.
2871*/
drh9cbf3422008-01-17 16:22:13 +00002872case OP_Close: {
drh5e00f6c2001-09-13 13:46:56 +00002873 int i = pOp->p1;
drha05a7222008-01-19 03:35:58 +00002874 assert( i>=0 && i<p->nCursor );
2875 sqlite3VdbeFreeCursor(p, p->apCsr[i]);
2876 p->apCsr[i] = 0;
drh5e00f6c2001-09-13 13:46:56 +00002877 break;
2878}
2879
danielk1977b790c6c2008-04-18 10:25:24 +00002880/* Opcode: MoveGe P1 P2 P3 P4 *
drh5e00f6c2001-09-13 13:46:56 +00002881**
danielk1977b790c6c2008-04-18 10:25:24 +00002882** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
2883** use the integer value in register P3 as a key. If cursor P1 refers
2884** to an SQL index, then P3 is the first in an array of P4 registers
2885** that are used as an unpacked index key.
2886**
2887** Reposition cursor P1 so that it points to the smallest entry that
2888** is greater than or equal to the key value. If there are no records
2889** greater than or equal to the key and P2 is not zero, then jump to P2.
drh7cf6e4d2004-05-19 14:56:55 +00002890**
drh91fd4d42008-01-19 20:11:25 +00002891** A special feature of this opcode (and different from the
2892** related OP_MoveGt, OP_MoveLt, and OP_MoveLe) is that if P2 is
2893** zero and P1 is an SQL table (a b-tree with integer keys) then
2894** the seek is deferred until it is actually needed. It might be
2895** the case that the cursor is never accessed. By deferring the
2896** seek, we avoid unnecessary seeks.
2897**
drh7cf6e4d2004-05-19 14:56:55 +00002898** See also: Found, NotFound, Distinct, MoveLt, MoveGt, MoveLe
2899*/
danielk1977b790c6c2008-04-18 10:25:24 +00002900/* Opcode: MoveGt P1 P2 P3 P4 *
drh7cf6e4d2004-05-19 14:56:55 +00002901**
danielk1977b790c6c2008-04-18 10:25:24 +00002902** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
2903** use the integer value in register P3 as a key. If cursor P1 refers
2904** to an SQL index, then P3 is the first in an array of P4 registers
2905** that are used as an unpacked index key.
2906**
2907** Reposition cursor P1 so that it points to the smallest entry that
2908** is greater than the key value. If there are no records greater than
2909** the key and P2 is not zero, then jump to P2.
drhb19a2bc2001-09-16 00:13:26 +00002910**
drh7cf6e4d2004-05-19 14:56:55 +00002911** See also: Found, NotFound, Distinct, MoveLt, MoveGe, MoveLe
drh5e00f6c2001-09-13 13:46:56 +00002912*/
danielk1977b790c6c2008-04-18 10:25:24 +00002913/* Opcode: MoveLt P1 P2 P3 P4 *
drhc045ec52002-12-04 20:01:06 +00002914**
danielk1977b790c6c2008-04-18 10:25:24 +00002915** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
2916** use the integer value in register P3 as a key. If cursor P1 refers
2917** to an SQL index, then P3 is the first in an array of P4 registers
2918** that are used as an unpacked index key.
2919**
2920** Reposition cursor P1 so that it points to the largest entry that
2921** is less than the key value. If there are no records less than
2922** the key and P2 is not zero, then jump to P2.
drhc045ec52002-12-04 20:01:06 +00002923**
drh7cf6e4d2004-05-19 14:56:55 +00002924** See also: Found, NotFound, Distinct, MoveGt, MoveGe, MoveLe
2925*/
danielk1977751de562008-04-18 09:01:15 +00002926/* Opcode: MoveLe P1 P2 P3 P4 *
danielk19773d1bfea2004-05-14 11:00:53 +00002927**
danielk1977b790c6c2008-04-18 10:25:24 +00002928** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
2929** use the integer value in register P3 as a key. If cursor P1 refers
2930** to an SQL index, then P3 is the first in an array of P4 registers
2931** that are used as an unpacked index key.
danielk1977751de562008-04-18 09:01:15 +00002932**
danielk1977b790c6c2008-04-18 10:25:24 +00002933** Reposition cursor P1 so that it points to the largest entry that
2934** is less than or equal to the key value. If there are no records
2935** less than or equal to the key and P2 is not zero, then jump to P2.
drh7cf6e4d2004-05-19 14:56:55 +00002936**
2937** See also: Found, NotFound, Distinct, MoveGt, MoveGe, MoveLt
drhc045ec52002-12-04 20:01:06 +00002938*/
drh9cbf3422008-01-17 16:22:13 +00002939case OP_MoveLt: /* jump, in3 */
2940case OP_MoveLe: /* jump, in3 */
2941case OP_MoveGe: /* jump, in3 */
2942case OP_MoveGt: { /* jump, in3 */
drh5e00f6c2001-09-13 13:46:56 +00002943 int i = pOp->p1;
drh80ff32f2001-11-04 18:32:46 +00002944 Cursor *pC;
2945
drh70ce3f02003-04-15 19:22:22 +00002946 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00002947 pC = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00002948 assert( pC!=0 );
drh70ce3f02003-04-15 19:22:22 +00002949 if( pC->pCursor!=0 ){
drhc045ec52002-12-04 20:01:06 +00002950 int res, oc;
drh7cf6e4d2004-05-19 14:56:55 +00002951 oc = pOp->opcode;
drha11846b2004-01-07 18:52:56 +00002952 pC->nullRow = 0;
drhd3d39e92004-05-20 22:16:29 +00002953 *pC->pIncrKey = oc==OP_MoveGt || oc==OP_MoveLe;
drhf0863fe2005-06-12 21:35:51 +00002954 if( pC->isTable ){
drh98757152008-01-09 23:04:12 +00002955 i64 iKey = sqlite3VdbeIntValue(pIn3);
drh91fd4d42008-01-19 20:11:25 +00002956 if( pOp->p2==0 ){
2957 assert( pOp->opcode==OP_MoveGe );
drha11846b2004-01-07 18:52:56 +00002958 pC->movetoTarget = iKey;
drh91fd4d42008-01-19 20:11:25 +00002959 pC->rowidIsValid = 0;
drha11846b2004-01-07 18:52:56 +00002960 pC->deferredMoveto = 1;
drha11846b2004-01-07 18:52:56 +00002961 break;
2962 }
drhe14006d2008-03-25 17:23:32 +00002963 rc = sqlite3BtreeMoveto(pC->pCursor, 0, 0, (u64)iKey, 0, &res);
danielk197728129562005-01-11 10:25:06 +00002964 if( rc!=SQLITE_OK ){
2965 goto abort_due_to_error;
2966 }
drh98757152008-01-09 23:04:12 +00002967 pC->lastRowid = iKey;
drhf0863fe2005-06-12 21:35:51 +00002968 pC->rowidIsValid = res==0;
drh5e00f6c2001-09-13 13:46:56 +00002969 }else{
danielk1977b790c6c2008-04-18 10:25:24 +00002970 UnpackedRecord r;
2971 int nField = pOp->p4.i;
2972 assert( pOp->p4type==P4_INT32 );
2973 assert( nField>0 );
2974 r.pKeyInfo = pC->pKeyInfo;
2975 r.nField = nField;
2976 r.needFree = 0;
2977 r.needDestroy = 0;
2978 r.aMem = &p->aMem[pOp->p3];
2979 rc = sqlite3BtreeMoveto(pC->pCursor, 0, &r, 0, 0, &res);
danielk197728129562005-01-11 10:25:06 +00002980 if( rc!=SQLITE_OK ){
2981 goto abort_due_to_error;
2982 }
drhf0863fe2005-06-12 21:35:51 +00002983 pC->rowidIsValid = 0;
drh5e00f6c2001-09-13 13:46:56 +00002984 }
drha11846b2004-01-07 18:52:56 +00002985 pC->deferredMoveto = 0;
drh76873ab2006-01-07 18:48:26 +00002986 pC->cacheStatus = CACHE_STALE;
drhd3d39e92004-05-20 22:16:29 +00002987 *pC->pIncrKey = 0;
drh0f7eb612006-08-08 13:51:43 +00002988#ifdef SQLITE_TEST
danielk19776f8a5032004-05-10 10:34:51 +00002989 sqlite3_search_count++;
drh0f7eb612006-08-08 13:51:43 +00002990#endif
drh7cf6e4d2004-05-19 14:56:55 +00002991 if( oc==OP_MoveGe || oc==OP_MoveGt ){
2992 if( res<0 ){
danielk197728129562005-01-11 10:25:06 +00002993 rc = sqlite3BtreeNext(pC->pCursor, &res);
danielk197701427a62005-01-11 13:02:33 +00002994 if( rc!=SQLITE_OK ) goto abort_due_to_error;
drhf0863fe2005-06-12 21:35:51 +00002995 pC->rowidIsValid = 0;
drh1af3fdb2004-07-18 21:33:01 +00002996 }else{
2997 res = 0;
drh8721ce42001-11-07 14:22:00 +00002998 }
drh7cf6e4d2004-05-19 14:56:55 +00002999 }else{
3000 assert( oc==OP_MoveLt || oc==OP_MoveLe );
drh1a844c32002-12-04 22:29:28 +00003001 if( res>=0 ){
danielk197701427a62005-01-11 13:02:33 +00003002 rc = sqlite3BtreePrevious(pC->pCursor, &res);
3003 if( rc!=SQLITE_OK ) goto abort_due_to_error;
drhf0863fe2005-06-12 21:35:51 +00003004 pC->rowidIsValid = 0;
drh1a844c32002-12-04 22:29:28 +00003005 }else{
3006 /* res might be negative because the table is empty. Check to
3007 ** see if this is the case.
3008 */
drhf328bc82004-05-10 23:29:49 +00003009 res = sqlite3BtreeEof(pC->pCursor);
drh1a844c32002-12-04 22:29:28 +00003010 }
drh1af3fdb2004-07-18 21:33:01 +00003011 }
drh91fd4d42008-01-19 20:11:25 +00003012 assert( pOp->p2>0 );
drh1af3fdb2004-07-18 21:33:01 +00003013 if( res ){
drh91fd4d42008-01-19 20:11:25 +00003014 pc = pOp->p2 - 1;
drh8721ce42001-11-07 14:22:00 +00003015 }
danielk1977f7b9d662008-06-23 18:49:43 +00003016 }else if( !pC->pseudoTable ){
3017 /* This happens when attempting to open the sqlite3_master table
3018 ** for read access returns SQLITE_EMPTY. In this case always
3019 ** take the jump (since there are no records in the table).
3020 */
3021 pc = pOp->p2 - 1;
drh5e00f6c2001-09-13 13:46:56 +00003022 }
drh5e00f6c2001-09-13 13:46:56 +00003023 break;
3024}
3025
drh98757152008-01-09 23:04:12 +00003026/* Opcode: Found P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00003027**
drh98757152008-01-09 23:04:12 +00003028** Register P3 holds a blob constructed by MakeRecord. P1 is an index.
drh9cbf3422008-01-17 16:22:13 +00003029** If an entry that matches the value in register p3 exists in P1 then
3030** jump to P2. If the P3 value does not match any entry in P1
drhf0863fe2005-06-12 21:35:51 +00003031** then fall thru. The P1 cursor is left pointing at the matching entry
drh2dcef112008-01-12 19:03:48 +00003032** if it exists.
drhf0863fe2005-06-12 21:35:51 +00003033**
3034** This instruction is used to implement the IN operator where the
danielk19779a96b662007-11-29 17:05:18 +00003035** left-hand side is a SELECT statement. P1 may be a true index, or it
3036** may be a temporary index that holds the results of the SELECT
drh2dcef112008-01-12 19:03:48 +00003037** statement. This instruction is also used to implement the
3038** DISTINCT keyword in SELECT statements.
danielk19779a96b662007-11-29 17:05:18 +00003039**
3040** This instruction checks if index P1 contains a record for which
shane21e7feb2008-05-30 15:59:49 +00003041** the first N serialized values exactly match the N serialized values
drh9cbf3422008-01-17 16:22:13 +00003042** in the record in register P3, where N is the total number of values in
3043** the P3 record (the P3 record is a prefix of the P1 record).
drhb19a2bc2001-09-16 00:13:26 +00003044**
drh2dcef112008-01-12 19:03:48 +00003045** See also: NotFound, MoveTo, IsUnique, NotExists
drh5e00f6c2001-09-13 13:46:56 +00003046*/
drh98757152008-01-09 23:04:12 +00003047/* Opcode: NotFound P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00003048**
drh98757152008-01-09 23:04:12 +00003049** Register P3 holds a blob constructed by MakeRecord. P1 is
drhf0863fe2005-06-12 21:35:51 +00003050** an index. If no entry exists in P1 that matches the blob then jump
drh795ab9b2007-01-27 13:37:22 +00003051** to P2. If an entry does existing, fall through. The cursor is left
drh9cbf3422008-01-17 16:22:13 +00003052** pointing to the entry that matches.
drh5e00f6c2001-09-13 13:46:56 +00003053**
drh9cbf3422008-01-17 16:22:13 +00003054** See also: Found, MoveTo, NotExists, IsUnique
drh5e00f6c2001-09-13 13:46:56 +00003055*/
drh9cbf3422008-01-17 16:22:13 +00003056case OP_NotFound: /* jump, in3 */
3057case OP_Found: { /* jump, in3 */
drh5e00f6c2001-09-13 13:46:56 +00003058 int i = pOp->p1;
drh5e00f6c2001-09-13 13:46:56 +00003059 int alreadyExists = 0;
drh80ff32f2001-11-04 18:32:46 +00003060 Cursor *pC;
drh6810ce62004-01-31 19:22:56 +00003061 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003062 assert( p->apCsr[i]!=0 );
drhd7556d22004-05-14 21:59:40 +00003063 if( (pC = p->apCsr[i])->pCursor!=0 ){
danielk197777519402007-08-30 11:48:31 +00003064 int res;
drhf0863fe2005-06-12 21:35:51 +00003065 assert( pC->isTable==0 );
drh98757152008-01-09 23:04:12 +00003066 assert( pIn3->flags & MEM_Blob );
danielk19779a96b662007-11-29 17:05:18 +00003067 if( pOp->opcode==OP_Found ){
3068 pC->pKeyInfo->prefixIsEqual = 1;
3069 }
drhe14006d2008-03-25 17:23:32 +00003070 rc = sqlite3BtreeMoveto(pC->pCursor, pIn3->z, 0, pIn3->n, 0, &res);
danielk19779a96b662007-11-29 17:05:18 +00003071 pC->pKeyInfo->prefixIsEqual = 0;
danielk197777519402007-08-30 11:48:31 +00003072 if( rc!=SQLITE_OK ){
3073 break;
3074 }
3075 alreadyExists = (res==0);
drha11846b2004-01-07 18:52:56 +00003076 pC->deferredMoveto = 0;
drh76873ab2006-01-07 18:48:26 +00003077 pC->cacheStatus = CACHE_STALE;
drh5e00f6c2001-09-13 13:46:56 +00003078 }
3079 if( pOp->opcode==OP_Found ){
3080 if( alreadyExists ) pc = pOp->p2 - 1;
3081 }else{
3082 if( !alreadyExists ) pc = pOp->p2 - 1;
3083 }
drh5e00f6c2001-09-13 13:46:56 +00003084 break;
3085}
3086
drh98757152008-01-09 23:04:12 +00003087/* Opcode: IsUnique P1 P2 P3 P4 *
drh9cfcf5d2002-01-29 18:41:24 +00003088**
drh98757152008-01-09 23:04:12 +00003089** The P3 register contains an integer record number. Call this
3090** record number R. The P4 register contains an index key created
3091** using MakeIdxRec. Call it K.
drh9cfcf5d2002-01-29 18:41:24 +00003092**
drh7cf6e4d2004-05-19 14:56:55 +00003093** P1 is an index. So it has no data and its key consists of a
drhf0863fe2005-06-12 21:35:51 +00003094** record generated by OP_MakeRecord where the last field is the
3095** rowid of the entry that the index refers to.
drhf3218fe2004-05-28 08:21:02 +00003096**
drh0ca3e242002-01-29 23:07:02 +00003097** This instruction asks if there is an entry in P1 where the
drh7cf6e4d2004-05-19 14:56:55 +00003098** fields matches K but the rowid is different from R.
3099** If there is no such entry, then there is an immediate
drh0ca3e242002-01-29 23:07:02 +00003100** jump to P2. If any entry does exist where the index string
3101** matches K but the record number is not R, then the record
drh98757152008-01-09 23:04:12 +00003102** number for that entry is written into P3 and control
drh0ca3e242002-01-29 23:07:02 +00003103** falls through to the next instruction.
drh9cfcf5d2002-01-29 18:41:24 +00003104**
drh9cbf3422008-01-17 16:22:13 +00003105** See also: NotFound, NotExists, Found
drh9cfcf5d2002-01-29 18:41:24 +00003106*/
drh9cbf3422008-01-17 16:22:13 +00003107case OP_IsUnique: { /* jump, in3 */
drh9cfcf5d2002-01-29 18:41:24 +00003108 int i = pOp->p1;
drhf328bc82004-05-10 23:29:49 +00003109 Cursor *pCx;
drh9cfcf5d2002-01-29 18:41:24 +00003110 BtCursor *pCrsr;
drh98757152008-01-09 23:04:12 +00003111 Mem *pK;
danielk1977452c9892004-05-13 05:16:15 +00003112 i64 R;
drh9cfcf5d2002-01-29 18:41:24 +00003113
drh0ca3e242002-01-29 23:07:02 +00003114 /* Pop the value R off the top of the stack
3115 */
drh98757152008-01-09 23:04:12 +00003116 assert( pOp->p4type==P4_INT32 );
drh9cbf3422008-01-17 16:22:13 +00003117 assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem );
3118 pK = &p->aMem[pOp->p4.i];
drh98757152008-01-09 23:04:12 +00003119 sqlite3VdbeMemIntegerify(pIn3);
3120 R = pIn3->u.i;
drh73bdf072006-08-15 14:21:16 +00003121 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003122 pCx = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00003123 assert( pCx!=0 );
drhf328bc82004-05-10 23:29:49 +00003124 pCrsr = pCx->pCursor;
3125 if( pCrsr!=0 ){
danielk1977f2fa8312006-01-24 13:09:33 +00003126 int res;
danielk1977452c9892004-05-13 05:16:15 +00003127 i64 v; /* The record number on the P1 entry that matches K */
drh0ca3e242002-01-29 23:07:02 +00003128 char *zKey; /* The value of K */
3129 int nKey; /* Number of bytes in K */
danielk1977452c9892004-05-13 05:16:15 +00003130 int len; /* Number of bytes in K without the rowid at the end */
drhf3218fe2004-05-28 08:21:02 +00003131 int szRowid; /* Size of the rowid column at the end of zKey */
drh0ca3e242002-01-29 23:07:02 +00003132
3133 /* Make sure K is a string and make zKey point to K
3134 */
drh98757152008-01-09 23:04:12 +00003135 assert( pK->flags & MEM_Blob );
3136 zKey = pK->z;
3137 nKey = pK->n;
danielk1977452c9892004-05-13 05:16:15 +00003138
drh74161702006-02-24 02:53:49 +00003139 szRowid = sqlite3VdbeIdxRowidLen((u8*)zKey);
drhf3218fe2004-05-28 08:21:02 +00003140 len = nKey-szRowid;
drh0ca3e242002-01-29 23:07:02 +00003141
drha3b321d2004-05-11 09:31:31 +00003142 /* Search for an entry in P1 where all but the last four bytes match K.
drh0ca3e242002-01-29 23:07:02 +00003143 ** If there is no such entry, jump immediately to P2.
3144 */
drh9188b382004-05-14 21:12:22 +00003145 assert( pCx->deferredMoveto==0 );
drh76873ab2006-01-07 18:48:26 +00003146 pCx->cacheStatus = CACHE_STALE;
drhe14006d2008-03-25 17:23:32 +00003147 rc = sqlite3BtreeMoveto(pCrsr, zKey, 0, len, 0, &res);
danielk1977f0113002006-01-24 12:09:17 +00003148 if( rc!=SQLITE_OK ){
3149 goto abort_due_to_error;
3150 }
drh9cfcf5d2002-01-29 18:41:24 +00003151 if( res<0 ){
danielk19774adee202004-05-08 08:23:19 +00003152 rc = sqlite3BtreeNext(pCrsr, &res);
drh9cfcf5d2002-01-29 18:41:24 +00003153 if( res ){
3154 pc = pOp->p2 - 1;
3155 break;
3156 }
3157 }
danielk1977751de562008-04-18 09:01:15 +00003158 rc = sqlite3VdbeIdxKeyCompare(pCx, 0, len, (u8*)zKey, &res);
drh9cfcf5d2002-01-29 18:41:24 +00003159 if( rc!=SQLITE_OK ) goto abort_due_to_error;
3160 if( res>0 ){
3161 pc = pOp->p2 - 1;
3162 break;
3163 }
drh0ca3e242002-01-29 23:07:02 +00003164
3165 /* At this point, pCrsr is pointing to an entry in P1 where all but
drhf3218fe2004-05-28 08:21:02 +00003166 ** the final entry (the rowid) matches K. Check to see if the
3167 ** final rowid column is different from R. If it equals R then jump
danielk1977452c9892004-05-13 05:16:15 +00003168 ** immediately to P2.
drh0ca3e242002-01-29 23:07:02 +00003169 */
drhb21c8cd2007-08-21 19:33:56 +00003170 rc = sqlite3VdbeIdxRowid(pCrsr, &v);
danielk1977452c9892004-05-13 05:16:15 +00003171 if( rc!=SQLITE_OK ){
3172 goto abort_due_to_error;
3173 }
drh0ca3e242002-01-29 23:07:02 +00003174 if( v==R ){
drh9cfcf5d2002-01-29 18:41:24 +00003175 pc = pOp->p2 - 1;
3176 break;
3177 }
drh0ca3e242002-01-29 23:07:02 +00003178
drh9cbf3422008-01-17 16:22:13 +00003179 /* The final varint of the key is different from R. Store it back
3180 ** into register R3. (The record number of an entry that violates
3181 ** a UNIQUE constraint.)
drh0ca3e242002-01-29 23:07:02 +00003182 */
drh98757152008-01-09 23:04:12 +00003183 pIn3->u.i = v;
danielk1977a7a8e142008-02-13 18:25:27 +00003184 assert( pIn3->flags&MEM_Int );
drh9cfcf5d2002-01-29 18:41:24 +00003185 }
3186 break;
3187}
3188
drh9cbf3422008-01-17 16:22:13 +00003189/* Opcode: NotExists P1 P2 P3 * *
drh6b125452002-01-28 15:53:03 +00003190**
drh9cbf3422008-01-17 16:22:13 +00003191** Use the content of register P3 as a integer key. If a record
danielk197796cb76f2008-01-04 13:24:28 +00003192** with that key does not exist in table of P1, then jump to P2.
3193** If the record does exist, then fall thru. The cursor is left
drh9cbf3422008-01-17 16:22:13 +00003194** pointing to the record if it exists.
drh6b125452002-01-28 15:53:03 +00003195**
3196** The difference between this operation and NotFound is that this
drhf0863fe2005-06-12 21:35:51 +00003197** operation assumes the key is an integer and that P1 is a table whereas
3198** NotFound assumes key is a blob constructed from MakeRecord and
3199** P1 is an index.
drh6b125452002-01-28 15:53:03 +00003200**
drh9cbf3422008-01-17 16:22:13 +00003201** See also: Found, MoveTo, NotFound, IsUnique
drh6b125452002-01-28 15:53:03 +00003202*/
drh9cbf3422008-01-17 16:22:13 +00003203case OP_NotExists: { /* jump, in3 */
drh6b125452002-01-28 15:53:03 +00003204 int i = pOp->p1;
drh9188b382004-05-14 21:12:22 +00003205 Cursor *pC;
drh0ca3e242002-01-29 23:07:02 +00003206 BtCursor *pCrsr;
drh6810ce62004-01-31 19:22:56 +00003207 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003208 assert( p->apCsr[i]!=0 );
drhd7556d22004-05-14 21:59:40 +00003209 if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
danielk19771400b522005-01-11 11:08:22 +00003210 int res;
danielk197736a3c702004-05-11 06:55:14 +00003211 u64 iKey;
drh98757152008-01-09 23:04:12 +00003212 assert( pIn3->flags & MEM_Int );
drhf0863fe2005-06-12 21:35:51 +00003213 assert( p->apCsr[i]->isTable );
drh98757152008-01-09 23:04:12 +00003214 iKey = intToKey(pIn3->u.i);
drhe14006d2008-03-25 17:23:32 +00003215 rc = sqlite3BtreeMoveto(pCrsr, 0, 0, iKey, 0,&res);
drh98757152008-01-09 23:04:12 +00003216 pC->lastRowid = pIn3->u.i;
drhf0863fe2005-06-12 21:35:51 +00003217 pC->rowidIsValid = res==0;
drh9188b382004-05-14 21:12:22 +00003218 pC->nullRow = 0;
drh76873ab2006-01-07 18:48:26 +00003219 pC->cacheStatus = CACHE_STALE;
drh0bc53702007-01-04 01:20:11 +00003220 /* res might be uninitialized if rc!=SQLITE_OK. But if rc!=SQLITE_OK
3221 ** processing is about to abort so we really do not care whether or not
drhc416ba92007-03-30 18:42:55 +00003222 ** the following jump is taken. (In other words, do not stress over
3223 ** the error that valgrind sometimes shows on the next statement when
3224 ** running ioerr.test and similar failure-recovery test scripts.) */
danielk197728129562005-01-11 10:25:06 +00003225 if( res!=0 ){
drh17f71932002-02-21 12:01:27 +00003226 pc = pOp->p2 - 1;
drh91fd4d42008-01-19 20:11:25 +00003227 assert( pC->rowidIsValid==0 );
drh6b125452002-01-28 15:53:03 +00003228 }
danielk1977f7b9d662008-06-23 18:49:43 +00003229 }else if( !pC->pseudoTable ){
3230 /* This happens when an attempt to open a read cursor on the
3231 ** sqlite_master table returns SQLITE_EMPTY.
3232 */
3233 assert( pC->isTable );
3234 pc = pOp->p2 - 1;
3235 assert( pC->rowidIsValid==0 );
drh6b125452002-01-28 15:53:03 +00003236 }
drh6b125452002-01-28 15:53:03 +00003237 break;
3238}
3239
drh4c583122008-01-04 22:01:03 +00003240/* Opcode: Sequence P1 P2 * * *
drh4db38a72005-09-01 12:16:28 +00003241**
drh4c583122008-01-04 22:01:03 +00003242** Find the next available sequence number for cursor P1.
drh9cbf3422008-01-17 16:22:13 +00003243** Write the sequence number into register P2.
drh4c583122008-01-04 22:01:03 +00003244** The sequence number on the cursor is incremented after this
3245** instruction.
drh4db38a72005-09-01 12:16:28 +00003246*/
drh4c583122008-01-04 22:01:03 +00003247case OP_Sequence: { /* out2-prerelease */
drh4db38a72005-09-01 12:16:28 +00003248 int i = pOp->p1;
drh4db38a72005-09-01 12:16:28 +00003249 assert( i>=0 && i<p->nCursor );
3250 assert( p->apCsr[i]!=0 );
drh4c583122008-01-04 22:01:03 +00003251 pOut->u.i = p->apCsr[i]->seqCount++;
danielk1977a7a8e142008-02-13 18:25:27 +00003252 MemSetTypeFlag(pOut, MEM_Int);
drh4db38a72005-09-01 12:16:28 +00003253 break;
3254}
3255
3256
drh98757152008-01-09 23:04:12 +00003257/* Opcode: NewRowid P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00003258**
drhf0863fe2005-06-12 21:35:51 +00003259** Get a new integer record number (a.k.a "rowid") used as the key to a table.
drhb19a2bc2001-09-16 00:13:26 +00003260** The record number is not previously used as a key in the database
drh9cbf3422008-01-17 16:22:13 +00003261** table that cursor P1 points to. The new record number is written
3262** written to register P2.
drh205f48e2004-11-05 00:43:11 +00003263**
drh98757152008-01-09 23:04:12 +00003264** If P3>0 then P3 is a register that holds the largest previously
drh205f48e2004-11-05 00:43:11 +00003265** generated record number. No new record numbers are allowed to be less
drh2958a4e2004-11-12 03:56:15 +00003266** than this value. When this value reaches its maximum, a SQLITE_FULL
drh98757152008-01-09 23:04:12 +00003267** error is generated. The P3 register is updated with the generated
drh4c583122008-01-04 22:01:03 +00003268** record number. This P3 mechanism is used to help implement the
drh205f48e2004-11-05 00:43:11 +00003269** AUTOINCREMENT feature.
drh5e00f6c2001-09-13 13:46:56 +00003270*/
drh4c583122008-01-04 22:01:03 +00003271case OP_NewRowid: { /* out2-prerelease */
drh5e00f6c2001-09-13 13:46:56 +00003272 int i = pOp->p1;
drhf328bc82004-05-10 23:29:49 +00003273 i64 v = 0;
drh80ff32f2001-11-04 18:32:46 +00003274 Cursor *pC;
drh6810ce62004-01-31 19:22:56 +00003275 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003276 assert( p->apCsr[i]!=0 );
drhd7556d22004-05-14 21:59:40 +00003277 if( (pC = p->apCsr[i])->pCursor==0 ){
drhf328bc82004-05-10 23:29:49 +00003278 /* The zero initialization above is all that is needed */
drh5e00f6c2001-09-13 13:46:56 +00003279 }else{
drh5cf8e8c2002-02-19 22:42:05 +00003280 /* The next rowid or record number (different terms for the same
3281 ** thing) is obtained in a two-step algorithm.
3282 **
3283 ** First we attempt to find the largest existing rowid and add one
3284 ** to that. But if the largest existing rowid is already the maximum
3285 ** positive integer, we have to fall through to the second
3286 ** probabilistic algorithm
3287 **
3288 ** The second algorithm is to select a rowid at random and see if
3289 ** it already exists in the table. If it does not exist, we have
3290 ** succeeded. If the random rowid does exist, we select a new one
3291 ** and try again, up to 1000 times.
drhdb5ed6d2001-09-18 22:17:44 +00003292 **
3293 ** For a table with less than 2 billion entries, the probability
3294 ** of not finding a unused rowid is about 1.0e-300. This is a
3295 ** non-zero probability, but it is still vanishingly small and should
3296 ** never cause a problem. You are much, much more likely to have a
3297 ** hardware failure than for this algorithm to fail.
3298 **
drhaf9ff332002-01-16 21:00:27 +00003299 ** The analysis in the previous paragraph assumes that you have a good
3300 ** source of random numbers. Is a library function like lrand48()
3301 ** good enough? Maybe. Maybe not. It's hard to know whether there
3302 ** might be subtle bugs is some implementations of lrand48() that
3303 ** could cause problems. To avoid uncertainty, SQLite uses its own
3304 ** random number generator based on the RC4 algorithm.
3305 **
drhdb5ed6d2001-09-18 22:17:44 +00003306 ** To promote locality of reference for repetitive inserts, the
shane21e7feb2008-05-30 15:59:49 +00003307 ** first few attempts at choosing a random rowid pick values just a little
drhdb5ed6d2001-09-18 22:17:44 +00003308 ** larger than the previous rowid. This has been shown experimentally
3309 ** to double the speed of the COPY operation.
3310 */
danielk1977f7df9cc2004-06-16 12:02:47 +00003311 int res, rx=SQLITE_OK, cnt;
drhf328bc82004-05-10 23:29:49 +00003312 i64 x;
drh5e00f6c2001-09-13 13:46:56 +00003313 cnt = 0;
drh4e6083c2005-02-04 21:13:00 +00003314 if( (sqlite3BtreeFlags(pC->pCursor)&(BTREE_INTKEY|BTREE_ZERODATA)) !=
3315 BTREE_INTKEY ){
drh49285702005-09-17 15:20:26 +00003316 rc = SQLITE_CORRUPT_BKPT;
drh4e6083c2005-02-04 21:13:00 +00003317 goto abort_due_to_error;
3318 }
drhf328bc82004-05-10 23:29:49 +00003319 assert( (sqlite3BtreeFlags(pC->pCursor) & BTREE_INTKEY)!=0 );
3320 assert( (sqlite3BtreeFlags(pC->pCursor) & BTREE_ZERODATA)==0 );
drhfe2093d2005-01-20 22:48:47 +00003321
drh75f86a42005-02-17 00:03:06 +00003322#ifdef SQLITE_32BIT_ROWID
3323# define MAX_ROWID 0x7fffffff
3324#else
drhfe2093d2005-01-20 22:48:47 +00003325 /* Some compilers complain about constants of the form 0x7fffffffffffffff.
3326 ** Others complain about 0x7ffffffffffffffffLL. The following macro seems
3327 ** to provide the constant while making all compilers happy.
3328 */
drh75f86a42005-02-17 00:03:06 +00003329# define MAX_ROWID ( (((u64)0x7fffffff)<<32) | (u64)0xffffffff )
3330#endif
drhfe2093d2005-01-20 22:48:47 +00003331
drh5cf8e8c2002-02-19 22:42:05 +00003332 if( !pC->useRandomRowid ){
drh32fbe342002-10-19 20:16:37 +00003333 if( pC->nextRowidValid ){
3334 v = pC->nextRowid;
drh3fc190c2001-09-14 03:24:23 +00003335 }else{
danielk1977261919c2005-12-06 12:52:59 +00003336 rc = sqlite3BtreeLast(pC->pCursor, &res);
3337 if( rc!=SQLITE_OK ){
3338 goto abort_due_to_error;
3339 }
drh32fbe342002-10-19 20:16:37 +00003340 if( res ){
3341 v = 1;
drh5cf8e8c2002-02-19 22:42:05 +00003342 }else{
danielk1977e0d4b062004-06-28 01:11:46 +00003343 sqlite3BtreeKeySize(pC->pCursor, &v);
drh32fbe342002-10-19 20:16:37 +00003344 v = keyToInt(v);
drh75f86a42005-02-17 00:03:06 +00003345 if( v==MAX_ROWID ){
drh32fbe342002-10-19 20:16:37 +00003346 pC->useRandomRowid = 1;
3347 }else{
3348 v++;
3349 }
drh5cf8e8c2002-02-19 22:42:05 +00003350 }
drh3fc190c2001-09-14 03:24:23 +00003351 }
drh205f48e2004-11-05 00:43:11 +00003352
3353#ifndef SQLITE_OMIT_AUTOINCREMENT
drh4c583122008-01-04 22:01:03 +00003354 if( pOp->p3 ){
drh205f48e2004-11-05 00:43:11 +00003355 Mem *pMem;
drh4c583122008-01-04 22:01:03 +00003356 assert( pOp->p3>0 && pOp->p3<=p->nMem ); /* P3 is a valid memory cell */
3357 pMem = &p->aMem[pOp->p3];
drh5b6afba2008-01-05 16:29:28 +00003358 REGISTER_TRACE(pOp->p3, pMem);
drh8a512562005-11-14 22:29:05 +00003359 sqlite3VdbeMemIntegerify(pMem);
drh4c583122008-01-04 22:01:03 +00003360 assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */
drh3c024d62007-03-30 11:23:45 +00003361 if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){
drh205f48e2004-11-05 00:43:11 +00003362 rc = SQLITE_FULL;
3363 goto abort_due_to_error;
3364 }
drh3c024d62007-03-30 11:23:45 +00003365 if( v<pMem->u.i+1 ){
3366 v = pMem->u.i + 1;
drh205f48e2004-11-05 00:43:11 +00003367 }
drh3c024d62007-03-30 11:23:45 +00003368 pMem->u.i = v;
drh205f48e2004-11-05 00:43:11 +00003369 }
3370#endif
3371
drh75f86a42005-02-17 00:03:06 +00003372 if( v<MAX_ROWID ){
drh32fbe342002-10-19 20:16:37 +00003373 pC->nextRowidValid = 1;
3374 pC->nextRowid = v+1;
3375 }else{
3376 pC->nextRowidValid = 0;
3377 }
drh5cf8e8c2002-02-19 22:42:05 +00003378 }
3379 if( pC->useRandomRowid ){
drh4c583122008-01-04 22:01:03 +00003380 assert( pOp->p3==0 ); /* SQLITE_FULL must have occurred prior to this */
drh5cf8e8c2002-02-19 22:42:05 +00003381 v = db->priorNewRowid;
3382 cnt = 0;
3383 do{
drh91fd4d42008-01-19 20:11:25 +00003384 if( cnt==0 && (v&0xffffff)==v ){
3385 v++;
3386 }else{
drh2fa18682008-03-19 14:15:34 +00003387 sqlite3_randomness(sizeof(v), &v);
drh5cf8e8c2002-02-19 22:42:05 +00003388 if( cnt<5 ) v &= 0xffffff;
drh5cf8e8c2002-02-19 22:42:05 +00003389 }
3390 if( v==0 ) continue;
3391 x = intToKey(v);
drhe14006d2008-03-25 17:23:32 +00003392 rx = sqlite3BtreeMoveto(pC->pCursor, 0, 0, (u64)x, 0, &res);
drh5cf8e8c2002-02-19 22:42:05 +00003393 cnt++;
drh91fd4d42008-01-19 20:11:25 +00003394 }while( cnt<100 && rx==SQLITE_OK && res==0 );
drh5cf8e8c2002-02-19 22:42:05 +00003395 db->priorNewRowid = v;
3396 if( rx==SQLITE_OK && res==0 ){
3397 rc = SQLITE_FULL;
3398 goto abort_due_to_error;
3399 }
drh1eaa2692001-09-18 02:02:23 +00003400 }
drhf0863fe2005-06-12 21:35:51 +00003401 pC->rowidIsValid = 0;
drha11846b2004-01-07 18:52:56 +00003402 pC->deferredMoveto = 0;
drh76873ab2006-01-07 18:48:26 +00003403 pC->cacheStatus = CACHE_STALE;
drh5e00f6c2001-09-13 13:46:56 +00003404 }
danielk1977a7a8e142008-02-13 18:25:27 +00003405 MemSetTypeFlag(pOut, MEM_Int);
drh4c583122008-01-04 22:01:03 +00003406 pOut->u.i = v;
drh5e00f6c2001-09-13 13:46:56 +00003407 break;
3408}
3409
danielk19771f4aa332008-01-03 09:51:55 +00003410/* Opcode: Insert P1 P2 P3 P4 P5
drh5e00f6c2001-09-13 13:46:56 +00003411**
jplyon5a564222003-06-02 06:15:58 +00003412** Write an entry into the table of cursor P1. A new entry is
drhb19a2bc2001-09-16 00:13:26 +00003413** created if it doesn't already exist or the data for an existing
danielk19771f4aa332008-01-03 09:51:55 +00003414** entry is overwritten. The data is the value stored register
3415** number P2. The key is stored in register P3. The key must
3416** be an integer.
drh4a324312001-12-21 14:30:42 +00003417**
danielk19771f4aa332008-01-03 09:51:55 +00003418** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is
3419** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set,
danielk1977b28af712004-06-21 06:50:26 +00003420** then rowid is stored for subsequent return by the
drh85b623f2007-12-13 21:54:09 +00003421** sqlite3_last_insert_rowid() function (otherwise it is unmodified).
drh6b125452002-01-28 15:53:03 +00003422**
drh66a51672008-01-03 00:01:23 +00003423** Parameter P4 may point to a string containing the table-name, or
danielk19771f6eec52006-06-16 06:17:47 +00003424** may be NULL. If it is not NULL, then the update-hook
3425** (sqlite3.xUpdateCallback) is invoked following a successful insert.
3426**
drh93aed5a2008-01-16 17:46:38 +00003427** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically
3428** allocated, then ownership of P2 is transferred to the pseudo-cursor
3429** and register P2 becomes ephemeral. If the cursor is changed, the
3430** value of register P2 will then change. Make sure this does not
3431** cause any problems.)
3432**
drhf0863fe2005-06-12 21:35:51 +00003433** This instruction only works on tables. The equivalent instruction
3434** for indices is OP_IdxInsert.
drh6b125452002-01-28 15:53:03 +00003435*/
drh9cbf3422008-01-17 16:22:13 +00003436case OP_Insert: {
danielk19771f4aa332008-01-03 09:51:55 +00003437 Mem *pData = &p->aMem[pOp->p2];
3438 Mem *pKey = &p->aMem[pOp->p3];
3439
drha05a7222008-01-19 03:35:58 +00003440 i64 iKey; /* The integer ROWID or key for the record to be inserted */
drh5e00f6c2001-09-13 13:46:56 +00003441 int i = pOp->p1;
drh32fbe342002-10-19 20:16:37 +00003442 Cursor *pC;
drh6810ce62004-01-31 19:22:56 +00003443 assert( i>=0 && i<p->nCursor );
drha05a7222008-01-19 03:35:58 +00003444 pC = p->apCsr[i];
3445 assert( pC!=0 );
3446 assert( pC->pCursor!=0 || pC->pseudoTable );
3447 assert( pKey->flags & MEM_Int );
3448 assert( pC->isTable );
drh5b6afba2008-01-05 16:29:28 +00003449 REGISTER_TRACE(pOp->p2, pData);
3450 REGISTER_TRACE(pOp->p3, pKey);
danielk19775f8d8a82004-05-11 00:28:42 +00003451
drha05a7222008-01-19 03:35:58 +00003452 iKey = intToKey(pKey->u.i);
3453 if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
3454 if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = pKey->u.i;
3455 if( pC->nextRowidValid && pKey->u.i>=pC->nextRowid ){
3456 pC->nextRowidValid = 0;
drh5e00f6c2001-09-13 13:46:56 +00003457 }
drha05a7222008-01-19 03:35:58 +00003458 if( pData->flags & MEM_Null ){
3459 pData->z = 0;
3460 pData->n = 0;
3461 }else{
3462 assert( pData->flags & (MEM_Blob|MEM_Str) );
3463 }
3464 if( pC->pseudoTable ){
danielk19779882d992008-03-27 17:59:01 +00003465 if( !pC->ephemPseudoTable ){
3466 sqlite3_free(pC->pData);
3467 }
drha05a7222008-01-19 03:35:58 +00003468 pC->iKey = iKey;
3469 pC->nData = pData->n;
danielk19775f096132008-03-28 15:44:09 +00003470 if( pData->z==pData->zMalloc || pC->ephemPseudoTable ){
drha05a7222008-01-19 03:35:58 +00003471 pC->pData = pData->z;
danielk19779882d992008-03-27 17:59:01 +00003472 if( !pC->ephemPseudoTable ){
3473 pData->flags &= ~MEM_Dyn;
3474 pData->flags |= MEM_Ephem;
danielk19775f096132008-03-28 15:44:09 +00003475 pData->zMalloc = 0;
danielk19779882d992008-03-27 17:59:01 +00003476 }
drha05a7222008-01-19 03:35:58 +00003477 }else{
drhe5ae5732008-06-15 02:51:47 +00003478 pC->pData = sqlite3Malloc( pC->nData+2 );
drha05a7222008-01-19 03:35:58 +00003479 if( !pC->pData ) goto no_mem;
3480 memcpy(pC->pData, pData->z, pC->nData);
3481 pC->pData[pC->nData] = 0;
3482 pC->pData[pC->nData+1] = 0;
3483 }
3484 pC->nullRow = 0;
3485 }else{
3486 int nZero;
3487 if( pData->flags & MEM_Zero ){
3488 nZero = pData->u.i;
3489 }else{
3490 nZero = 0;
3491 }
3492 rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey,
3493 pData->z, pData->n, nZero,
3494 pOp->p5 & OPFLAG_APPEND);
3495 }
3496
3497 pC->rowidIsValid = 0;
3498 pC->deferredMoveto = 0;
3499 pC->cacheStatus = CACHE_STALE;
danielk197794eb6a12005-12-15 15:22:08 +00003500
drha05a7222008-01-19 03:35:58 +00003501 /* Invoke the update-hook if required. */
3502 if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
3503 const char *zDb = db->aDb[pC->iDb].zName;
3504 const char *zTbl = pOp->p4.z;
3505 int op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
3506 assert( pC->isTable );
3507 db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey);
3508 assert( pC->iDb>=0 );
3509 }
drh5e00f6c2001-09-13 13:46:56 +00003510 break;
3511}
3512
drh98757152008-01-09 23:04:12 +00003513/* Opcode: Delete P1 P2 * P4 *
drh5e00f6c2001-09-13 13:46:56 +00003514**
drh5edc3122001-09-13 21:53:09 +00003515** Delete the record at which the P1 cursor is currently pointing.
3516**
3517** The cursor will be left pointing at either the next or the previous
3518** record in the table. If it is left pointing at the next record, then
drhb19a2bc2001-09-16 00:13:26 +00003519** the next Next instruction will be a no-op. Hence it is OK to delete
3520** a record from within an Next loop.
drhc8d30ac2002-04-12 10:08:59 +00003521**
rdcb0c374f2004-02-20 22:53:38 +00003522** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
danielk1977b28af712004-06-21 06:50:26 +00003523** incremented (otherwise not).
drh70ce3f02003-04-15 19:22:22 +00003524**
drh91fd4d42008-01-19 20:11:25 +00003525** P1 must not be pseudo-table. It has to be a real table with
3526** multiple rows.
3527**
3528** If P4 is not NULL, then it is the name of the table that P1 is
3529** pointing to. The update hook will be invoked, if it exists.
3530** If P4 is not NULL then the P1 cursor must have been positioned
3531** using OP_NotFound prior to invoking this opcode.
drh5e00f6c2001-09-13 13:46:56 +00003532*/
drh9cbf3422008-01-17 16:22:13 +00003533case OP_Delete: {
drh5e00f6c2001-09-13 13:46:56 +00003534 int i = pOp->p1;
drh91fd4d42008-01-19 20:11:25 +00003535 i64 iKey;
drh32fbe342002-10-19 20:16:37 +00003536 Cursor *pC;
drh91fd4d42008-01-19 20:11:25 +00003537
drh70ce3f02003-04-15 19:22:22 +00003538 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003539 pC = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00003540 assert( pC!=0 );
drh91fd4d42008-01-19 20:11:25 +00003541 assert( pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */
danielk197794eb6a12005-12-15 15:22:08 +00003542
drh91fd4d42008-01-19 20:11:25 +00003543 /* If the update-hook will be invoked, set iKey to the rowid of the
3544 ** row being deleted.
3545 */
3546 if( db->xUpdateCallback && pOp->p4.z ){
3547 assert( pC->isTable );
3548 assert( pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */
3549 iKey = pC->lastRowid;
3550 }
danielk197794eb6a12005-12-15 15:22:08 +00003551
drh91fd4d42008-01-19 20:11:25 +00003552 rc = sqlite3VdbeCursorMoveto(pC);
3553 if( rc ) goto abort_due_to_error;
3554 rc = sqlite3BtreeDelete(pC->pCursor);
3555 pC->nextRowidValid = 0;
3556 pC->cacheStatus = CACHE_STALE;
danielk197794eb6a12005-12-15 15:22:08 +00003557
drh91fd4d42008-01-19 20:11:25 +00003558 /* Invoke the update-hook if required. */
3559 if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
3560 const char *zDb = db->aDb[pC->iDb].zName;
3561 const char *zTbl = pOp->p4.z;
3562 db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, iKey);
3563 assert( pC->iDb>=0 );
drh5e00f6c2001-09-13 13:46:56 +00003564 }
danielk1977b28af712004-06-21 06:50:26 +00003565 if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++;
rdcb0c374f2004-02-20 22:53:38 +00003566 break;
3567}
3568
danielk1977b28af712004-06-21 06:50:26 +00003569/* Opcode: ResetCount P1 * *
rdcb0c374f2004-02-20 22:53:38 +00003570**
danielk1977b28af712004-06-21 06:50:26 +00003571** This opcode resets the VMs internal change counter to 0. If P1 is true,
3572** then the value of the change counter is copied to the database handle
3573** change counter (returned by subsequent calls to sqlite3_changes())
3574** before it is reset. This is used by trigger programs.
rdcb0c374f2004-02-20 22:53:38 +00003575*/
drh9cbf3422008-01-17 16:22:13 +00003576case OP_ResetCount: {
danielk1977b28af712004-06-21 06:50:26 +00003577 if( pOp->p1 ){
drh344737f2004-09-19 00:50:20 +00003578 sqlite3VdbeSetChanges(db, p->nChange);
danielk1977b28af712004-06-21 06:50:26 +00003579 }
3580 p->nChange = 0;
drh5e00f6c2001-09-13 13:46:56 +00003581 break;
3582}
3583
drh98757152008-01-09 23:04:12 +00003584/* Opcode: RowData P1 P2 * * *
drh70ce3f02003-04-15 19:22:22 +00003585**
drh98757152008-01-09 23:04:12 +00003586** Write into register P2 the complete row data for cursor P1.
3587** There is no interpretation of the data.
3588** It is just copied onto the P2 register exactly as
danielk197796cb76f2008-01-04 13:24:28 +00003589** it is found in the database file.
drh70ce3f02003-04-15 19:22:22 +00003590**
drhde4fcfd2008-01-19 23:50:26 +00003591** If the P1 cursor must be pointing to a valid row (not a NULL row)
3592** of a real table, not a pseudo-table.
drh70ce3f02003-04-15 19:22:22 +00003593*/
drh98757152008-01-09 23:04:12 +00003594/* Opcode: RowKey P1 P2 * * *
drh143f3c42004-01-07 20:37:52 +00003595**
drh98757152008-01-09 23:04:12 +00003596** Write into register P2 the complete row key for cursor P1.
3597** There is no interpretation of the data.
drh9cbf3422008-01-17 16:22:13 +00003598** The key is copied onto the P3 register exactly as
danielk197796cb76f2008-01-04 13:24:28 +00003599** it is found in the database file.
drh143f3c42004-01-07 20:37:52 +00003600**
drhde4fcfd2008-01-19 23:50:26 +00003601** If the P1 cursor must be pointing to a valid row (not a NULL row)
3602** of a real table, not a pseudo-table.
drh143f3c42004-01-07 20:37:52 +00003603*/
danielk1977a7a8e142008-02-13 18:25:27 +00003604case OP_RowKey:
3605case OP_RowData: {
drh70ce3f02003-04-15 19:22:22 +00003606 int i = pOp->p1;
drh70ce3f02003-04-15 19:22:22 +00003607 Cursor *pC;
drhde4fcfd2008-01-19 23:50:26 +00003608 BtCursor *pCrsr;
danielk1977e0d4b062004-06-28 01:11:46 +00003609 u32 n;
drh70ce3f02003-04-15 19:22:22 +00003610
danielk1977a7a8e142008-02-13 18:25:27 +00003611 pOut = &p->aMem[pOp->p2];
3612
drhf0863fe2005-06-12 21:35:51 +00003613 /* Note that RowKey and RowData are really exactly the same instruction */
drh70ce3f02003-04-15 19:22:22 +00003614 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003615 pC = p->apCsr[i];
drhf0863fe2005-06-12 21:35:51 +00003616 assert( pC->isTable || pOp->opcode==OP_RowKey );
3617 assert( pC->isIndex || pOp->opcode==OP_RowData );
drh4774b132004-06-12 20:12:51 +00003618 assert( pC!=0 );
drhde4fcfd2008-01-19 23:50:26 +00003619 assert( pC->nullRow==0 );
3620 assert( pC->pseudoTable==0 );
3621 assert( pC->pCursor!=0 );
3622 pCrsr = pC->pCursor;
3623 rc = sqlite3VdbeCursorMoveto(pC);
3624 if( rc ) goto abort_due_to_error;
3625 if( pC->isIndex ){
3626 i64 n64;
3627 assert( !pC->isTable );
3628 sqlite3BtreeKeySize(pCrsr, &n64);
drhbb4957f2008-03-20 14:03:29 +00003629 if( n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhde4fcfd2008-01-19 23:50:26 +00003630 goto too_big;
drh70ce3f02003-04-15 19:22:22 +00003631 }
drhde4fcfd2008-01-19 23:50:26 +00003632 n = n64;
3633 }else{
3634 sqlite3BtreeDataSize(pCrsr, &n);
drhbb4957f2008-03-20 14:03:29 +00003635 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh023ae032007-05-08 12:12:16 +00003636 goto too_big;
3637 }
drhde4fcfd2008-01-19 23:50:26 +00003638 }
danielk1977a7a8e142008-02-13 18:25:27 +00003639 if( sqlite3VdbeMemGrow(pOut, n, 0) ){
3640 goto no_mem;
drhde4fcfd2008-01-19 23:50:26 +00003641 }
danielk1977a7a8e142008-02-13 18:25:27 +00003642 pOut->n = n;
3643 MemSetTypeFlag(pOut, MEM_Blob);
drhde4fcfd2008-01-19 23:50:26 +00003644 if( pC->isIndex ){
3645 rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z);
3646 }else{
3647 rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z);
drh5e00f6c2001-09-13 13:46:56 +00003648 }
danielk197796cb76f2008-01-04 13:24:28 +00003649 pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */
drhb7654112008-01-12 12:48:07 +00003650 UPDATE_MAX_BLOBSIZE(pOut);
drh5e00f6c2001-09-13 13:46:56 +00003651 break;
3652}
3653
drh2133d822008-01-03 18:44:59 +00003654/* Opcode: Rowid P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00003655**
drh2133d822008-01-03 18:44:59 +00003656** Store in register P2 an integer which is the key of the table entry that
drhbfdc7542008-05-29 03:12:54 +00003657** P1 is currently point to.
drh5e00f6c2001-09-13 13:46:56 +00003658*/
drh4c583122008-01-04 22:01:03 +00003659case OP_Rowid: { /* out2-prerelease */
drh5e00f6c2001-09-13 13:46:56 +00003660 int i = pOp->p1;
drh70ce3f02003-04-15 19:22:22 +00003661 Cursor *pC;
drhf328bc82004-05-10 23:29:49 +00003662 i64 v;
drh5e00f6c2001-09-13 13:46:56 +00003663
drh70ce3f02003-04-15 19:22:22 +00003664 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003665 pC = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00003666 assert( pC!=0 );
drh536065a2005-01-26 21:55:31 +00003667 rc = sqlite3VdbeCursorMoveto(pC);
drh52f159e2005-01-27 00:33:21 +00003668 if( rc ) goto abort_due_to_error;
drhf0863fe2005-06-12 21:35:51 +00003669 if( pC->rowidIsValid ){
3670 v = pC->lastRowid;
drh70ce3f02003-04-15 19:22:22 +00003671 }else if( pC->pseudoTable ){
3672 v = keyToInt(pC->iKey);
drha05a7222008-01-19 03:35:58 +00003673 }else if( pC->nullRow ){
drh4c583122008-01-04 22:01:03 +00003674 /* Leave the rowid set to a NULL */
drhd60ccc62003-06-24 10:39:46 +00003675 break;
drh70ce3f02003-04-15 19:22:22 +00003676 }else{
3677 assert( pC->pCursor!=0 );
danielk1977e0d4b062004-06-28 01:11:46 +00003678 sqlite3BtreeKeySize(pC->pCursor, &v);
drh70ce3f02003-04-15 19:22:22 +00003679 v = keyToInt(v);
drh5e00f6c2001-09-13 13:46:56 +00003680 }
drh4c583122008-01-04 22:01:03 +00003681 pOut->u.i = v;
danielk1977a7a8e142008-02-13 18:25:27 +00003682 MemSetTypeFlag(pOut, MEM_Int);
drh5e00f6c2001-09-13 13:46:56 +00003683 break;
3684}
3685
drh9cbf3422008-01-17 16:22:13 +00003686/* Opcode: NullRow P1 * * * *
drh17f71932002-02-21 12:01:27 +00003687**
3688** Move the cursor P1 to a null row. Any OP_Column operations
drh9cbf3422008-01-17 16:22:13 +00003689** that occur while the cursor is on the null row will always
3690** write a NULL.
drh17f71932002-02-21 12:01:27 +00003691*/
drh9cbf3422008-01-17 16:22:13 +00003692case OP_NullRow: {
drh17f71932002-02-21 12:01:27 +00003693 int i = pOp->p1;
drhd7556d22004-05-14 21:59:40 +00003694 Cursor *pC;
drh17f71932002-02-21 12:01:27 +00003695
drh70ce3f02003-04-15 19:22:22 +00003696 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003697 pC = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00003698 assert( pC!=0 );
drhd7556d22004-05-14 21:59:40 +00003699 pC->nullRow = 1;
drhf0863fe2005-06-12 21:35:51 +00003700 pC->rowidIsValid = 0;
drh17f71932002-02-21 12:01:27 +00003701 break;
3702}
3703
drh9cbf3422008-01-17 16:22:13 +00003704/* Opcode: Last P1 P2 * * *
drh9562b552002-02-19 15:00:07 +00003705**
drhf0863fe2005-06-12 21:35:51 +00003706** The next use of the Rowid or Column or Next instruction for P1
drh9562b552002-02-19 15:00:07 +00003707** will refer to the last entry in the database table or index.
3708** If the table or index is empty and P2>0, then jump immediately to P2.
3709** If P2 is 0 or if the table or index is not empty, fall through
3710** to the following instruction.
3711*/
drh9cbf3422008-01-17 16:22:13 +00003712case OP_Last: { /* jump */
drh9562b552002-02-19 15:00:07 +00003713 int i = pOp->p1;
drh70ce3f02003-04-15 19:22:22 +00003714 Cursor *pC;
drh9562b552002-02-19 15:00:07 +00003715 BtCursor *pCrsr;
drha05a7222008-01-19 03:35:58 +00003716 int res;
drh9562b552002-02-19 15:00:07 +00003717
drh70ce3f02003-04-15 19:22:22 +00003718 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003719 pC = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00003720 assert( pC!=0 );
drha05a7222008-01-19 03:35:58 +00003721 pCrsr = pC->pCursor;
3722 assert( pCrsr!=0 );
3723 rc = sqlite3BtreeLast(pCrsr, &res);
3724 pC->nullRow = res;
3725 pC->deferredMoveto = 0;
3726 pC->cacheStatus = CACHE_STALE;
3727 if( res && pOp->p2>0 ){
3728 pc = pOp->p2 - 1;
drh9562b552002-02-19 15:00:07 +00003729 }
3730 break;
3731}
3732
drh0342b1f2005-09-01 03:07:44 +00003733
drh9cbf3422008-01-17 16:22:13 +00003734/* Opcode: Sort P1 P2 * * *
drh0342b1f2005-09-01 03:07:44 +00003735**
3736** This opcode does exactly the same thing as OP_Rewind except that
3737** it increments an undocumented global variable used for testing.
3738**
3739** Sorting is accomplished by writing records into a sorting index,
3740** then rewinding that index and playing it back from beginning to
3741** end. We use the OP_Sort opcode instead of OP_Rewind to do the
3742** rewinding so that the global variable will be incremented and
3743** regression tests can determine whether or not the optimizer is
3744** correctly optimizing out sorts.
3745*/
drh9cbf3422008-01-17 16:22:13 +00003746case OP_Sort: { /* jump */
drh0f7eb612006-08-08 13:51:43 +00003747#ifdef SQLITE_TEST
drh0342b1f2005-09-01 03:07:44 +00003748 sqlite3_sort_count++;
drh4db38a72005-09-01 12:16:28 +00003749 sqlite3_search_count--;
drh0f7eb612006-08-08 13:51:43 +00003750#endif
drh0342b1f2005-09-01 03:07:44 +00003751 /* Fall through into OP_Rewind */
3752}
drh9cbf3422008-01-17 16:22:13 +00003753/* Opcode: Rewind P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00003754**
drhf0863fe2005-06-12 21:35:51 +00003755** The next use of the Rowid or Column or Next instruction for P1
drh8721ce42001-11-07 14:22:00 +00003756** will refer to the first entry in the database table or index.
3757** If the table or index is empty and P2>0, then jump immediately to P2.
3758** If P2 is 0 or if the table or index is not empty, fall through
3759** to the following instruction.
drh5e00f6c2001-09-13 13:46:56 +00003760*/
drh9cbf3422008-01-17 16:22:13 +00003761case OP_Rewind: { /* jump */
drh5e00f6c2001-09-13 13:46:56 +00003762 int i = pOp->p1;
drh70ce3f02003-04-15 19:22:22 +00003763 Cursor *pC;
drh5e00f6c2001-09-13 13:46:56 +00003764 BtCursor *pCrsr;
drhf4dada72004-05-11 09:57:35 +00003765 int res;
drh5e00f6c2001-09-13 13:46:56 +00003766
drh70ce3f02003-04-15 19:22:22 +00003767 assert( i>=0 && i<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003768 pC = p->apCsr[i];
drh4774b132004-06-12 20:12:51 +00003769 assert( pC!=0 );
drh70ce3f02003-04-15 19:22:22 +00003770 if( (pCrsr = pC->pCursor)!=0 ){
danielk19774adee202004-05-08 08:23:19 +00003771 rc = sqlite3BtreeFirst(pCrsr, &res);
drh70ce3f02003-04-15 19:22:22 +00003772 pC->atFirst = res==0;
drha11846b2004-01-07 18:52:56 +00003773 pC->deferredMoveto = 0;
drh76873ab2006-01-07 18:48:26 +00003774 pC->cacheStatus = CACHE_STALE;
drh70ce3f02003-04-15 19:22:22 +00003775 }else{
drhf4dada72004-05-11 09:57:35 +00003776 res = 1;
3777 }
3778 pC->nullRow = res;
drha05a7222008-01-19 03:35:58 +00003779 assert( pOp->p2>0 && pOp->p2<p->nOp );
3780 if( res ){
drhf4dada72004-05-11 09:57:35 +00003781 pc = pOp->p2 - 1;
drh5e00f6c2001-09-13 13:46:56 +00003782 }
3783 break;
3784}
3785
drh9cbf3422008-01-17 16:22:13 +00003786/* Opcode: Next P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00003787**
3788** Advance cursor P1 so that it points to the next key/data pair in its
drh8721ce42001-11-07 14:22:00 +00003789** table or index. If there are no more key/value pairs then fall through
3790** to the following instruction. But if the cursor advance was successful,
3791** jump immediately to P2.
drhc045ec52002-12-04 20:01:06 +00003792**
drh60a713c2008-01-21 16:22:45 +00003793** The P1 cursor must be for a real table, not a pseudo-table.
3794**
drhc045ec52002-12-04 20:01:06 +00003795** See also: Prev
drh8721ce42001-11-07 14:22:00 +00003796*/
drh9cbf3422008-01-17 16:22:13 +00003797/* Opcode: Prev P1 P2 * * *
drhc045ec52002-12-04 20:01:06 +00003798**
3799** Back up cursor P1 so that it points to the previous key/data pair in its
3800** table or index. If there is no previous key/value pairs then fall through
3801** to the following instruction. But if the cursor backup was successful,
3802** jump immediately to P2.
drh60a713c2008-01-21 16:22:45 +00003803**
3804** The P1 cursor must be for a real table, not a pseudo-table.
drhc045ec52002-12-04 20:01:06 +00003805*/
drh9cbf3422008-01-17 16:22:13 +00003806case OP_Prev: /* jump */
3807case OP_Next: { /* jump */
drh7b396862003-01-01 23:06:20 +00003808 Cursor *pC;
drh8721ce42001-11-07 14:22:00 +00003809 BtCursor *pCrsr;
drha3460582008-07-11 21:02:53 +00003810 int res;
drh8721ce42001-11-07 14:22:00 +00003811
drhcaec2f12003-01-07 02:47:47 +00003812 CHECK_FOR_INTERRUPT;
drh70ce3f02003-04-15 19:22:22 +00003813 assert( pOp->p1>=0 && pOp->p1<p->nCursor );
drhd7556d22004-05-14 21:59:40 +00003814 pC = p->apCsr[pOp->p1];
drh72e8fa42007-03-28 14:30:06 +00003815 if( pC==0 ){
3816 break; /* See ticket #2273 */
3817 }
drh60a713c2008-01-21 16:22:45 +00003818 pCrsr = pC->pCursor;
3819 assert( pCrsr );
drha3460582008-07-11 21:02:53 +00003820 res = 1;
3821 assert( pC->deferredMoveto==0 );
3822 rc = pOp->opcode==OP_Next ? sqlite3BtreeNext(pCrsr, &res) :
3823 sqlite3BtreePrevious(pCrsr, &res);
3824 pC->nullRow = res;
3825 pC->cacheStatus = CACHE_STALE;
3826 if( res==0 ){
3827 pc = pOp->p2 - 1;
drh0f7eb612006-08-08 13:51:43 +00003828#ifdef SQLITE_TEST
drha3460582008-07-11 21:02:53 +00003829 sqlite3_search_count++;
drh0f7eb612006-08-08 13:51:43 +00003830#endif
drh8721ce42001-11-07 14:22:00 +00003831 }
drhf0863fe2005-06-12 21:35:51 +00003832 pC->rowidIsValid = 0;
drh8721ce42001-11-07 14:22:00 +00003833 break;
3834}
3835
drh9cbf3422008-01-17 16:22:13 +00003836/* Opcode: IdxInsert P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00003837**
drhaa9b8962008-01-08 02:57:55 +00003838** Register P2 holds a SQL index key made using the
3839** MakeIdxRec instructions. This opcode writes that key
drhee32e0a2006-01-10 19:45:49 +00003840** into the index P1. Data for the entry is nil.
drh717e6402001-09-27 03:22:32 +00003841**
drhaa9b8962008-01-08 02:57:55 +00003842** P3 is a flag that provides a hint to the b-tree layer that this
drhe4d90812007-03-29 05:51:49 +00003843** insert is likely to be an append.
3844**
drhf0863fe2005-06-12 21:35:51 +00003845** This instruction only works for indices. The equivalent instruction
3846** for tables is OP_Insert.
drh5e00f6c2001-09-13 13:46:56 +00003847*/
drh9cbf3422008-01-17 16:22:13 +00003848case OP_IdxInsert: { /* in2 */
drh5e00f6c2001-09-13 13:46:56 +00003849 int i = pOp->p1;
drh9188b382004-05-14 21:12:22 +00003850 Cursor *pC;
drh5e00f6c2001-09-13 13:46:56 +00003851 BtCursor *pCrsr;
drh6810ce62004-01-31 19:22:56 +00003852 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003853 assert( p->apCsr[i]!=0 );
drhaa9b8962008-01-08 02:57:55 +00003854 assert( pIn2->flags & MEM_Blob );
drhd7556d22004-05-14 21:59:40 +00003855 if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
drhf0863fe2005-06-12 21:35:51 +00003856 assert( pC->isTable==0 );
drhaa9b8962008-01-08 02:57:55 +00003857 rc = ExpandBlob(pIn2);
danielk1977d908f5a2007-05-11 07:08:28 +00003858 if( rc==SQLITE_OK ){
drhaa9b8962008-01-08 02:57:55 +00003859 int nKey = pIn2->n;
3860 const char *zKey = pIn2->z;
3861 rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p3);
danielk1977d908f5a2007-05-11 07:08:28 +00003862 assert( pC->deferredMoveto==0 );
3863 pC->cacheStatus = CACHE_STALE;
3864 }
drh5e00f6c2001-09-13 13:46:56 +00003865 }
drh5e00f6c2001-09-13 13:46:56 +00003866 break;
3867}
3868
drhe14006d2008-03-25 17:23:32 +00003869/* Opcode: IdxDeleteM P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00003870**
drhe14006d2008-03-25 17:23:32 +00003871** The content of P3 registers starting at register P2 form
3872** an unpacked index key. This opcode removes that entry from the
danielk1977a7a8e142008-02-13 18:25:27 +00003873** index opened by cursor P1.
drh5e00f6c2001-09-13 13:46:56 +00003874*/
drhe14006d2008-03-25 17:23:32 +00003875case OP_IdxDelete: {
drh5e00f6c2001-09-13 13:46:56 +00003876 int i = pOp->p1;
drh9188b382004-05-14 21:12:22 +00003877 Cursor *pC;
drh5e00f6c2001-09-13 13:46:56 +00003878 BtCursor *pCrsr;
drhe14006d2008-03-25 17:23:32 +00003879 assert( pOp->p3>0 );
3880 assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem );
drh6810ce62004-01-31 19:22:56 +00003881 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003882 assert( p->apCsr[i]!=0 );
drhd7556d22004-05-14 21:59:40 +00003883 if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
danielk197775bab7d2006-01-23 13:09:45 +00003884 int res;
drhe14006d2008-03-25 17:23:32 +00003885 UnpackedRecord r;
3886 r.pKeyInfo = pC->pKeyInfo;
3887 r.nField = pOp->p3;
3888 r.needFree = 0;
3889 r.needDestroy = 0;
3890 r.aMem = &p->aMem[pOp->p2];
3891 rc = sqlite3BtreeMoveto(pCrsr, 0, &r, 0, 0, &res);
danielk197775bab7d2006-01-23 13:09:45 +00003892 if( rc==SQLITE_OK && res==0 ){
danielk19774adee202004-05-08 08:23:19 +00003893 rc = sqlite3BtreeDelete(pCrsr);
drh5e00f6c2001-09-13 13:46:56 +00003894 }
drh9188b382004-05-14 21:12:22 +00003895 assert( pC->deferredMoveto==0 );
drh76873ab2006-01-07 18:48:26 +00003896 pC->cacheStatus = CACHE_STALE;
drh5e00f6c2001-09-13 13:46:56 +00003897 }
drh5e00f6c2001-09-13 13:46:56 +00003898 break;
3899}
3900
drh2133d822008-01-03 18:44:59 +00003901/* Opcode: IdxRowid P1 P2 * * *
drh8721ce42001-11-07 14:22:00 +00003902**
drh2133d822008-01-03 18:44:59 +00003903** Write into register P2 an integer which is the last entry in the record at
drhf0863fe2005-06-12 21:35:51 +00003904** the end of the index key pointed to by cursor P1. This integer should be
3905** the rowid of the table entry to which this index entry points.
drh8721ce42001-11-07 14:22:00 +00003906**
drh3c899a62006-01-10 18:44:08 +00003907** See also: Rowid, MakeIdxRec.
drh8721ce42001-11-07 14:22:00 +00003908*/
drh4c583122008-01-04 22:01:03 +00003909case OP_IdxRowid: { /* out2-prerelease */
drh8721ce42001-11-07 14:22:00 +00003910 int i = pOp->p1;
drh8721ce42001-11-07 14:22:00 +00003911 BtCursor *pCrsr;
drhd7556d22004-05-14 21:59:40 +00003912 Cursor *pC;
drh8721ce42001-11-07 14:22:00 +00003913
drh6810ce62004-01-31 19:22:56 +00003914 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003915 assert( p->apCsr[i]!=0 );
drhd7556d22004-05-14 21:59:40 +00003916 if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
danielk19773d1bfea2004-05-14 11:00:53 +00003917 i64 rowid;
danielk1977452c9892004-05-13 05:16:15 +00003918
drhd7556d22004-05-14 21:59:40 +00003919 assert( pC->deferredMoveto==0 );
drhf0863fe2005-06-12 21:35:51 +00003920 assert( pC->isTable==0 );
drh4c583122008-01-04 22:01:03 +00003921 if( !pC->nullRow ){
drhb21c8cd2007-08-21 19:33:56 +00003922 rc = sqlite3VdbeIdxRowid(pCrsr, &rowid);
danielk19771d850a72004-05-31 08:26:49 +00003923 if( rc!=SQLITE_OK ){
3924 goto abort_due_to_error;
3925 }
danielk1977a7a8e142008-02-13 18:25:27 +00003926 MemSetTypeFlag(pOut, MEM_Int);
drh4c583122008-01-04 22:01:03 +00003927 pOut->u.i = rowid;
danielk19773d1bfea2004-05-14 11:00:53 +00003928 }
drh8721ce42001-11-07 14:22:00 +00003929 }
3930 break;
3931}
3932
danielk197761dd5832008-04-18 11:31:12 +00003933/* Opcode: IdxGE P1 P2 P3 P4 P5
drh8721ce42001-11-07 14:22:00 +00003934**
danielk197761dd5832008-04-18 11:31:12 +00003935** The P4 register values beginning with P3 form an unpacked index
3936** key that omits the ROWID. Compare this key value against the index
3937** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
drhf3218fe2004-05-28 08:21:02 +00003938**
danielk197761dd5832008-04-18 11:31:12 +00003939** If the P1 index entry is greater than or equal to the key value
3940** then jump to P2. Otherwise fall through to the next instruction.
drh772ae622004-05-19 13:13:08 +00003941**
danielk197761dd5832008-04-18 11:31:12 +00003942** If P5 is non-zero then the key value is increased by an epsilon
3943** prior to the comparison. This make the opcode work like IdxGT except
3944** that if the key from register P3 is a prefix of the key in the cursor,
3945** the result is false whereas it would be true with IdxGT.
drh8721ce42001-11-07 14:22:00 +00003946*/
drh98757152008-01-09 23:04:12 +00003947/* Opcode: IdxLT P1 P2 P3 * P5
drhc045ec52002-12-04 20:01:06 +00003948**
danielk197761dd5832008-04-18 11:31:12 +00003949** The P4 register values beginning with P3 form an unpacked index
3950** key that omits the ROWID. Compare this key value against the index
3951** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
drhf3218fe2004-05-28 08:21:02 +00003952**
danielk197761dd5832008-04-18 11:31:12 +00003953** If the P1 index entry is less than the key value then jump to P2.
3954** Otherwise fall through to the next instruction.
drh772ae622004-05-19 13:13:08 +00003955**
danielk197761dd5832008-04-18 11:31:12 +00003956** If P5 is non-zero then the key value is increased by an epsilon prior
3957** to the comparison. This makes the opcode work like IdxLE.
drhc045ec52002-12-04 20:01:06 +00003958*/
drh9cbf3422008-01-17 16:22:13 +00003959case OP_IdxLT: /* jump, in3 */
drh9cbf3422008-01-17 16:22:13 +00003960case OP_IdxGE: { /* jump, in3 */
drh8721ce42001-11-07 14:22:00 +00003961 int i= pOp->p1;
drhd7556d22004-05-14 21:59:40 +00003962 Cursor *pC;
drh8721ce42001-11-07 14:22:00 +00003963
drh6810ce62004-01-31 19:22:56 +00003964 assert( i>=0 && i<p->nCursor );
drh4774b132004-06-12 20:12:51 +00003965 assert( p->apCsr[i]!=0 );
drh4f26bb62005-09-08 14:17:20 +00003966 if( (pC = p->apCsr[i])->pCursor!=0 ){
drh0850b532006-01-31 19:31:43 +00003967 int res;
danielk197761dd5832008-04-18 11:31:12 +00003968 UnpackedRecord r;
drhd7556d22004-05-14 21:59:40 +00003969 assert( pC->deferredMoveto==0 );
drha05a7222008-01-19 03:35:58 +00003970 assert( pOp->p5==0 || pOp->p5==1 );
danielk197761dd5832008-04-18 11:31:12 +00003971 assert( pOp->p4type==P4_INT32 );
3972 r.pKeyInfo = pC->pKeyInfo;
3973 r.nField = pOp->p4.i;
3974 r.needFree = 0;
3975 r.needDestroy = 0;
3976 r.aMem = &p->aMem[pOp->p3];
drha05a7222008-01-19 03:35:58 +00003977 *pC->pIncrKey = pOp->p5;
danielk197761dd5832008-04-18 11:31:12 +00003978 rc = sqlite3VdbeIdxKeyCompare(pC, &r, 0, 0, &res);
drhd3d39e92004-05-20 22:16:29 +00003979 *pC->pIncrKey = 0;
drhc045ec52002-12-04 20:01:06 +00003980 if( pOp->opcode==OP_IdxLT ){
3981 res = -res;
drha05a7222008-01-19 03:35:58 +00003982 }else{
3983 assert( pOp->opcode==OP_IdxGE );
drh8721ce42001-11-07 14:22:00 +00003984 res++;
3985 }
3986 if( res>0 ){
3987 pc = pOp->p2 - 1 ;
3988 }
3989 }
3990 break;
3991}
3992
drh98757152008-01-09 23:04:12 +00003993/* Opcode: Destroy P1 P2 P3 * *
drh5e00f6c2001-09-13 13:46:56 +00003994**
3995** Delete an entire database table or index whose root page in the database
3996** file is given by P1.
drhb19a2bc2001-09-16 00:13:26 +00003997**
drh98757152008-01-09 23:04:12 +00003998** The table being destroyed is in the main database file if P3==0. If
3999** P3==1 then the table to be clear is in the auxiliary database file
drhf57b3392001-10-08 13:22:32 +00004000** that is used to store tables create using CREATE TEMPORARY TABLE.
4001**
drh205f48e2004-11-05 00:43:11 +00004002** If AUTOVACUUM is enabled then it is possible that another root page
4003** might be moved into the newly deleted root page in order to keep all
4004** root pages contiguous at the beginning of the database. The former
4005** value of the root page that moved - its value before the move occurred -
drh9cbf3422008-01-17 16:22:13 +00004006** is stored in register P2. If no page
drh98757152008-01-09 23:04:12 +00004007** movement was required (because the table being dropped was already
4008** the last one in the database) then a zero is stored in register P2.
4009** If AUTOVACUUM is disabled then a zero is stored in register P2.
drh205f48e2004-11-05 00:43:11 +00004010**
drhb19a2bc2001-09-16 00:13:26 +00004011** See also: Clear
drh5e00f6c2001-09-13 13:46:56 +00004012*/
drh98757152008-01-09 23:04:12 +00004013case OP_Destroy: { /* out2-prerelease */
danielk1977a0bf2652004-11-04 14:30:04 +00004014 int iMoved;
drh3765df42006-06-28 18:18:09 +00004015 int iCnt;
danielk1977212b2182006-06-23 14:32:08 +00004016#ifndef SQLITE_OMIT_VIRTUALTABLE
drh5a91a532007-01-05 16:39:43 +00004017 Vdbe *pVdbe;
danielk1977212b2182006-06-23 14:32:08 +00004018 iCnt = 0;
4019 for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){
4020 if( pVdbe->magic==VDBE_MAGIC_RUN && pVdbe->inVtabMethod<2 && pVdbe->pc>=0 ){
4021 iCnt++;
4022 }
4023 }
drh3765df42006-06-28 18:18:09 +00004024#else
4025 iCnt = db->activeVdbeCnt;
danielk1977212b2182006-06-23 14:32:08 +00004026#endif
4027 if( iCnt>1 ){
danielk1977e6efa742004-11-10 11:55:10 +00004028 rc = SQLITE_LOCKED;
drh77658e22007-12-04 16:54:52 +00004029 p->errorAction = OE_Abort;
danielk1977e6efa742004-11-10 11:55:10 +00004030 }else{
drh98757152008-01-09 23:04:12 +00004031 int iDb = pOp->p3;
danielk1977212b2182006-06-23 14:32:08 +00004032 assert( iCnt==1 );
drh98757152008-01-09 23:04:12 +00004033 assert( (p->btreeMask & (1<<iDb))!=0 );
4034 rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved);
danielk1977a7a8e142008-02-13 18:25:27 +00004035 MemSetTypeFlag(pOut, MEM_Int);
drh98757152008-01-09 23:04:12 +00004036 pOut->u.i = iMoved;
drh3765df42006-06-28 18:18:09 +00004037#ifndef SQLITE_OMIT_AUTOVACUUM
danielk1977e6efa742004-11-10 11:55:10 +00004038 if( rc==SQLITE_OK && iMoved!=0 ){
drh98757152008-01-09 23:04:12 +00004039 sqlite3RootPageMoved(&db->aDb[iDb], iMoved, pOp->p1);
danielk1977e6efa742004-11-10 11:55:10 +00004040 }
drh3765df42006-06-28 18:18:09 +00004041#endif
danielk1977a0bf2652004-11-04 14:30:04 +00004042 }
drh5e00f6c2001-09-13 13:46:56 +00004043 break;
4044}
4045
drhf57b3392001-10-08 13:22:32 +00004046/* Opcode: Clear P1 P2 *
drh5edc3122001-09-13 21:53:09 +00004047**
4048** Delete all contents of the database table or index whose root page
drhb19a2bc2001-09-16 00:13:26 +00004049** in the database file is given by P1. But, unlike Destroy, do not
drh5edc3122001-09-13 21:53:09 +00004050** remove the table or index from the database file.
drhb19a2bc2001-09-16 00:13:26 +00004051**
drhf57b3392001-10-08 13:22:32 +00004052** The table being clear is in the main database file if P2==0. If
4053** P2==1 then the table to be clear is in the auxiliary database file
4054** that is used to store tables create using CREATE TEMPORARY TABLE.
4055**
drhb19a2bc2001-09-16 00:13:26 +00004056** See also: Destroy
drh5edc3122001-09-13 21:53:09 +00004057*/
drh9cbf3422008-01-17 16:22:13 +00004058case OP_Clear: {
drhfb982642007-08-30 01:19:59 +00004059 assert( (p->btreeMask & (1<<pOp->p2))!=0 );
danielk19774adee202004-05-08 08:23:19 +00004060 rc = sqlite3BtreeClearTable(db->aDb[pOp->p2].pBt, pOp->p1);
drh5edc3122001-09-13 21:53:09 +00004061 break;
4062}
4063
drh4c583122008-01-04 22:01:03 +00004064/* Opcode: CreateTable P1 P2 * * *
drh5b2fd562001-09-13 15:21:31 +00004065**
drh4c583122008-01-04 22:01:03 +00004066** Allocate a new table in the main database file if P1==0 or in the
4067** auxiliary database file if P1==1 or in an attached database if
4068** P1>1. Write the root page number of the new table into
drh9cbf3422008-01-17 16:22:13 +00004069** register P2
drh5b2fd562001-09-13 15:21:31 +00004070**
drhc6b52df2002-01-04 03:09:29 +00004071** The difference between a table and an index is this: A table must
4072** have a 4-byte integer key and can have arbitrary data. An index
4073** has an arbitrary key but no data.
4074**
drhb19a2bc2001-09-16 00:13:26 +00004075** See also: CreateIndex
drh5b2fd562001-09-13 15:21:31 +00004076*/
drh4c583122008-01-04 22:01:03 +00004077/* Opcode: CreateIndex P1 P2 * * *
drhf57b3392001-10-08 13:22:32 +00004078**
drh4c583122008-01-04 22:01:03 +00004079** Allocate a new index in the main database file if P1==0 or in the
4080** auxiliary database file if P1==1 or in an attached database if
4081** P1>1. Write the root page number of the new table into
drh9cbf3422008-01-17 16:22:13 +00004082** register P2.
drhf57b3392001-10-08 13:22:32 +00004083**
drhc6b52df2002-01-04 03:09:29 +00004084** See documentation on OP_CreateTable for additional information.
drhf57b3392001-10-08 13:22:32 +00004085*/
drh4c583122008-01-04 22:01:03 +00004086case OP_CreateIndex: /* out2-prerelease */
4087case OP_CreateTable: { /* out2-prerelease */
drh5b2fd562001-09-13 15:21:31 +00004088 int pgno;
drhf328bc82004-05-10 23:29:49 +00004089 int flags;
drh234c39d2004-07-24 03:30:47 +00004090 Db *pDb;
4091 assert( pOp->p1>=0 && pOp->p1<db->nDb );
drhfb982642007-08-30 01:19:59 +00004092 assert( (p->btreeMask & (1<<pOp->p1))!=0 );
drh234c39d2004-07-24 03:30:47 +00004093 pDb = &db->aDb[pOp->p1];
4094 assert( pDb->pBt!=0 );
drhc6b52df2002-01-04 03:09:29 +00004095 if( pOp->opcode==OP_CreateTable ){
danielk197794076252004-05-14 12:16:11 +00004096 /* flags = BTREE_INTKEY; */
4097 flags = BTREE_LEAFDATA|BTREE_INTKEY;
drhc6b52df2002-01-04 03:09:29 +00004098 }else{
drhf328bc82004-05-10 23:29:49 +00004099 flags = BTREE_ZERODATA;
drhc6b52df2002-01-04 03:09:29 +00004100 }
drh234c39d2004-07-24 03:30:47 +00004101 rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags);
drh5b2fd562001-09-13 15:21:31 +00004102 if( rc==SQLITE_OK ){
drh98757152008-01-09 23:04:12 +00004103 pOut->u.i = pgno;
danielk1977a7a8e142008-02-13 18:25:27 +00004104 MemSetTypeFlag(pOut, MEM_Int);
drh5b2fd562001-09-13 15:21:31 +00004105 }
4106 break;
4107}
4108
drh98757152008-01-09 23:04:12 +00004109/* Opcode: ParseSchema P1 P2 * P4 *
drh234c39d2004-07-24 03:30:47 +00004110**
4111** Read and parse all entries from the SQLITE_MASTER table of database P1
drh66a51672008-01-03 00:01:23 +00004112** that match the WHERE clause P4. P2 is the "force" flag. Always do
drh3c23a882007-01-09 14:01:13 +00004113** the parsing if P2 is true. If P2 is false, then this routine is a
4114** no-op if the schema is not currently loaded. In other words, if P2
4115** is false, the SQLITE_MASTER table is only parsed if the rest of the
4116** schema is already loaded into the symbol table.
drh234c39d2004-07-24 03:30:47 +00004117**
4118** This opcode invokes the parser to create a new virtual machine,
shane21e7feb2008-05-30 15:59:49 +00004119** then runs the new virtual machine. It is thus a re-entrant opcode.
drh234c39d2004-07-24 03:30:47 +00004120*/
drh9cbf3422008-01-17 16:22:13 +00004121case OP_ParseSchema: {
drh234c39d2004-07-24 03:30:47 +00004122 char *zSql;
4123 int iDb = pOp->p1;
4124 const char *zMaster;
4125 InitData initData;
4126
4127 assert( iDb>=0 && iDb<db->nDb );
drh3c23a882007-01-09 14:01:13 +00004128 if( !pOp->p2 && !DbHasProperty(db, iDb, DB_SchemaLoaded) ){
4129 break;
4130 }
danielk197753c0f742005-03-29 03:10:59 +00004131 zMaster = SCHEMA_TABLE(iDb);
drh234c39d2004-07-24 03:30:47 +00004132 initData.db = db;
drhece3c722006-09-23 20:36:01 +00004133 initData.iDb = pOp->p1;
drh234c39d2004-07-24 03:30:47 +00004134 initData.pzErrMsg = &p->zErrMsg;
danielk19771e536952007-08-16 10:09:01 +00004135 zSql = sqlite3MPrintf(db,
drhece3c722006-09-23 20:36:01 +00004136 "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s",
danielk19772dca4ac2008-01-03 11:50:29 +00004137 db->aDb[iDb].zName, zMaster, pOp->p4.z);
drh71c697e2004-08-08 23:39:19 +00004138 if( zSql==0 ) goto no_mem;
drh7e8b8482008-01-23 03:03:05 +00004139 (void)sqlite3SafetyOff(db);
drh234c39d2004-07-24 03:30:47 +00004140 assert( db->init.busy==0 );
4141 db->init.busy = 1;
drh17435752007-08-16 04:30:38 +00004142 assert( !db->mallocFailed );
drh234c39d2004-07-24 03:30:47 +00004143 rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
drh15ca1df2006-07-26 13:43:30 +00004144 if( rc==SQLITE_ABORT ) rc = initData.rc;
drh17435752007-08-16 04:30:38 +00004145 sqlite3_free(zSql);
drh234c39d2004-07-24 03:30:47 +00004146 db->init.busy = 0;
drh7e8b8482008-01-23 03:03:05 +00004147 (void)sqlite3SafetyOn(db);
danielk1977261919c2005-12-06 12:52:59 +00004148 if( rc==SQLITE_NOMEM ){
danielk1977261919c2005-12-06 12:52:59 +00004149 goto no_mem;
4150 }
drh234c39d2004-07-24 03:30:47 +00004151 break;
4152}
4153
drhcfed7bc2006-03-13 14:28:05 +00004154#if !defined(SQLITE_OMIT_ANALYZE) && !defined(SQLITE_OMIT_PARSER)
drh98757152008-01-09 23:04:12 +00004155/* Opcode: LoadAnalysis P1 * * * *
drh497e4462005-07-23 03:18:40 +00004156**
4157** Read the sqlite_stat1 table for database P1 and load the content
4158** of that table into the internal index hash table. This will cause
4159** the analysis to be used when preparing all subsequent queries.
4160*/
drh9cbf3422008-01-17 16:22:13 +00004161case OP_LoadAnalysis: {
drh497e4462005-07-23 03:18:40 +00004162 int iDb = pOp->p1;
4163 assert( iDb>=0 && iDb<db->nDb );
drhcf1be452007-05-12 12:08:51 +00004164 rc = sqlite3AnalysisLoad(db, iDb);
drh497e4462005-07-23 03:18:40 +00004165 break;
4166}
drhcfed7bc2006-03-13 14:28:05 +00004167#endif /* !defined(SQLITE_OMIT_ANALYZE) && !defined(SQLITE_OMIT_PARSER) */
drh497e4462005-07-23 03:18:40 +00004168
drh98757152008-01-09 23:04:12 +00004169/* Opcode: DropTable P1 * * P4 *
drh956bc922004-07-24 17:38:29 +00004170**
4171** Remove the internal (in-memory) data structures that describe
drh66a51672008-01-03 00:01:23 +00004172** the table named P4 in database P1. This is called after a table
drh956bc922004-07-24 17:38:29 +00004173** is dropped in order to keep the internal representation of the
4174** schema consistent with what is on disk.
4175*/
drh9cbf3422008-01-17 16:22:13 +00004176case OP_DropTable: {
danielk19772dca4ac2008-01-03 11:50:29 +00004177 sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z);
drh956bc922004-07-24 17:38:29 +00004178 break;
4179}
4180
drh98757152008-01-09 23:04:12 +00004181/* Opcode: DropIndex P1 * * P4 *
drh956bc922004-07-24 17:38:29 +00004182**
4183** Remove the internal (in-memory) data structures that describe
drh66a51672008-01-03 00:01:23 +00004184** the index named P4 in database P1. This is called after an index
drh956bc922004-07-24 17:38:29 +00004185** is dropped in order to keep the internal representation of the
4186** schema consistent with what is on disk.
4187*/
drh9cbf3422008-01-17 16:22:13 +00004188case OP_DropIndex: {
danielk19772dca4ac2008-01-03 11:50:29 +00004189 sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z);
drh956bc922004-07-24 17:38:29 +00004190 break;
4191}
4192
drh98757152008-01-09 23:04:12 +00004193/* Opcode: DropTrigger P1 * * P4 *
drh956bc922004-07-24 17:38:29 +00004194**
4195** Remove the internal (in-memory) data structures that describe
drh66a51672008-01-03 00:01:23 +00004196** the trigger named P4 in database P1. This is called after a trigger
drh956bc922004-07-24 17:38:29 +00004197** is dropped in order to keep the internal representation of the
4198** schema consistent with what is on disk.
4199*/
drh9cbf3422008-01-17 16:22:13 +00004200case OP_DropTrigger: {
danielk19772dca4ac2008-01-03 11:50:29 +00004201 sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z);
drh956bc922004-07-24 17:38:29 +00004202 break;
4203}
4204
drh234c39d2004-07-24 03:30:47 +00004205
drhb7f91642004-10-31 02:22:47 +00004206#ifndef SQLITE_OMIT_INTEGRITY_CHECK
drh98757152008-01-09 23:04:12 +00004207/* Opcode: IntegrityCk P1 P2 P3 * P5
drh5e00f6c2001-09-13 13:46:56 +00004208**
drh98757152008-01-09 23:04:12 +00004209** Do an analysis of the currently open database. Store in
4210** register P1 the text of an error message describing any problems.
4211** If no problems are found, store a NULL in register P1.
drh1dcdbc02007-01-27 02:24:54 +00004212**
drh98757152008-01-09 23:04:12 +00004213** The register P3 contains the maximum number of allowed errors.
drh60a713c2008-01-21 16:22:45 +00004214** At most reg(P3) errors will be reported.
4215** In other words, the analysis stops as soon as reg(P1) errors are
4216** seen. Reg(P1) is updated with the number of errors remaining.
drhb19a2bc2001-09-16 00:13:26 +00004217**
drh79069752004-05-22 21:30:40 +00004218** The root page numbers of all tables in the database are integer
drh60a713c2008-01-21 16:22:45 +00004219** stored in reg(P1), reg(P1+1), reg(P1+2), .... There are P2 tables
drh98757152008-01-09 23:04:12 +00004220** total.
drh21504322002-06-25 13:16:02 +00004221**
drh98757152008-01-09 23:04:12 +00004222** If P5 is not zero, the check is done on the auxiliary database
drh21504322002-06-25 13:16:02 +00004223** file, not the main database file.
drh1dd397f2002-02-03 03:34:07 +00004224**
drh1dcdbc02007-01-27 02:24:54 +00004225** This opcode is used to implement the integrity_check pragma.
drh5e00f6c2001-09-13 13:46:56 +00004226*/
drhaaab5722002-02-19 13:39:21 +00004227case OP_IntegrityCk: {
drh98757152008-01-09 23:04:12 +00004228 int nRoot; /* Number of tables to check. (Number of root pages.) */
4229 int *aRoot; /* Array of rootpage numbers for tables to be checked */
4230 int j; /* Loop counter */
4231 int nErr; /* Number of errors reported */
4232 char *z; /* Text of the error report */
4233 Mem *pnErr; /* Register keeping track of errors remaining */
4234
4235 nRoot = pOp->p2;
drh79069752004-05-22 21:30:40 +00004236 assert( nRoot>0 );
drhe5ae5732008-06-15 02:51:47 +00004237 aRoot = sqlite3Malloc( sizeof(int)*(nRoot+1) );
drhcaec2f12003-01-07 02:47:47 +00004238 if( aRoot==0 ) goto no_mem;
drh98757152008-01-09 23:04:12 +00004239 assert( pOp->p3>0 && pOp->p3<=p->nMem );
4240 pnErr = &p->aMem[pOp->p3];
drh1dcdbc02007-01-27 02:24:54 +00004241 assert( (pnErr->flags & MEM_Int)!=0 );
drh98757152008-01-09 23:04:12 +00004242 assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 );
4243 pIn1 = &p->aMem[pOp->p1];
drh79069752004-05-22 21:30:40 +00004244 for(j=0; j<nRoot; j++){
drh98757152008-01-09 23:04:12 +00004245 aRoot[j] = sqlite3VdbeIntValue(&pIn1[j]);
drh1dd397f2002-02-03 03:34:07 +00004246 }
4247 aRoot[j] = 0;
drh98757152008-01-09 23:04:12 +00004248 assert( pOp->p5<db->nDb );
4249 assert( (p->btreeMask & (1<<pOp->p5))!=0 );
4250 z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot,
drh3c024d62007-03-30 11:23:45 +00004251 pnErr->u.i, &nErr);
4252 pnErr->u.i -= nErr;
drha05a7222008-01-19 03:35:58 +00004253 sqlite3VdbeMemSetNull(pIn1);
drh1dcdbc02007-01-27 02:24:54 +00004254 if( nErr==0 ){
4255 assert( z==0 );
drh1dd397f2002-02-03 03:34:07 +00004256 }else{
danielk1977a7a8e142008-02-13 18:25:27 +00004257 sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
danielk19778a6b5412004-05-24 07:04:25 +00004258 }
drhb7654112008-01-12 12:48:07 +00004259 UPDATE_MAX_BLOBSIZE(pIn1);
drh98757152008-01-09 23:04:12 +00004260 sqlite3VdbeChangeEncoding(pIn1, encoding);
drh17435752007-08-16 04:30:38 +00004261 sqlite3_free(aRoot);
drh5e00f6c2001-09-13 13:46:56 +00004262 break;
4263}
drhb7f91642004-10-31 02:22:47 +00004264#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
drh5e00f6c2001-09-13 13:46:56 +00004265
drh98757152008-01-09 23:04:12 +00004266/* Opcode: FifoWrite P1 * * * *
drh5e00f6c2001-09-13 13:46:56 +00004267**
drh98757152008-01-09 23:04:12 +00004268** Write the integer from register P1 into the Fifo.
drh5e00f6c2001-09-13 13:46:56 +00004269*/
drh9cbf3422008-01-17 16:22:13 +00004270case OP_FifoWrite: { /* in1 */
drh98757152008-01-09 23:04:12 +00004271 if( sqlite3VdbeFifoPush(&p->sFifo, sqlite3VdbeIntValue(pIn1))==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00004272 goto no_mem;
drh17435752007-08-16 04:30:38 +00004273 }
drh5e00f6c2001-09-13 13:46:56 +00004274 break;
4275}
4276
drh98757152008-01-09 23:04:12 +00004277/* Opcode: FifoRead P1 P2 * * *
drh5e00f6c2001-09-13 13:46:56 +00004278**
drh98757152008-01-09 23:04:12 +00004279** Attempt to read a single integer from the Fifo. Store that
4280** integer in register P1.
danielk197796cb76f2008-01-04 13:24:28 +00004281**
drh98757152008-01-09 23:04:12 +00004282** If the Fifo is empty jump to P2.
drh5e00f6c2001-09-13 13:46:56 +00004283*/
drh3a40f692008-01-04 16:50:09 +00004284case OP_FifoRead: { /* jump */
drhcaec2f12003-01-07 02:47:47 +00004285 CHECK_FOR_INTERRUPT;
drh98757152008-01-09 23:04:12 +00004286 assert( pOp->p1>0 && pOp->p1<=p->nMem );
4287 pOut = &p->aMem[pOp->p1];
danielk1977a7a8e142008-02-13 18:25:27 +00004288 MemSetTypeFlag(pOut, MEM_Int);
drh98757152008-01-09 23:04:12 +00004289 if( sqlite3VdbeFifoPop(&p->sFifo, &pOut->u.i)==SQLITE_DONE ){
drh5e00f6c2001-09-13 13:46:56 +00004290 pc = pOp->p2 - 1;
drh5e00f6c2001-09-13 13:46:56 +00004291 }
4292 break;
4293}
4294
danielk197793758c82005-01-21 08:13:14 +00004295#ifndef SQLITE_OMIT_TRIGGER
rdcb0c374f2004-02-20 22:53:38 +00004296/* Opcode: ContextPush * * *
4297**
4298** Save the current Vdbe context such that it can be restored by a ContextPop
4299** opcode. The context stores the last insert row id, the last statement change
4300** count, and the current statement change count.
4301*/
drh9cbf3422008-01-17 16:22:13 +00004302case OP_ContextPush: {
drh344737f2004-09-19 00:50:20 +00004303 int i = p->contextStackTop++;
4304 Context *pContext;
danielk1977b28af712004-06-21 06:50:26 +00004305
drh344737f2004-09-19 00:50:20 +00004306 assert( i>=0 );
danielk1977b28af712004-06-21 06:50:26 +00004307 /* FIX ME: This should be allocated as part of the vdbe at compile-time */
drh344737f2004-09-19 00:50:20 +00004308 if( i>=p->contextStackDepth ){
4309 p->contextStackDepth = i+1;
danielk19771e536952007-08-16 10:09:01 +00004310 p->contextStack = sqlite3DbReallocOrFree(db, p->contextStack,
drhcf643722007-03-27 13:36:37 +00004311 sizeof(Context)*(i+1));
drh344737f2004-09-19 00:50:20 +00004312 if( p->contextStack==0 ) goto no_mem;
4313 }
4314 pContext = &p->contextStack[i];
4315 pContext->lastRowid = db->lastRowid;
4316 pContext->nChange = p->nChange;
drha01f79d2005-07-08 13:07:59 +00004317 pContext->sFifo = p->sFifo;
4318 sqlite3VdbeFifoInit(&p->sFifo);
rdcb0c374f2004-02-20 22:53:38 +00004319 break;
4320}
4321
4322/* Opcode: ContextPop * * *
4323**
4324** Restore the Vdbe context to the state it was in when contextPush was last
4325** executed. The context stores the last insert row id, the last statement
4326** change count, and the current statement change count.
4327*/
drh9cbf3422008-01-17 16:22:13 +00004328case OP_ContextPop: {
drh344737f2004-09-19 00:50:20 +00004329 Context *pContext = &p->contextStack[--p->contextStackTop];
4330 assert( p->contextStackTop>=0 );
4331 db->lastRowid = pContext->lastRowid;
4332 p->nChange = pContext->nChange;
drha01f79d2005-07-08 13:07:59 +00004333 sqlite3VdbeFifoClear(&p->sFifo);
4334 p->sFifo = pContext->sFifo;
rdcb0c374f2004-02-20 22:53:38 +00004335 break;
4336}
danielk197793758c82005-01-21 08:13:14 +00004337#endif /* #ifndef SQLITE_OMIT_TRIGGER */
rdcb0c374f2004-02-20 22:53:38 +00004338
drh205f48e2004-11-05 00:43:11 +00004339#ifndef SQLITE_OMIT_AUTOINCREMENT
drh98757152008-01-09 23:04:12 +00004340/* Opcode: MemMax P1 P2 * * *
drh205f48e2004-11-05 00:43:11 +00004341**
drh98757152008-01-09 23:04:12 +00004342** Set the value of register P1 to the maximum of its current value
4343** and the value in register P2.
drh205f48e2004-11-05 00:43:11 +00004344**
4345** This instruction throws an error if the memory cell is not initially
4346** an integer.
4347*/
drh9cbf3422008-01-17 16:22:13 +00004348case OP_MemMax: { /* in1, in2 */
drh98757152008-01-09 23:04:12 +00004349 sqlite3VdbeMemIntegerify(pIn1);
4350 sqlite3VdbeMemIntegerify(pIn2);
4351 if( pIn1->u.i<pIn2->u.i){
4352 pIn1->u.i = pIn2->u.i;
drh205f48e2004-11-05 00:43:11 +00004353 }
4354 break;
4355}
4356#endif /* SQLITE_OMIT_AUTOINCREMENT */
4357
drh98757152008-01-09 23:04:12 +00004358/* Opcode: IfPos P1 P2 * * *
danielk1977a2dc3b12005-02-05 12:48:48 +00004359**
drh98757152008-01-09 23:04:12 +00004360** If the value of register P1 is 1 or greater, jump to P2.
drh6f58f702006-01-08 05:26:41 +00004361**
drh98757152008-01-09 23:04:12 +00004362** It is illegal to use this instruction on a register that does
drh6f58f702006-01-08 05:26:41 +00004363** not contain an integer. An assertion fault will result if you try.
danielk1977a2dc3b12005-02-05 12:48:48 +00004364*/
drh9cbf3422008-01-17 16:22:13 +00004365case OP_IfPos: { /* jump, in1 */
danielk1977a7a8e142008-02-13 18:25:27 +00004366 assert( pIn1->flags&MEM_Int );
drh3c84ddf2008-01-09 02:15:38 +00004367 if( pIn1->u.i>0 ){
drhec7429a2005-10-06 16:53:14 +00004368 pc = pOp->p2 - 1;
4369 }
4370 break;
4371}
4372
drh98757152008-01-09 23:04:12 +00004373/* Opcode: IfNeg P1 P2 * * *
drh15007a92006-01-08 18:10:17 +00004374**
drh98757152008-01-09 23:04:12 +00004375** If the value of register P1 is less than zero, jump to P2.
drh15007a92006-01-08 18:10:17 +00004376**
drh98757152008-01-09 23:04:12 +00004377** It is illegal to use this instruction on a register that does
drh15007a92006-01-08 18:10:17 +00004378** not contain an integer. An assertion fault will result if you try.
4379*/
drh9cbf3422008-01-17 16:22:13 +00004380case OP_IfNeg: { /* jump, in1 */
danielk1977a7a8e142008-02-13 18:25:27 +00004381 assert( pIn1->flags&MEM_Int );
drh3c84ddf2008-01-09 02:15:38 +00004382 if( pIn1->u.i<0 ){
drh15007a92006-01-08 18:10:17 +00004383 pc = pOp->p2 - 1;
4384 }
4385 break;
4386}
4387
drh98757152008-01-09 23:04:12 +00004388/* Opcode: IfZero P1 P2 * * *
drhec7429a2005-10-06 16:53:14 +00004389**
drh98757152008-01-09 23:04:12 +00004390** If the value of register P1 is exactly 0, jump to P2.
drh6f58f702006-01-08 05:26:41 +00004391**
drh98757152008-01-09 23:04:12 +00004392** It is illegal to use this instruction on a register that does
drh6f58f702006-01-08 05:26:41 +00004393** not contain an integer. An assertion fault will result if you try.
drhec7429a2005-10-06 16:53:14 +00004394*/
drh9cbf3422008-01-17 16:22:13 +00004395case OP_IfZero: { /* jump, in1 */
danielk1977a7a8e142008-02-13 18:25:27 +00004396 assert( pIn1->flags&MEM_Int );
drh3c84ddf2008-01-09 02:15:38 +00004397 if( pIn1->u.i==0 ){
drha2a49dc2008-01-02 14:28:13 +00004398 pc = pOp->p2 - 1;
4399 }
4400 break;
4401}
4402
drh98757152008-01-09 23:04:12 +00004403/* Opcode: AggStep * P2 P3 P4 P5
drhe5095352002-02-24 03:25:14 +00004404**
drh0bce8352002-02-28 00:41:10 +00004405** Execute the step function for an aggregate. The
drh98757152008-01-09 23:04:12 +00004406** function has P5 arguments. P4 is a pointer to the FuncDef
4407** structure that specifies the function. Use register
4408** P3 as the accumulator.
drhe5095352002-02-24 03:25:14 +00004409**
drh98757152008-01-09 23:04:12 +00004410** The P5 arguments are taken from register P2 and its
4411** successors.
drhe5095352002-02-24 03:25:14 +00004412*/
drh9cbf3422008-01-17 16:22:13 +00004413case OP_AggStep: {
drh98757152008-01-09 23:04:12 +00004414 int n = pOp->p5;
drhe5095352002-02-24 03:25:14 +00004415 int i;
drh6810ce62004-01-31 19:22:56 +00004416 Mem *pMem, *pRec;
danielk197722322fd2004-05-25 23:35:17 +00004417 sqlite3_context ctx;
danielk19776ddcca52004-05-24 23:48:25 +00004418 sqlite3_value **apVal;
drhe5095352002-02-24 03:25:14 +00004419
drh6810ce62004-01-31 19:22:56 +00004420 assert( n>=0 );
drh98757152008-01-09 23:04:12 +00004421 pRec = &p->aMem[pOp->p2];
danielk19776ddcca52004-05-24 23:48:25 +00004422 apVal = p->apArg;
4423 assert( apVal || n==0 );
drh6810ce62004-01-31 19:22:56 +00004424 for(i=0; i<n; i++, pRec++){
danielk1977c572ef72004-05-27 09:28:41 +00004425 apVal[i] = pRec;
drh8079a0d2006-01-12 17:20:50 +00004426 storeTypeInfo(pRec, encoding);
drhe5095352002-02-24 03:25:14 +00004427 }
danielk19772dca4ac2008-01-03 11:50:29 +00004428 ctx.pFunc = pOp->p4.pFunc;
drh98757152008-01-09 23:04:12 +00004429 assert( pOp->p3>0 && pOp->p3<=p->nMem );
4430 ctx.pMem = pMem = &p->aMem[pOp->p3];
drhabfcea22005-09-06 20:36:48 +00004431 pMem->n++;
drh90669c12006-01-20 15:45:36 +00004432 ctx.s.flags = MEM_Null;
4433 ctx.s.z = 0;
danielk19775f096132008-03-28 15:44:09 +00004434 ctx.s.zMalloc = 0;
drh90669c12006-01-20 15:45:36 +00004435 ctx.s.xDel = 0;
drhb21c8cd2007-08-21 19:33:56 +00004436 ctx.s.db = db;
drh1350b032002-02-27 19:00:20 +00004437 ctx.isError = 0;
danielk1977dc1bdc42004-06-11 10:51:27 +00004438 ctx.pColl = 0;
4439 if( ctx.pFunc->needCollSeq ){
4440 assert( pOp>p->aOp );
drh66a51672008-01-03 00:01:23 +00004441 assert( pOp[-1].p4type==P4_COLLSEQ );
danielk1977dc1bdc42004-06-11 10:51:27 +00004442 assert( pOp[-1].opcode==OP_CollSeq );
danielk19772dca4ac2008-01-03 11:50:29 +00004443 ctx.pColl = pOp[-1].p4.pColl;
danielk1977dc1bdc42004-06-11 10:51:27 +00004444 }
danielk19776ddcca52004-05-24 23:48:25 +00004445 (ctx.pFunc->xStep)(&ctx, n, apVal);
drh1350b032002-02-27 19:00:20 +00004446 if( ctx.isError ){
drhf089aa42008-07-08 19:34:06 +00004447 sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s));
drh69544ec2008-02-06 14:11:34 +00004448 rc = ctx.isError;
drh1350b032002-02-27 19:00:20 +00004449 }
drh90669c12006-01-20 15:45:36 +00004450 sqlite3VdbeMemRelease(&ctx.s);
drh5e00f6c2001-09-13 13:46:56 +00004451 break;
4452}
4453
drh98757152008-01-09 23:04:12 +00004454/* Opcode: AggFinal P1 P2 * P4 *
drh5e00f6c2001-09-13 13:46:56 +00004455**
drh13449892005-09-07 21:22:45 +00004456** Execute the finalizer function for an aggregate. P1 is
4457** the memory location that is the accumulator for the aggregate.
drha10a34b2005-09-07 22:09:48 +00004458**
4459** P2 is the number of arguments that the step function takes and
drh66a51672008-01-03 00:01:23 +00004460** P4 is a pointer to the FuncDef for this function. The P2
drha10a34b2005-09-07 22:09:48 +00004461** argument is not used by this opcode. It is only there to disambiguate
4462** functions that can take varying numbers of arguments. The
drh66a51672008-01-03 00:01:23 +00004463** P4 argument is only needed for the degenerate case where
drha10a34b2005-09-07 22:09:48 +00004464** the step function was not previously called.
drh5e00f6c2001-09-13 13:46:56 +00004465*/
drh9cbf3422008-01-17 16:22:13 +00004466case OP_AggFinal: {
drh13449892005-09-07 21:22:45 +00004467 Mem *pMem;
drh0a07c102008-01-03 18:03:08 +00004468 assert( pOp->p1>0 && pOp->p1<=p->nMem );
drh13449892005-09-07 21:22:45 +00004469 pMem = &p->aMem[pOp->p1];
drha10a34b2005-09-07 22:09:48 +00004470 assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
danielk19772dca4ac2008-01-03 11:50:29 +00004471 rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc);
drh90669c12006-01-20 15:45:36 +00004472 if( rc==SQLITE_ERROR ){
drhf089aa42008-07-08 19:34:06 +00004473 sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(pMem));
drh90669c12006-01-20 15:45:36 +00004474 }
drh2dca8682008-03-21 17:13:13 +00004475 sqlite3VdbeChangeEncoding(pMem, encoding);
drhb7654112008-01-12 12:48:07 +00004476 UPDATE_MAX_BLOBSIZE(pMem);
drh023ae032007-05-08 12:12:16 +00004477 if( sqlite3VdbeMemTooBig(pMem) ){
4478 goto too_big;
4479 }
drh5e00f6c2001-09-13 13:46:56 +00004480 break;
4481}
4482
drh5e00f6c2001-09-13 13:46:56 +00004483
drhfdbcdee2007-03-27 14:44:50 +00004484#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
drh98757152008-01-09 23:04:12 +00004485/* Opcode: Vacuum * * * * *
drh6f8c91c2003-12-07 00:24:35 +00004486**
4487** Vacuum the entire database. This opcode will cause other virtual
4488** machines to be created and run. It may not be called from within
4489** a transaction.
4490*/
drh9cbf3422008-01-17 16:22:13 +00004491case OP_Vacuum: {
danielk19774adee202004-05-08 08:23:19 +00004492 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
4493 rc = sqlite3RunVacuum(&p->zErrMsg, db);
4494 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
drh6f8c91c2003-12-07 00:24:35 +00004495 break;
4496}
drh154d4b22006-09-21 11:02:16 +00004497#endif
drh6f8c91c2003-12-07 00:24:35 +00004498
danielk1977dddbcdc2007-04-26 14:42:34 +00004499#if !defined(SQLITE_OMIT_AUTOVACUUM)
drh98757152008-01-09 23:04:12 +00004500/* Opcode: IncrVacuum P1 P2 * * *
danielk1977dddbcdc2007-04-26 14:42:34 +00004501**
4502** Perform a single step of the incremental vacuum procedure on
drhca5557f2007-05-04 18:30:40 +00004503** the P1 database. If the vacuum has finished, jump to instruction
danielk1977dddbcdc2007-04-26 14:42:34 +00004504** P2. Otherwise, fall through to the next instruction.
4505*/
drh9cbf3422008-01-17 16:22:13 +00004506case OP_IncrVacuum: { /* jump */
drhca5557f2007-05-04 18:30:40 +00004507 Btree *pBt;
4508
4509 assert( pOp->p1>=0 && pOp->p1<db->nDb );
drhfb982642007-08-30 01:19:59 +00004510 assert( (p->btreeMask & (1<<pOp->p1))!=0 );
drhca5557f2007-05-04 18:30:40 +00004511 pBt = db->aDb[pOp->p1].pBt;
danielk1977dddbcdc2007-04-26 14:42:34 +00004512 rc = sqlite3BtreeIncrVacuum(pBt);
4513 if( rc==SQLITE_DONE ){
4514 pc = pOp->p2 - 1;
4515 rc = SQLITE_OK;
4516 }
4517 break;
4518}
4519#endif
4520
drh98757152008-01-09 23:04:12 +00004521/* Opcode: Expire P1 * * * *
danielk1977a21c6b62005-01-24 10:25:59 +00004522**
4523** Cause precompiled statements to become expired. An expired statement
4524** fails with an error code of SQLITE_SCHEMA if it is ever executed
4525** (via sqlite3_step()).
4526**
4527** If P1 is 0, then all SQL statements become expired. If P1 is non-zero,
4528** then only the currently executing statement is affected.
4529*/
drh9cbf3422008-01-17 16:22:13 +00004530case OP_Expire: {
danielk1977a21c6b62005-01-24 10:25:59 +00004531 if( !pOp->p1 ){
4532 sqlite3ExpirePreparedStatements(db);
4533 }else{
4534 p->expired = 1;
4535 }
4536 break;
4537}
4538
danielk1977c00da102006-01-07 13:21:04 +00004539#ifndef SQLITE_OMIT_SHARED_CACHE
drh6a9ad3d2008-04-02 16:29:30 +00004540/* Opcode: TableLock P1 P2 P3 P4 *
danielk1977c00da102006-01-07 13:21:04 +00004541**
4542** Obtain a lock on a particular table. This instruction is only used when
4543** the shared-cache feature is enabled.
4544**
drh6a9ad3d2008-04-02 16:29:30 +00004545** If P1 is the index of the database in sqlite3.aDb[] of the database
4546** on which the lock is acquired. A readlock is obtained if P3==0 or
4547** a write lock if P3==1.
danielk1977c00da102006-01-07 13:21:04 +00004548**
4549** P2 contains the root-page of the table to lock.
4550**
drh66a51672008-01-03 00:01:23 +00004551** P4 contains a pointer to the name of the table being locked. This is only
danielk1977c00da102006-01-07 13:21:04 +00004552** used to generate an error message if the lock cannot be obtained.
4553*/
drh9cbf3422008-01-17 16:22:13 +00004554case OP_TableLock: {
danielk1977c00da102006-01-07 13:21:04 +00004555 int p1 = pOp->p1;
drh6a9ad3d2008-04-02 16:29:30 +00004556 u8 isWriteLock = pOp->p3;
drhfb982642007-08-30 01:19:59 +00004557 assert( p1>=0 && p1<db->nDb );
4558 assert( (p->btreeMask & (1<<p1))!=0 );
drh6a9ad3d2008-04-02 16:29:30 +00004559 assert( isWriteLock==0 || isWriteLock==1 );
danielk1977c00da102006-01-07 13:21:04 +00004560 rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock);
4561 if( rc==SQLITE_LOCKED ){
danielk19772dca4ac2008-01-03 11:50:29 +00004562 const char *z = pOp->p4.z;
drhf089aa42008-07-08 19:34:06 +00004563 sqlite3SetString(&p->zErrMsg, db, "database table is locked: %s", z);
danielk1977c00da102006-01-07 13:21:04 +00004564 }
4565 break;
4566}
drhb9bb7c12006-06-11 23:41:55 +00004567#endif /* SQLITE_OMIT_SHARED_CACHE */
4568
4569#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004570/* Opcode: VBegin * * * P4 *
drhb9bb7c12006-06-11 23:41:55 +00004571**
drh66a51672008-01-03 00:01:23 +00004572** P4 a pointer to an sqlite3_vtab structure. Call the xBegin method
danielk197778efaba2006-06-12 06:09:17 +00004573** for that table.
drhb9bb7c12006-06-11 23:41:55 +00004574*/
drh9cbf3422008-01-17 16:22:13 +00004575case OP_VBegin: {
danielk19772dca4ac2008-01-03 11:50:29 +00004576 rc = sqlite3VtabBegin(db, pOp->p4.pVtab);
danielk1977f9e7dda2006-06-16 16:08:53 +00004577 break;
4578}
4579#endif /* SQLITE_OMIT_VIRTUALTABLE */
4580
4581#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004582/* Opcode: VCreate P1 * * P4 *
danielk1977f9e7dda2006-06-16 16:08:53 +00004583**
drh66a51672008-01-03 00:01:23 +00004584** P4 is the name of a virtual table in database P1. Call the xCreate method
danielk1977f9e7dda2006-06-16 16:08:53 +00004585** for that table.
4586*/
drh9cbf3422008-01-17 16:22:13 +00004587case OP_VCreate: {
danielk19772dca4ac2008-01-03 11:50:29 +00004588 rc = sqlite3VtabCallCreate(db, pOp->p1, pOp->p4.z, &p->zErrMsg);
drhb9bb7c12006-06-11 23:41:55 +00004589 break;
4590}
4591#endif /* SQLITE_OMIT_VIRTUALTABLE */
4592
4593#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004594/* Opcode: VDestroy P1 * * P4 *
drhb9bb7c12006-06-11 23:41:55 +00004595**
drh66a51672008-01-03 00:01:23 +00004596** P4 is the name of a virtual table in database P1. Call the xDestroy method
danielk19779e39ce82006-06-12 16:01:21 +00004597** of that table.
drhb9bb7c12006-06-11 23:41:55 +00004598*/
drh9cbf3422008-01-17 16:22:13 +00004599case OP_VDestroy: {
danielk1977212b2182006-06-23 14:32:08 +00004600 p->inVtabMethod = 2;
danielk19772dca4ac2008-01-03 11:50:29 +00004601 rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z);
danielk1977212b2182006-06-23 14:32:08 +00004602 p->inVtabMethod = 0;
drhb9bb7c12006-06-11 23:41:55 +00004603 break;
4604}
4605#endif /* SQLITE_OMIT_VIRTUALTABLE */
danielk1977c00da102006-01-07 13:21:04 +00004606
drh9eff6162006-06-12 21:59:13 +00004607#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004608/* Opcode: VOpen P1 * * P4 *
drh9eff6162006-06-12 21:59:13 +00004609**
drh66a51672008-01-03 00:01:23 +00004610** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
drh9eff6162006-06-12 21:59:13 +00004611** P1 is a cursor number. This opcode opens a cursor to the virtual
4612** table and stores that cursor in P1.
4613*/
drh9cbf3422008-01-17 16:22:13 +00004614case OP_VOpen: {
danielk1977b7a7b9a2006-06-13 10:24:42 +00004615 Cursor *pCur = 0;
4616 sqlite3_vtab_cursor *pVtabCursor = 0;
4617
danielk19772dca4ac2008-01-03 11:50:29 +00004618 sqlite3_vtab *pVtab = pOp->p4.pVtab;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004619 sqlite3_module *pModule = (sqlite3_module *)pVtab->pModule;
4620
4621 assert(pVtab && pModule);
4622 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
4623 rc = pModule->xOpen(pVtab, &pVtabCursor);
4624 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
4625 if( SQLITE_OK==rc ){
shane21e7feb2008-05-30 15:59:49 +00004626 /* Initialize sqlite3_vtab_cursor base class */
danielk1977b7a7b9a2006-06-13 10:24:42 +00004627 pVtabCursor->pVtab = pVtab;
4628
4629 /* Initialise vdbe cursor object */
danielk1977cd3e8f72008-03-25 09:47:35 +00004630 pCur = allocateCursor(p, pOp->p1, &pOp[-1], -1, 0);
danielk1977be718892006-06-23 08:05:19 +00004631 if( pCur ){
4632 pCur->pVtabCursor = pVtabCursor;
4633 pCur->pModule = pVtabCursor->pVtab->pModule;
danielk1977b7a2f2e2006-06-23 11:34:54 +00004634 }else{
drh17435752007-08-16 04:30:38 +00004635 db->mallocFailed = 1;
danielk1977b7a2f2e2006-06-23 11:34:54 +00004636 pModule->xClose(pVtabCursor);
danielk1977be718892006-06-23 08:05:19 +00004637 }
danielk1977b7a7b9a2006-06-13 10:24:42 +00004638 }
drh9eff6162006-06-12 21:59:13 +00004639 break;
4640}
4641#endif /* SQLITE_OMIT_VIRTUALTABLE */
4642
4643#ifndef SQLITE_OMIT_VIRTUALTABLE
danielk19776dbee812008-01-03 18:39:41 +00004644/* Opcode: VFilter P1 P2 P3 P4 *
drh9eff6162006-06-12 21:59:13 +00004645**
4646** P1 is a cursor opened using VOpen. P2 is an address to jump to if
4647** the filtered result set is empty.
4648**
drh66a51672008-01-03 00:01:23 +00004649** P4 is either NULL or a string that was generated by the xBestIndex
4650** method of the module. The interpretation of the P4 string is left
drh4be8b512006-06-13 23:51:34 +00004651** to the module implementation.
danielk19775fac9f82006-06-13 14:16:58 +00004652**
drh9eff6162006-06-12 21:59:13 +00004653** This opcode invokes the xFilter method on the virtual table specified
danielk19776dbee812008-01-03 18:39:41 +00004654** by P1. The integer query plan parameter to xFilter is stored in register
4655** P3. Register P3+1 stores the argc parameter to be passed to the
drh174edc62008-05-29 05:23:41 +00004656** xFilter method. Registers P3+2..P3+1+argc are the argc
4657** additional parameters which are passed to
danielk19776dbee812008-01-03 18:39:41 +00004658** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter.
danielk1977b7a7b9a2006-06-13 10:24:42 +00004659**
danielk19776dbee812008-01-03 18:39:41 +00004660** A jump is made to P2 if the result set after filtering would be empty.
drh9eff6162006-06-12 21:59:13 +00004661*/
drh9cbf3422008-01-17 16:22:13 +00004662case OP_VFilter: { /* jump */
danielk1977b7a7b9a2006-06-13 10:24:42 +00004663 int nArg;
danielk19776dbee812008-01-03 18:39:41 +00004664 int iQuery;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004665 const sqlite3_module *pModule;
danielk19776dbee812008-01-03 18:39:41 +00004666 Mem *pQuery = &p->aMem[pOp->p3];
4667 Mem *pArgc = &pQuery[1];
danielk1977b7a7b9a2006-06-13 10:24:42 +00004668
4669 Cursor *pCur = p->apCsr[pOp->p1];
drh5b6afba2008-01-05 16:29:28 +00004670
4671 REGISTER_TRACE(pOp->p3, pQuery);
danielk1977b7a7b9a2006-06-13 10:24:42 +00004672 assert( pCur->pVtabCursor );
4673 pModule = pCur->pVtabCursor->pVtab->pModule;
4674
drh9cbf3422008-01-17 16:22:13 +00004675 /* Grab the index number and argc parameters */
danielk19776dbee812008-01-03 18:39:41 +00004676 assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int );
4677 nArg = pArgc->u.i;
4678 iQuery = pQuery->u.i;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004679
drh644a5292006-12-20 14:53:38 +00004680 /* Invoke the xFilter method */
4681 {
drh3f87d2a2006-12-20 14:31:24 +00004682 int res = 0;
drh4be8b512006-06-13 23:51:34 +00004683 int i;
4684 Mem **apArg = p->apArg;
4685 for(i = 0; i<nArg; i++){
danielk19776dbee812008-01-03 18:39:41 +00004686 apArg[i] = &pArgc[i+1];
drh4be8b512006-06-13 23:51:34 +00004687 storeTypeInfo(apArg[i], 0);
danielk19775fac9f82006-06-13 14:16:58 +00004688 }
danielk1977b7a7b9a2006-06-13 10:24:42 +00004689
4690 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
danielk1977be718892006-06-23 08:05:19 +00004691 p->inVtabMethod = 1;
danielk19776dbee812008-01-03 18:39:41 +00004692 rc = pModule->xFilter(pCur->pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
danielk1977be718892006-06-23 08:05:19 +00004693 p->inVtabMethod = 0;
danielk1977a298e902006-06-22 09:53:48 +00004694 if( rc==SQLITE_OK ){
4695 res = pModule->xEof(pCur->pVtabCursor);
4696 }
danielk1977b7a7b9a2006-06-13 10:24:42 +00004697 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
4698
danielk1977a298e902006-06-22 09:53:48 +00004699 if( res ){
danielk1977b7a7b9a2006-06-13 10:24:42 +00004700 pc = pOp->p2 - 1;
4701 }
4702 }
drh1d454a32008-01-31 19:34:51 +00004703 pCur->nullRow = 0;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004704
drh9eff6162006-06-12 21:59:13 +00004705 break;
4706}
4707#endif /* SQLITE_OMIT_VIRTUALTABLE */
4708
4709#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004710/* Opcode: VRowid P1 P2 * * *
drh9eff6162006-06-12 21:59:13 +00004711**
drh2133d822008-01-03 18:44:59 +00004712** Store into register P2 the rowid of
drh9eff6162006-06-12 21:59:13 +00004713** the virtual-table that the P1 cursor is pointing to.
4714*/
drh4c583122008-01-04 22:01:03 +00004715case OP_VRowid: { /* out2-prerelease */
danielk1977b7a7b9a2006-06-13 10:24:42 +00004716 const sqlite3_module *pModule;
drhde4fcfd2008-01-19 23:50:26 +00004717 sqlite_int64 iRow;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004718 Cursor *pCur = p->apCsr[pOp->p1];
drhde4fcfd2008-01-19 23:50:26 +00004719
danielk1977b7a7b9a2006-06-13 10:24:42 +00004720 assert( pCur->pVtabCursor );
drh2945b4a2008-01-31 15:53:45 +00004721 if( pCur->nullRow ){
4722 break;
4723 }
danielk1977b7a7b9a2006-06-13 10:24:42 +00004724 pModule = pCur->pVtabCursor->pVtab->pModule;
drhde4fcfd2008-01-19 23:50:26 +00004725 assert( pModule->xRowid );
4726 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
4727 rc = pModule->xRowid(pCur->pVtabCursor, &iRow);
4728 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
danielk1977a7a8e142008-02-13 18:25:27 +00004729 MemSetTypeFlag(pOut, MEM_Int);
drhde4fcfd2008-01-19 23:50:26 +00004730 pOut->u.i = iRow;
drh9eff6162006-06-12 21:59:13 +00004731 break;
4732}
4733#endif /* SQLITE_OMIT_VIRTUALTABLE */
4734
4735#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004736/* Opcode: VColumn P1 P2 P3 * *
drh9eff6162006-06-12 21:59:13 +00004737**
drh2133d822008-01-03 18:44:59 +00004738** Store the value of the P2-th column of
4739** the row of the virtual-table that the
4740** P1 cursor is pointing to into register P3.
drh9eff6162006-06-12 21:59:13 +00004741*/
4742case OP_VColumn: {
danielk1977b7a7b9a2006-06-13 10:24:42 +00004743 const sqlite3_module *pModule;
drhde4fcfd2008-01-19 23:50:26 +00004744 Mem *pDest;
4745 sqlite3_context sContext;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004746
4747 Cursor *pCur = p->apCsr[pOp->p1];
4748 assert( pCur->pVtabCursor );
drh2945b4a2008-01-31 15:53:45 +00004749 assert( pOp->p3>0 && pOp->p3<=p->nMem );
4750 pDest = &p->aMem[pOp->p3];
4751 if( pCur->nullRow ){
4752 sqlite3VdbeMemSetNull(pDest);
4753 break;
4754 }
danielk1977b7a7b9a2006-06-13 10:24:42 +00004755 pModule = pCur->pVtabCursor->pVtab->pModule;
drhde4fcfd2008-01-19 23:50:26 +00004756 assert( pModule->xColumn );
4757 memset(&sContext, 0, sizeof(sContext));
danielk1977a7a8e142008-02-13 18:25:27 +00004758
4759 /* The output cell may already have a buffer allocated. Move
4760 ** the current contents to sContext.s so in case the user-function
4761 ** can use the already allocated buffer instead of allocating a
4762 ** new one.
4763 */
4764 sqlite3VdbeMemMove(&sContext.s, pDest);
4765 MemSetTypeFlag(&sContext.s, MEM_Null);
4766
drhde4fcfd2008-01-19 23:50:26 +00004767 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
4768 rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2);
danielk1977b7a7b9a2006-06-13 10:24:42 +00004769
drhde4fcfd2008-01-19 23:50:26 +00004770 /* Copy the result of the function to the P3 register. We
4771 ** do this regardless of whether or not an error occured to ensure any
4772 ** dynamic allocation in sContext.s (a Mem struct) is released.
4773 */
4774 sqlite3VdbeChangeEncoding(&sContext.s, encoding);
drhde4fcfd2008-01-19 23:50:26 +00004775 REGISTER_TRACE(pOp->p3, pDest);
4776 sqlite3VdbeMemMove(pDest, &sContext.s);
4777 UPDATE_MAX_BLOBSIZE(pDest);
danielk1977b7a7b9a2006-06-13 10:24:42 +00004778
drhde4fcfd2008-01-19 23:50:26 +00004779 if( sqlite3SafetyOn(db) ){
4780 goto abort_due_to_misuse;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004781 }
drhde4fcfd2008-01-19 23:50:26 +00004782 if( sqlite3VdbeMemTooBig(pDest) ){
4783 goto too_big;
4784 }
drh9eff6162006-06-12 21:59:13 +00004785 break;
4786}
4787#endif /* SQLITE_OMIT_VIRTUALTABLE */
4788
4789#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004790/* Opcode: VNext P1 P2 * * *
drh9eff6162006-06-12 21:59:13 +00004791**
4792** Advance virtual table P1 to the next row in its result set and
4793** jump to instruction P2. Or, if the virtual table has reached
4794** the end of its result set, then fall through to the next instruction.
4795*/
drh9cbf3422008-01-17 16:22:13 +00004796case OP_VNext: { /* jump */
danielk1977b7a7b9a2006-06-13 10:24:42 +00004797 const sqlite3_module *pModule;
4798 int res = 0;
4799
4800 Cursor *pCur = p->apCsr[pOp->p1];
4801 assert( pCur->pVtabCursor );
drh2945b4a2008-01-31 15:53:45 +00004802 if( pCur->nullRow ){
4803 break;
4804 }
danielk1977b7a7b9a2006-06-13 10:24:42 +00004805 pModule = pCur->pVtabCursor->pVtab->pModule;
drhde4fcfd2008-01-19 23:50:26 +00004806 assert( pModule->xNext );
danielk1977b7a7b9a2006-06-13 10:24:42 +00004807
drhde4fcfd2008-01-19 23:50:26 +00004808 /* Invoke the xNext() method of the module. There is no way for the
4809 ** underlying implementation to return an error if one occurs during
4810 ** xNext(). Instead, if an error occurs, true is returned (indicating that
4811 ** data is available) and the error code returned when xColumn or
4812 ** some other method is next invoked on the save virtual table cursor.
4813 */
4814 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
4815 p->inVtabMethod = 1;
4816 rc = pModule->xNext(pCur->pVtabCursor);
4817 p->inVtabMethod = 0;
4818 if( rc==SQLITE_OK ){
4819 res = pModule->xEof(pCur->pVtabCursor);
danielk1977b7a7b9a2006-06-13 10:24:42 +00004820 }
drhde4fcfd2008-01-19 23:50:26 +00004821 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
danielk1977b7a7b9a2006-06-13 10:24:42 +00004822
drhde4fcfd2008-01-19 23:50:26 +00004823 if( !res ){
4824 /* If there is data, jump to P2 */
4825 pc = pOp->p2 - 1;
4826 }
drh9eff6162006-06-12 21:59:13 +00004827 break;
4828}
4829#endif /* SQLITE_OMIT_VIRTUALTABLE */
4830
danielk1977182c4ba2007-06-27 15:53:34 +00004831#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004832/* Opcode: VRename P1 * * P4 *
danielk1977182c4ba2007-06-27 15:53:34 +00004833**
drh66a51672008-01-03 00:01:23 +00004834** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
danielk1977182c4ba2007-06-27 15:53:34 +00004835** This opcode invokes the corresponding xRename method. The value
danielk19776dbee812008-01-03 18:39:41 +00004836** in register P1 is passed as the zName argument to the xRename method.
danielk1977182c4ba2007-06-27 15:53:34 +00004837*/
drh9cbf3422008-01-17 16:22:13 +00004838case OP_VRename: {
danielk19772dca4ac2008-01-03 11:50:29 +00004839 sqlite3_vtab *pVtab = pOp->p4.pVtab;
danielk19776dbee812008-01-03 18:39:41 +00004840 Mem *pName = &p->aMem[pOp->p1];
danielk1977182c4ba2007-06-27 15:53:34 +00004841 assert( pVtab->pModule->xRename );
drh5b6afba2008-01-05 16:29:28 +00004842 REGISTER_TRACE(pOp->p1, pName);
danielk1977182c4ba2007-06-27 15:53:34 +00004843
danielk19776dbee812008-01-03 18:39:41 +00004844 Stringify(pName, encoding);
danielk1977182c4ba2007-06-27 15:53:34 +00004845
4846 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
4847 sqlite3VtabLock(pVtab);
danielk19776dbee812008-01-03 18:39:41 +00004848 rc = pVtab->pModule->xRename(pVtab, pName->z);
danielk1977182c4ba2007-06-27 15:53:34 +00004849 sqlite3VtabUnlock(db, pVtab);
4850 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
4851
danielk1977182c4ba2007-06-27 15:53:34 +00004852 break;
4853}
4854#endif
drh4cbdda92006-06-14 19:00:20 +00004855
4856#ifndef SQLITE_OMIT_VIRTUALTABLE
drh98757152008-01-09 23:04:12 +00004857/* Opcode: VUpdate P1 P2 P3 P4 *
danielk1977399918f2006-06-14 13:03:23 +00004858**
drh66a51672008-01-03 00:01:23 +00004859** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
danielk1977399918f2006-06-14 13:03:23 +00004860** This opcode invokes the corresponding xUpdate method. P2 values
danielk19772a339ff2008-01-03 17:31:44 +00004861** are contiguous memory cells starting at P3 to pass to the xUpdate
4862** invocation. The value in register (P3+P2-1) corresponds to the
4863** p2th element of the argv array passed to xUpdate.
drh4cbdda92006-06-14 19:00:20 +00004864**
4865** The xUpdate method will do a DELETE or an INSERT or both.
danielk19772a339ff2008-01-03 17:31:44 +00004866** The argv[0] element (which corresponds to memory cell P3)
4867** is the rowid of a row to delete. If argv[0] is NULL then no
4868** deletion occurs. The argv[1] element is the rowid of the new
4869** row. This can be NULL to have the virtual table select the new
4870** rowid for itself. The subsequent elements in the array are
4871** the values of columns in the new row.
drh4cbdda92006-06-14 19:00:20 +00004872**
4873** If P2==1 then no insert is performed. argv[0] is the rowid of
4874** a row to delete.
danielk19771f6eec52006-06-16 06:17:47 +00004875**
4876** P1 is a boolean flag. If it is set to true and the xUpdate call
4877** is successful, then the value returned by sqlite3_last_insert_rowid()
4878** is set to the value of the rowid for the row just inserted.
danielk1977399918f2006-06-14 13:03:23 +00004879*/
drh9cbf3422008-01-17 16:22:13 +00004880case OP_VUpdate: {
danielk19772dca4ac2008-01-03 11:50:29 +00004881 sqlite3_vtab *pVtab = pOp->p4.pVtab;
danielk1977399918f2006-06-14 13:03:23 +00004882 sqlite3_module *pModule = (sqlite3_module *)pVtab->pModule;
drh4cbdda92006-06-14 19:00:20 +00004883 int nArg = pOp->p2;
drh66a51672008-01-03 00:01:23 +00004884 assert( pOp->p4type==P4_VTAB );
danielk1977399918f2006-06-14 13:03:23 +00004885 if( pModule->xUpdate==0 ){
drhf089aa42008-07-08 19:34:06 +00004886 sqlite3SetString(&p->zErrMsg, db, "read-only table");
danielk1977399918f2006-06-14 13:03:23 +00004887 rc = SQLITE_ERROR;
4888 }else{
4889 int i;
danielk19771f6eec52006-06-16 06:17:47 +00004890 sqlite_int64 rowid;
danielk1977399918f2006-06-14 13:03:23 +00004891 Mem **apArg = p->apArg;
danielk19772a339ff2008-01-03 17:31:44 +00004892 Mem *pX = &p->aMem[pOp->p3];
4893 for(i=0; i<nArg; i++){
drh9c419382006-06-16 21:13:21 +00004894 storeTypeInfo(pX, 0);
4895 apArg[i] = pX;
danielk19772a339ff2008-01-03 17:31:44 +00004896 pX++;
danielk1977399918f2006-06-14 13:03:23 +00004897 }
danielk1977c7d54102006-06-15 07:29:00 +00004898 if( sqlite3SafetyOff(db) ) goto abort_due_to_misuse;
drh189d4af2006-09-02 20:57:52 +00004899 sqlite3VtabLock(pVtab);
danielk19771f6eec52006-06-16 06:17:47 +00004900 rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid);
danielk1977a04a34f2007-04-16 15:06:25 +00004901 sqlite3VtabUnlock(db, pVtab);
danielk1977c7d54102006-06-15 07:29:00 +00004902 if( sqlite3SafetyOn(db) ) goto abort_due_to_misuse;
danielk19771f6eec52006-06-16 06:17:47 +00004903 if( pOp->p1 && rc==SQLITE_OK ){
4904 assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) );
4905 db->lastRowid = rowid;
4906 }
drhb5df1442008-04-10 14:00:09 +00004907 p->nChange++;
danielk1977399918f2006-06-14 13:03:23 +00004908 }
drh4cbdda92006-06-14 19:00:20 +00004909 break;
danielk1977399918f2006-06-14 13:03:23 +00004910}
4911#endif /* SQLITE_OMIT_VIRTUALTABLE */
4912
danielk197759a93792008-05-15 17:48:20 +00004913#ifndef SQLITE_OMIT_PAGER_PRAGMAS
4914/* Opcode: Pagecount P1 P2 * * *
4915**
4916** Write the current number of pages in database P1 to memory cell P2.
4917*/
4918case OP_Pagecount: { /* out2-prerelease */
4919 int p1 = pOp->p1;
4920 int nPage;
4921 Pager *pPager = sqlite3BtreePager(db->aDb[p1].pBt);
4922
danielk1977ad0132d2008-06-07 08:58:22 +00004923 rc = sqlite3PagerPagecount(pPager, &nPage);
4924 if( rc==SQLITE_OK ){
danielk197759a93792008-05-15 17:48:20 +00004925 pOut->flags = MEM_Int;
4926 pOut->u.i = nPage;
4927 }
4928 break;
4929}
4930#endif
4931
drh949f9cd2008-01-12 21:35:57 +00004932#ifndef SQLITE_OMIT_TRACE
4933/* Opcode: Trace * * * P4 *
4934**
4935** If tracing is enabled (by the sqlite3_trace()) interface, then
4936** the UTF-8 string contained in P4 is emitted on the trace callback.
4937*/
4938case OP_Trace: {
4939 if( pOp->p4.z ){
4940 if( db->xTrace ){
4941 db->xTrace(db->pTraceArg, pOp->p4.z);
4942 }
4943#ifdef SQLITE_DEBUG
4944 if( (db->flags & SQLITE_SqlTrace)!=0 ){
4945 sqlite3DebugPrintf("SQL-trace: %s\n", pOp->p4.z);
4946 }
4947#endif /* SQLITE_DEBUG */
4948 }
4949 break;
4950}
4951#endif
4952
drh91fd4d42008-01-19 20:11:25 +00004953
4954/* Opcode: Noop * * * * *
4955**
4956** Do nothing. This instruction is often useful as a jump
4957** destination.
drh5e00f6c2001-09-13 13:46:56 +00004958*/
drh91fd4d42008-01-19 20:11:25 +00004959/*
4960** The magic Explain opcode are only inserted when explain==2 (which
4961** is to say when the EXPLAIN QUERY PLAN syntax is used.)
4962** This opcode records information from the optimizer. It is the
4963** the same as a no-op. This opcodesnever appears in a real VM program.
4964*/
4965default: { /* This is really OP_Noop and OP_Explain */
drh5e00f6c2001-09-13 13:46:56 +00004966 break;
4967}
4968
4969/*****************************************************************************
4970** The cases of the switch statement above this line should all be indented
4971** by 6 spaces. But the left-most 6 spaces have been removed to improve the
4972** readability. From this point on down, the normal indentation rules are
4973** restored.
4974*****************************************************************************/
4975 }
drh6e142f52000-06-08 13:36:40 +00004976
drh7b396862003-01-01 23:06:20 +00004977#ifdef VDBE_PROFILE
drh8178a752003-01-05 21:41:40 +00004978 {
shane9bcbdad2008-05-29 20:22:37 +00004979 u64 elapsed = sqlite3Hwtime() - start;
4980 pOp->cycles += elapsed;
drh8178a752003-01-05 21:41:40 +00004981 pOp->cnt++;
4982#if 0
shane9bcbdad2008-05-29 20:22:37 +00004983 fprintf(stdout, "%10llu ", elapsed);
danielk19774adee202004-05-08 08:23:19 +00004984 sqlite3VdbePrintOp(stdout, origPc, &p->aOp[origPc]);
drh8178a752003-01-05 21:41:40 +00004985#endif
4986 }
drh7b396862003-01-01 23:06:20 +00004987#endif
4988
drh6e142f52000-06-08 13:36:40 +00004989 /* The following code adds nothing to the actual functionality
4990 ** of the program. It is only here for testing and debugging.
4991 ** On the other hand, it does burn CPU cycles every time through
4992 ** the evaluator loop. So we can leave it out when NDEBUG is defined.
4993 */
4994#ifndef NDEBUG
drha6110402005-07-28 20:51:19 +00004995 assert( pc>=-1 && pc<p->nOp );
drhae7e1512007-05-02 16:51:59 +00004996
drhcf1023c2007-05-08 20:59:49 +00004997#ifdef SQLITE_DEBUG
drh5b6afba2008-01-05 16:29:28 +00004998 if( p->trace ){
4999 if( rc!=0 ) fprintf(p->trace,"rc=%d\n",rc);
drhca48c902008-01-18 14:08:24 +00005000 if( opProperty & OPFLG_OUT2_PRERELEASE ){
drh5b6afba2008-01-05 16:29:28 +00005001 registerTrace(p->trace, pOp->p2, pOut);
drh75897232000-05-29 14:26:00 +00005002 }
drhca48c902008-01-18 14:08:24 +00005003 if( opProperty & OPFLG_OUT3 ){
drh5b6afba2008-01-05 16:29:28 +00005004 registerTrace(p->trace, pOp->p3, pOut);
5005 }
drh75897232000-05-29 14:26:00 +00005006 }
danielk1977b5402fb2005-01-12 07:15:04 +00005007#endif /* SQLITE_DEBUG */
5008#endif /* NDEBUG */
drhb86ccfb2003-01-28 23:13:10 +00005009 } /* The end of the for(;;) loop the loops through opcodes */
drh75897232000-05-29 14:26:00 +00005010
drha05a7222008-01-19 03:35:58 +00005011 /* If we reach this point, it means that execution is finished with
5012 ** an error of some kind.
drhb86ccfb2003-01-28 23:13:10 +00005013 */
drha05a7222008-01-19 03:35:58 +00005014vdbe_error_halt:
5015 assert( rc );
5016 p->rc = rc;
drh92f02c32004-09-02 14:57:08 +00005017 sqlite3VdbeHalt(p);
danielk19777eaabcd2008-07-07 14:56:56 +00005018 if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
5019 rc = SQLITE_ERROR;
drh900b31e2007-08-28 02:27:51 +00005020
5021 /* This is the only way out of this procedure. We have to
5022 ** release the mutexes on btrees that were acquired at the
5023 ** top. */
5024vdbe_return:
drh4cf7c7f2007-08-28 23:28:07 +00005025 sqlite3BtreeMutexArrayLeave(&p->aMutex);
drhb86ccfb2003-01-28 23:13:10 +00005026 return rc;
5027
drh023ae032007-05-08 12:12:16 +00005028 /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH
5029 ** is encountered.
5030 */
5031too_big:
drhf089aa42008-07-08 19:34:06 +00005032 sqlite3SetString(&p->zErrMsg, db, "string or blob too big");
drh023ae032007-05-08 12:12:16 +00005033 rc = SQLITE_TOOBIG;
drha05a7222008-01-19 03:35:58 +00005034 goto vdbe_error_halt;
drh023ae032007-05-08 12:12:16 +00005035
drh98640a32007-06-07 19:08:32 +00005036 /* Jump to here if a malloc() fails.
drhb86ccfb2003-01-28 23:13:10 +00005037 */
5038no_mem:
drh17435752007-08-16 04:30:38 +00005039 db->mallocFailed = 1;
drhf089aa42008-07-08 19:34:06 +00005040 sqlite3SetString(&p->zErrMsg, db, "out of memory");
drhb86ccfb2003-01-28 23:13:10 +00005041 rc = SQLITE_NOMEM;
drha05a7222008-01-19 03:35:58 +00005042 goto vdbe_error_halt;
drhb86ccfb2003-01-28 23:13:10 +00005043
5044 /* Jump to here for an SQLITE_MISUSE error.
5045 */
5046abort_due_to_misuse:
5047 rc = SQLITE_MISUSE;
5048 /* Fall thru into abort_due_to_error */
5049
5050 /* Jump to here for any other kind of fatal error. The "rc" variable
5051 ** should hold the error number.
5052 */
5053abort_due_to_error:
drha05a7222008-01-19 03:35:58 +00005054 assert( p->zErrMsg==0 );
5055 if( db->mallocFailed ) rc = SQLITE_NOMEM;
danielk19777eaabcd2008-07-07 14:56:56 +00005056 if( rc!=SQLITE_IOERR_NOMEM ){
drhf089aa42008-07-08 19:34:06 +00005057 sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
danielk19777eaabcd2008-07-07 14:56:56 +00005058 }
drha05a7222008-01-19 03:35:58 +00005059 goto vdbe_error_halt;
drhb86ccfb2003-01-28 23:13:10 +00005060
danielk19776f8a5032004-05-10 10:34:51 +00005061 /* Jump to here if the sqlite3_interrupt() API sets the interrupt
drhb86ccfb2003-01-28 23:13:10 +00005062 ** flag.
5063 */
5064abort_due_to_interrupt:
drh881feaa2006-07-26 01:39:30 +00005065 assert( db->u1.isInterrupted );
drh7e8b8482008-01-23 03:03:05 +00005066 rc = SQLITE_INTERRUPT;
danielk1977026d2702004-06-14 13:14:59 +00005067 p->rc = rc;
drhf089aa42008-07-08 19:34:06 +00005068 sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
drha05a7222008-01-19 03:35:58 +00005069 goto vdbe_error_halt;
drhb86ccfb2003-01-28 23:13:10 +00005070}