/ Hex Artifact Content
Login

Artifact 3bd3acffddf8a284d3e8c1df0e286389aaf09e1a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 65 78 65 63 75  implements execu
01a0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 66 20 74  tion method of t
01b0: 68 65 20 0a 2a 2a 20 56 69 72 74 75 61 6c 20 44  he .** Virtual D
01c0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 28  atabase Engine (
01d0: 56 44 42 45 29 2e 20 20 41 20 73 65 70 61 72 61  VDBE).  A separa
01e0: 74 65 20 66 69 6c 65 20 28 22 76 64 62 65 61 75  te file ("vdbeau
01f0: 78 2e 63 22 29 0a 2a 2a 20 68 61 6e 64 6c 65 73  x.c").** handles
0200: 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   housekeeping de
0210: 74 61 69 6c 73 20 73 75 63 68 20 61 73 20 63 72  tails such as cr
0220: 65 61 74 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  eating and delet
0230: 69 6e 67 0a 2a 2a 20 56 44 42 45 20 69 6e 73 74  ing.** VDBE inst
0240: 61 6e 63 65 73 2e 20 20 54 68 69 73 20 66 69 6c  ances.  This fil
0250: 65 20 69 73 20 73 6f 6c 65 6c 79 20 69 6e 74 65  e is solely inte
0260: 72 65 73 74 65 64 20 69 6e 20 65 78 65 63 75 74  rested in execut
0270: 69 6e 67 0a 2a 2a 20 74 68 65 20 56 44 42 45 20  ing.** the VDBE 
0280: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
0290: 6e 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 69  n the external i
02a0: 6e 74 65 72 66 61 63 65 2c 20 61 6e 20 22 73 71  nterface, an "sq
02b0: 6c 69 74 65 33 5f 73 74 6d 74 2a 22 20 69 73 20  lite3_stmt*" is 
02c0: 61 6e 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65  an opaque pointe
02d0: 72 0a 2a 2a 20 74 6f 20 61 20 56 44 42 45 2e 0a  r.** to a VDBE..
02e0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61  **.** The SQL pa
02f0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 73 20 61  rser generates a
0300: 20 70 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69   program which i
0310: 73 20 74 68 65 6e 20 65 78 65 63 75 74 65 64 20  s then executed 
0320: 62 79 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74  by.** the VDBE t
0330: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
0340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0350: 6e 74 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61  nt.  VDBE progra
0360: 6d 73 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c  ms are .** simil
0370: 61 72 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73  ar in form to as
0380: 73 65 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e  sembly language.
0390: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f    The program co
03a0: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c  nsists of.** a l
03b0: 69 6e 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f  inear sequence o
03c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45  f operations.  E
03d0: 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ach operation ha
03e0: 73 20 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  s an opcode .** 
03f0: 61 6e 64 20 35 20 6f 70 65 72 61 6e 64 73 2e 20  and 5 operands. 
0400: 20 4f 70 65 72 61 6e 64 73 20 50 31 2c 20 50 32   Operands P1, P2
0410: 2c 20 61 6e 64 20 50 33 20 61 72 65 20 69 6e 74  , and P3 are int
0420: 65 67 65 72 73 2e 20 20 4f 70 65 72 61 6e 64 20  egers.  Operand 
0430: 50 34 20 0a 2a 2a 20 69 73 20 61 20 6e 75 6c 6c  P4 .** is a null
0440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0450: 6e 67 2e 20 20 4f 70 65 72 61 6e 64 20 50 35 20  ng.  Operand P5 
0460: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 63  is an unsigned c
0470: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20 46 65 77  haracter..** Few
0480: 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c 6c   opcodes use all
0490: 20 35 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a   5 operands..**.
04a0: 2a 2a 20 43 6f 6d 70 75 74 61 74 69 6f 6e 20 72  ** Computation r
04b0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
04c0: 64 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 72 65  d on a set of re
04d0: 67 69 73 74 65 72 73 20 6e 75 6d 62 65 72 65 64  gisters numbered
04e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
04f0: 74 68 20 31 20 61 6e 64 20 67 6f 69 6e 67 20 75  th 1 and going u
0500: 70 20 74 6f 20 56 64 62 65 2e 6e 4d 65 6d 2e 20  p to Vdbe.nMem. 
0510: 20 45 61 63 68 20 72 65 67 69 73 74 65 72 20 63   Each register c
0520: 61 6e 20 73 74 6f 72 65 0a 2a 2a 20 65 69 74 68  an store.** eith
0530: 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  er an integer, a
0540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0550: 20 73 74 72 69 6e 67 2c 20 61 20 66 6c 6f 61 74   string, a float
0560: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing point.** num
0570: 62 65 72 2c 20 6f 72 20 74 68 65 20 53 51 4c 20  ber, or the SQL 
0580: 22 4e 55 4c 4c 22 20 76 61 6c 75 65 2e 20 20 41  "NULL" value.  A
0590: 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6e 76 65  n implicit conve
05a0: 72 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 0a 2a  rsion from one.*
05b0: 2a 20 74 79 70 65 20 74 6f 20 74 68 65 20 6f 74  * type to the ot
05c0: 68 65 72 20 6f 63 63 75 72 73 20 61 73 20 6e 65  her occurs as ne
05d0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  cessary..** .** 
05e0: 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f 64 65  Most of the code
05f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73   in this file is
0600: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 68 65   taken up by the
0610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0620: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  ().** function w
0630: 68 69 63 68 20 64 6f 65 73 20 74 68 65 20 77 6f  hich does the wo
0640: 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65 74 69  rk of interpreti
0650: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0660: 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65 72 20  m..** But other 
0670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 73  routines are als
0680: 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20 68 65  o provided to he
0690: 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67 20 75  lp in building u
06a0: 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d 20 69  p.** a program i
06b0: 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20 69 6e  nstruction by in
06c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
06d0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
06e0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
06f0: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0700: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0710: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0720: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0730: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0740: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0750: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0760: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0770: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0780: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
0790: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
07a0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
07b0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
07c0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
07d0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
07e0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
07f0: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0800: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0810: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0820: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0830: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
0840: 65 2e 63 2c 76 20 31 2e 38 32 30 20 32 30 30 39  e.c,v 1.820 2009
0850: 2f 30 32 2f 32 30 20 30 33 3a 35 35 3a 30 35 20  /02/20 03:55:05 
0860: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0870: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0880: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 76 64  .h".#include "vd
0890: 62 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  beInt.h"../*.** 
08a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
08b0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
08c0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 76 65   incremented eve
08d0: 72 79 20 74 69 6d 65 20 61 20 63 75 72 73 6f 72  ry time a cursor
08e0: 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69 74 68 65  .** moves, eithe
08f0: 72 20 62 79 20 74 68 65 20 4f 50 5f 53 65 65 6b  r by the OP_Seek
0900: 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20 6f 72 20  XX, OP_Next, or 
0910: 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 65 73 2e  OP_Prev opcodes.
0920: 20 20 54 68 65 20 74 65 73 74 0a 2a 2a 20 70 72    The test.** pr
0930: 6f 63 65 64 75 72 65 73 20 75 73 65 20 74 68 69  ocedures use thi
0940: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
0950: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
0960: 69 6e 64 69 63 65 73 20 61 72 65 0a 2a 2a 20 77  indices are.** w
0970: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0980: 2e 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  .  This variable
0990: 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e   has no function
09a0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a 2a   other than to.*
09b0: 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74 68  * help verify th
09c0: 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
09d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61  ion of the libra
09e0: 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ry..*/.#ifdef SQ
09f0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
0a00: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
0a10: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
0a20: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
0a30: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0a40: 69 73 20 70 6f 73 69 74 69 76 65 2c 20 69 74 20  is positive, it 
0a50: 67 65 74 73 20 64 65 63 72 65 6d 65 6e 74 65 64  gets decremented
0a60: 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20   once before.** 
0a70: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
0a80: 20 69 6e 20 74 68 65 20 56 44 42 45 2e 20 20 57   in the VDBE.  W
0a90: 68 65 6e 20 72 65 61 63 68 65 73 20 7a 65 72 6f  hen reaches zero
0aa0: 2c 20 74 68 65 20 75 31 2e 69 73 49 6e 74 65 72  , the u1.isInter
0ab0: 72 75 70 74 65 64 0a 2a 2a 20 66 69 65 6c 64 20  rupted.** field 
0ac0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  of the sqlite3 s
0ad0: 74 72 75 63 74 75 72 65 20 69 73 20 73 65 74 20  tructure is set 
0ae0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 69 6d 75  in order to simu
0af0: 6c 61 74 65 20 61 6e 64 20 69 6e 74 65 72 72 75  late and interru
0b00: 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  pt..**.** This f
0b10: 61 63 69 6c 69 74 79 20 69 73 20 75 73 65 64 20  acility is used 
0b20: 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
0b30: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 49 74 20 64  oses only.  It d
0b40: 6f 65 73 20 6e 6f 74 20 66 75 6e 63 74 69 6f 6e  oes not function
0b50: 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72 64 69 6e 61  .** in an ordina
0b60: 72 79 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66  ry build..*/.#if
0b70: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0b80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  int sqlite3_inte
0b90: 72 72 75 70 74 5f 63 6f 75 6e 74 20 3d 20 30 3b  rrupt_count = 0;
0ba0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0bb0: 68 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76  he next global v
0bc0: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
0bd0: 6d 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65  mented each type
0be0: 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70 63   the OP_Sort opc
0bf0: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
0c00: 65 64 2e 20 20 54 68 65 20 74 65 73 74 20 70 72  ed.  The test pr
0c10: 6f 63 65 64 75 72 65 73 20 75 73 65 20 74 68 69  ocedures use thi
0c20: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
0c30: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
0c40: 2a 2a 20 73 6f 72 74 69 6e 67 20 69 73 20 6f 63  ** sorting is oc
0c50: 63 75 72 72 69 6e 67 20 6f 72 20 6e 6f 74 20 6f  curring or not o
0c60: 63 63 75 72 72 69 6e 67 20 61 74 20 61 70 70 72  ccurring at appr
0c70: 6f 70 72 69 61 74 65 20 74 69 6d 65 73 2e 20 20  opriate times.  
0c80: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a   This variable.*
0c90: 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  * has no functio
0ca0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20  n other than to 
0cb0: 68 65 6c 70 20 76 65 72 69 66 79 20 74 68 65 20  help verify the 
0cc0: 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
0cd0: 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72  n of the.** libr
0ce0: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0cf0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0d00: 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
0d10: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
0d20: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c  *.** The next gl
0d30: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 72 65  obal variable re
0d40: 63 6f 72 64 73 20 74 68 65 20 73 69 7a 65 20 6f  cords the size o
0d50: 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 4d 45  f the largest ME
0d60: 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72 20 4d 45 4d  M_Blob.** or MEM
0d70: 5f 53 74 72 20 74 68 61 74 20 68 61 73 20 62 65  _Str that has be
0d80: 65 6e 20 75 73 65 64 20 62 79 20 61 20 56 44 42  en used by a VDB
0d90: 45 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 74  E opcode.  The t
0da0: 65 73 74 20 70 72 6f 63 65 64 75 72 65 73 0a 2a  est procedures.*
0db0: 2a 20 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72  * use this infor
0dc0: 6d 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 73  mation to make s
0dd0: 75 72 65 20 74 68 61 74 20 74 68 65 20 7a 65 72  ure that the zer
0de0: 6f 2d 62 6c 6f 62 20 66 75 6e 63 74 69 6f 6e 61  o-blob functiona
0df0: 6c 69 74 79 0a 2a 2a 20 69 73 20 77 6f 72 6b 69  lity.** is worki
0e00: 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 20  ng correctly.   
0e10: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
0e20: 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 74  s no function ot
0e30: 68 65 72 20 74 68 61 6e 20 74 6f 0a 2a 2a 20 68  her than to.** h
0e40: 65 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63  elp verify the c
0e50: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
0e60: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e   of the library.
0e70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0e80: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
0e90: 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 20  e3_max_blobsize 
0ea0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  = 0;.static void
0eb0: 20 75 70 64 61 74 65 4d 61 78 42 6c 6f 62 73 69   updateMaxBlobsi
0ec0: 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66  ze(Mem *p){.  if
0ed0: 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d  ( (p->flags & (M
0ee0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
0ef0: 29 21 3d 30 20 26 26 20 70 2d 3e 6e 3e 73 71 6c  )!=0 && p->n>sql
0f00: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
0f10: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
0f20: 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 20 3d 20  _max_blobsize = 
0f30: 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  p->n;.  }.}.#end
0f40: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61  if../*.** Test a
0f50: 20 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65   register to see
0f60: 20 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74   if it exceeds t
0f70: 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
0f80: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a  um blob size..**
0f90: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63   If it does, rec
0fa0: 6f 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69  ord the new maxi
0fb0: 6d 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a  mum blob size..*
0fc0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
0fd0: 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64  LITE_TEST) && !d
0fe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0ff0: 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 29  IT_BUILTIN_TEST)
1000: 0a 23 20 64 65 66 69 6e 65 20 55 50 44 41 54 45  .# define UPDATE
1010: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 50 29  _MAX_BLOBSIZE(P)
1020: 20 20 75 70 64 61 74 65 4d 61 78 42 6c 6f 62 73    updateMaxBlobs
1030: 69 7a 65 28 50 29 0a 23 65 6c 73 65 0a 23 20 64  ize(P).#else.# d
1040: 65 66 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58  efine UPDATE_MAX
1050: 5f 42 4c 4f 42 53 49 5a 45 28 50 29 0a 23 65 6e  _BLOBSIZE(P).#en
1060: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
1070: 72 74 20 74 68 65 20 67 69 76 65 6e 20 72 65 67  rt the given reg
1080: 69 73 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72  ister into a str
1090: 69 6e 67 20 69 66 20 69 74 20 69 73 6e 27 74 20  ing if it isn't 
10a0: 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20  one.** already. 
10b0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
10c0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
10d0: 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ils..*/.#define 
10e0: 53 74 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63  Stringify(P, enc
10f0: 29 20 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e  ) \.   if(((P)->
1100: 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
1110: 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
1120: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
1130: 72 69 6e 67 69 66 79 28 50 2c 65 6e 63 29 29 20  ringify(P,enc)) 
1140: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1150: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1160: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1170: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1180: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1190: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
11a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
11b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
11c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
11d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
11e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
11f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1200: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1210: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1220: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1230: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1240: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1250: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1260: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1270: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1280: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1290: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
12a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
12b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
12c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
12d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
12e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
12f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1300: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1310: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1320: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1330: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20 4d  string into an M
1340: 45 4d 5f 44 79 6e 20 73 74 72 69 6e 67 2e 0a 2a  EM_Dyn string..*
1350: 2f 0a 23 64 65 66 69 6e 65 20 44 65 65 70 68 65  /.#define Deephe
1360: 6d 65 72 61 6c 69 7a 65 28 50 29 20 5c 0a 20 20  meralize(P) \.  
1370: 20 69 66 28 20 28 28 50 29 2d 3e 66 6c 61 67 73   if( ((P)->flags
1380: 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20 5c  &MEM_Ephem)!=0 \
1390: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
13a0: 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69  e3VdbeMemMakeWri
13b0: 74 65 61 62 6c 65 28 50 29 20 29 7b 20 67 6f 74  teable(P) ){ got
13c0: 6f 20 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f 2a 0a 2a  o no_mem;}../*.*
13d0: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  * Call sqlite3Vd
13e0: 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28  beMemExpandBlob(
13f0: 29 20 6f 6e 20 74 68 65 20 73 75 70 70 6c 69 65  ) on the supplie
1400: 64 20 76 61 6c 75 65 20 28 74 79 70 65 20 4d 65  d value (type Me
1410: 6d 2a 29 0a 2a 2a 20 50 20 69 66 20 72 65 71 75  m*).** P if requ
1420: 69 72 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ired..*/.#define
1430: 20 45 78 70 61 6e 64 42 6c 6f 62 28 50 29 20 28   ExpandBlob(P) (
1440: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1450: 5a 65 72 6f 29 3f 73 71 6c 69 74 65 33 56 64 62  Zero)?sqlite3Vdb
1460: 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 50  eMemExpandBlob(P
1470: 29 3a 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  ):0)../*.** Argu
1480: 6d 65 6e 74 20 70 4d 65 6d 20 70 6f 69 6e 74 73  ment pMem points
1490: 20 61 74 20 61 20 72 65 67 69 73 74 65 72 20 74   at a register t
14a0: 68 61 74 20 77 69 6c 6c 20 62 65 20 70 61 73 73  hat will be pass
14b0: 65 64 20 74 6f 20 61 0a 2a 2a 20 75 73 65 72 2d  ed to a.** user-
14c0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
14d0: 20 6f 72 20 72 65 74 75 72 6e 65 64 20 74 6f 20   or returned to 
14e0: 74 68 65 20 75 73 65 72 20 61 73 20 74 68 65 20  the user as the 
14f0: 72 65 73 75 6c 74 20 6f 66 20 61 20 71 75 65 72  result of a quer
1500: 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
1510: 20 61 72 67 75 6d 65 6e 74 2c 20 27 64 62 5f 65   argument, 'db_e
1520: 6e 63 27 20 69 73 20 74 68 65 20 74 65 78 74 20  nc' is the text 
1530: 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
1540: 20 74 68 65 20 76 64 62 65 20 66 6f 72 0a 2a 2a   the vdbe for.**
1550: 20 72 65 67 69 73 74 65 72 20 76 61 72 69 61 62   register variab
1560: 6c 65 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  les.  This routi
1570: 6e 65 20 73 65 74 73 20 74 68 65 20 70 4d 65 6d  ne sets the pMem
1580: 2d 3e 65 6e 63 20 61 6e 64 20 70 4d 65 6d 2d 3e  ->enc and pMem->
1590: 74 79 70 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65  type.** variable
15a0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  s used by the sq
15b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a 28 29 20  lite3_value_*() 
15c0: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 64 65  routines..*/.#de
15d0: 66 69 6e 65 20 73 74 6f 72 65 54 79 70 65 49 6e  fine storeTypeIn
15e0: 66 6f 28 41 2c 42 29 20 5f 73 74 6f 72 65 54 79  fo(A,B) _storeTy
15f0: 70 65 49 6e 66 6f 28 41 29 0a 73 74 61 74 69 63  peInfo(A).static
1600: 20 76 6f 69 64 20 5f 73 74 6f 72 65 54 79 70 65   void _storeType
1610: 49 6e 66 6f 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b  Info(Mem *pMem){
1620: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
1630: 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66  Mem->flags;.  if
1640: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
1650: 6c 6c 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ll ){.    pMem->
1660: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55  type = SQLITE_NU
1670: 4c 4c 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  LL;.  }.  else i
1680: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  f( flags & MEM_I
1690: 6e 74 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  nt ){.    pMem->
16a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
16b0: 54 45 47 45 52 3b 0a 20 20 7d 0a 20 20 65 6c 73  TEGER;.  }.  els
16c0: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45  e if( flags & ME
16d0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70 4d  M_Real ){.    pM
16e0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
16f0: 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a 20 20 65  E_FLOAT;.  }.  e
1700: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
1710: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 70  MEM_Str ){.    p
1720: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
1730: 54 45 5f 54 45 58 54 3b 0a 20 20 7d 65 6c 73 65  TE_TEXT;.  }else
1740: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  {.    pMem->type
1750: 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a   = SQLITE_BLOB;.
1760: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f    }.}../*.** Pro
1770: 70 65 72 74 69 65 73 20 6f 66 20 6f 70 63 6f 64  perties of opcod
1780: 65 73 2e 20 20 54 68 65 20 4f 50 46 4c 47 5f 49  es.  The OPFLG_I
1790: 4e 49 54 49 41 4c 49 5a 45 52 20 6d 61 63 72 6f  NITIALIZER macro
17a0: 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 62   is.** created b
17b0: 79 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  y mkopcodeh.awk 
17c0: 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69  during compilati
17d0: 6f 6e 2e 20 20 44 61 74 61 20 69 73 20 6f 62 74  on.  Data is obt
17e0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  ained.** from th
17f0: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 6c 6c 6f  e comments follo
1800: 77 69 6e 67 20 74 68 65 20 22 63 61 73 65 20 4f  wing the "case O
1810: 50 5f 78 78 78 78 3a 22 20 73 74 61 74 65 6d 65  P_xxxx:" stateme
1820: 6e 74 73 20 69 6e 0a 2a 2a 20 74 68 69 73 20 66  nts in.** this f
1830: 69 6c 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ile.  .*/.static
1840: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1850: 63 68 61 72 20 6f 70 63 6f 64 65 50 72 6f 70 65  char opcodePrope
1860: 72 74 79 5b 5d 20 3d 20 4f 50 46 4c 47 5f 49 4e  rty[] = OPFLG_IN
1870: 49 54 49 41 4c 49 5a 45 52 3b 0a 0a 2f 2a 0a 2a  ITIALIZER;../*.*
1880: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1890: 20 61 6e 20 6f 70 63 6f 64 65 20 68 61 73 20 61   an opcode has a
18a0: 6e 79 20 6f 66 20 74 68 65 20 4f 50 46 4c 47 5f  ny of the OPFLG_
18b0: 78 78 78 20 70 72 6f 70 65 72 74 69 65 73 0a 2a  xxx properties.*
18c0: 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  * specified by m
18d0: 61 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ask..*/.int sqli
18e0: 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73  te3VdbeOpcodeHas
18f0: 50 72 6f 70 65 72 74 79 28 69 6e 74 20 6f 70 63  Property(int opc
1900: 6f 64 65 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  ode, int mask){.
1910: 20 20 61 73 73 65 72 74 28 20 6f 70 63 6f 64 65    assert( opcode
1920: 3e 30 20 26 26 20 6f 70 63 6f 64 65 3c 28 69 6e  >0 && opcode<(in
1930: 74 29 73 69 7a 65 6f 66 28 6f 70 63 6f 64 65 50  t)sizeof(opcodeP
1940: 72 6f 70 65 72 74 79 29 20 29 3b 0a 20 20 72 65  roperty) );.  re
1950: 74 75 72 6e 20 28 6f 70 63 6f 64 65 50 72 6f 70  turn (opcodeProp
1960: 65 72 74 79 5b 6f 70 63 6f 64 65 5d 26 6d 61 73  erty[opcode]&mas
1970: 6b 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k)!=0;.}../*.** 
1980: 41 6c 6c 6f 63 61 74 65 20 56 64 62 65 43 75 72  Allocate VdbeCur
1990: 73 6f 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2e  sor number iCur.
19a0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
19b0: 65 72 20 74 6f 20 69 74 2e 20 20 52 65 74 75 72  er to it.  Retur
19c0: 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20  n NULL.** if we 
19d0: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
19e0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 56 64 62  y..*/.static Vdb
19f0: 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74  eCursor *allocat
1a00: 65 43 75 72 73 6f 72 28 0a 20 20 56 64 62 65 20  eCursor(.  Vdbe 
1a10: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1a20: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1a30: 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  machine */.  int
1a40: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
1a50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1a60: 68 65 20 6e 65 77 20 56 64 62 65 43 75 72 73 6f  he new VdbeCurso
1a70: 72 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 2c 20  r */.  Op *pOp, 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a90: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
1aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
1ab0: 65 6e 20 64 61 74 61 62 61 73 65 20 74 68 65 20  en database the 
1ac0: 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1ad0: 6f 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e  o, or -1 */.  in
1ae0: 74 20 69 73 42 74 72 65 65 43 75 72 73 6f 72 20  t isBtreeCursor 
1af0: 20 20 20 20 2f 2a 20 2a 2f 0a 29 7b 0a 20 20 2f      /* */.){.  /
1b00: 2a 20 46 69 6e 64 20 74 68 65 20 6d 65 6d 6f 72  * Find the memor
1b10: 79 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  y cell that will
1b20: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
1b30: 65 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  e the blob of me
1b40: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
1b50: 65 64 20 66 6f 72 20 74 68 69 73 20 56 64 62 65  ed for this Vdbe
1b60: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
1b70: 2e 20 49 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  . It is convenie
1b80: 6e 74 20 74 6f 20 75 73 65 20 61 20 0a 20 20 2a  nt to use a .  *
1b90: 2a 20 76 64 62 65 20 6d 65 6d 6f 72 79 20 63 65  * vdbe memory ce
1ba0: 6c 6c 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65  ll to manage the
1bb0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1bc0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
1bd0: 61 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  a.  ** VdbeCurso
1be0: 72 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  r structure for 
1bf0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  the following re
1c00: 61 73 6f 6e 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  asons:.  **.  **
1c10: 20 20 20 2a 20 53 6f 6d 65 74 69 6d 65 73 20 63     * Sometimes c
1c20: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1c30: 65 20 75 73 65 64 20 66 6f 72 20 61 20 63 6f 75  e used for a cou
1c40: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
1c50: 0a 20 20 2a 2a 20 20 20 20 20 70 75 72 70 6f 73  .  **     purpos
1c60: 65 73 20 69 6e 20 61 20 76 64 62 65 20 70 72 6f  es in a vdbe pro
1c70: 67 72 61 6d 2e 20 54 68 65 20 64 69 66 66 65 72  gram. The differ
1c80: 65 6e 74 20 75 73 65 73 20 6d 69 67 68 74 20 72  ent uses might r
1c90: 65 71 75 69 72 65 0a 20 20 2a 2a 20 20 20 20 20  equire.  **     
1ca0: 64 69 66 66 65 72 65 6e 74 20 73 69 7a 65 64 20  different sized 
1cb0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 4d 65 6d  allocations. Mem
1cc0: 6f 72 79 20 63 65 6c 6c 73 20 70 72 6f 76 69 64  ory cells provid
1cd0: 65 20 67 72 6f 77 61 62 6c 65 0a 20 20 2a 2a 20  e growable.  ** 
1ce0: 20 20 20 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e      allocations.
1cf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
1d00: 68 65 6e 20 75 73 69 6e 67 20 45 4e 41 42 4c 45  hen using ENABLE
1d10: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1d20: 4e 54 2c 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  NT, memory cell 
1d30: 62 75 66 66 65 72 73 20 63 61 6e 0a 20 20 2a 2a  buffers can.  **
1d40: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 6c 61       be freed la
1d50: 7a 69 6c 79 20 76 69 61 20 74 68 65 20 73 71 6c  zily via the sql
1d60: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1d70: 6f 72 79 28 29 20 41 50 49 2e 20 54 68 69 73 0a  ory() API. This.
1d80: 20 20 2a 2a 20 20 20 20 20 6d 69 6e 69 6d 69 7a    **     minimiz
1d90: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1da0: 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73 20 6d 61   malloc calls ma
1db0: 64 65 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  de by the system
1dc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 65 6d 6f  ..  **.  ** Memo
1dd0: 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 63 75 72  ry cells for cur
1de0: 73 6f 72 73 20 61 72 65 20 61 6c 6c 6f 63 61 74  sors are allocat
1df0: 65 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ed at the top of
1e00: 20 74 68 65 20 61 64 64 72 65 73 73 0a 20 20 2a   the address.  *
1e10: 2a 20 73 70 61 63 65 2e 20 4d 65 6d 6f 72 79 20  * space. Memory 
1e20: 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 29 20 63  cell (p->nMem) c
1e30: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63 75  orresponds to cu
1e40: 72 73 6f 72 20 30 2e 20 53 70 61 63 65 20 66 6f  rsor 0. Space fo
1e50: 72 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 31 20  r.  ** cursor 1 
1e60: 69 73 20 6d 61 6e 61 67 65 64 20 62 79 20 6d 65  is managed by me
1e70: 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d  mory cell (p->nM
1e80: 65 6d 2d 31 29 2c 20 65 74 63 2e 0a 20 20 2a 2f  em-1), etc..  */
1e90: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
1ea0: 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d  p->aMem[p->nMem-
1eb0: 69 43 75 72 5d 3b 0a 0a 20 20 69 6e 74 20 6e 42  iCur];..  int nB
1ec0: 79 74 65 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  yte;.  VdbeCurso
1ed0: 72 20 2a 70 43 78 20 3d 20 30 3b 0a 20 20 2f 2a  r *pCx = 0;.  /*
1ee0: 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6f   If the opcode o
1ef0: 66 20 70 4f 70 20 69 73 20 4f 50 5f 53 65 74 4e  f pOp is OP_SetN
1f00: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  umColumns, then 
1f10: 70 4f 70 2d 3e 70 32 20 63 6f 6e 74 61 69 6e 73  pOp->p2 contains
1f20: 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
1f30: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68   of fields in th
1f40: 65 20 72 65 63 6f 72 64 73 20 63 6f 6e 74 61 69  e records contai
1f50: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1f60: 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 62   or.  ** index b
1f70: 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 55 73 65  eing opened. Use
1f80: 20 74 68 69 73 20 74 6f 20 72 65 73 65 72 76 65   this to reserve
1f90: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 0a   space for the .
1fa0: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2e    ** VdbeCursor.
1fb0: 61 54 79 70 65 5b 5d 20 61 72 72 61 79 2e 0a 20  aType[] array.. 
1fc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
1fd0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d   = 0;.  if( pOp-
1fe0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 74 4e  >opcode==OP_SetN
1ff0: 75 6d 43 6f 6c 75 6d 6e 73 20 7c 7c 20 70 4f 70  umColumns || pOp
2000: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65  ->opcode==OP_Ope
2010: 6e 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  nEphemeral ){.  
2020: 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
2030: 70 32 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  p2;.  }.  nByte 
2040: 3d 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  = .      sizeof(
2050: 56 64 62 65 43 75 72 73 6f 72 29 20 2b 20 0a 20  VdbeCursor) + . 
2060: 20 20 20 20 20 28 69 73 42 74 72 65 65 43 75 72       (isBtreeCur
2070: 73 6f 72 3f 73 71 6c 69 74 65 33 42 74 72 65 65  sor?sqlite3Btree
2080: 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29 20  CursorSize():0) 
2090: 2b 20 0a 20 20 20 20 20 20 32 2a 6e 46 69 65 6c  + .      2*nFiel
20a0: 64 2a 73 69 7a 65 6f 66 28 75 33 32 29 3b 0a 0a  d*sizeof(u32);..
20b0: 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3c 70    assert( iCur<p
20c0: 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69  ->nCursor );.  i
20d0: 66 28 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72  f( p->apCsr[iCur
20e0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
20f0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
2100: 2c 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d  , p->apCsr[iCur]
2110: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 5b  );.    p->apCsr[
2120: 69 43 75 72 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  iCur] = 0;.  }. 
2130: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
2140: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
2150: 6f 77 28 70 4d 65 6d 2c 20 6e 42 79 74 65 2c 20  ow(pMem, nByte, 
2160: 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43  0) ){.    p->apC
2170: 73 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d  sr[iCur] = pCx =
2180: 20 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d   (VdbeCursor*)pM
2190: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65  em->z;.    memse
21a0: 74 28 70 4d 65 6d 2d 3e 7a 2c 20 30 2c 20 6e 42  t(pMem->z, 0, nB
21b0: 79 74 65 29 3b 0a 20 20 20 20 70 43 78 2d 3e 69  yte);.    pCx->i
21c0: 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 43  Db = iDb;.    pC
21d0: 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  x->nField = nFie
21e0: 6c 64 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 65  ld;.    if( nFie
21f0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 43 78 2d  ld ){.      pCx-
2200: 3e 61 54 79 70 65 20 3d 20 28 75 33 32 20 2a 29  >aType = (u32 *)
2210: 26 70 4d 65 6d 2d 3e 7a 5b 73 69 7a 65 6f 66 28  &pMem->z[sizeof(
2220: 56 64 62 65 43 75 72 73 6f 72 29 5d 3b 0a 20 20  VdbeCursor)];.  
2230: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 42 74    }.    if( isBt
2240: 72 65 65 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  reeCursor ){.   
2250: 20 20 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20     pCx->pCursor 
2260: 3d 20 28 42 74 43 75 72 73 6f 72 2a 29 0a 20 20  = (BtCursor*).  
2270: 20 20 20 20 20 20 20 20 26 70 4d 65 6d 2d 3e 7a          &pMem->z
2280: 5b 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  [sizeof(VdbeCurs
2290: 6f 72 29 2b 32 2a 6e 46 69 65 6c 64 2a 73 69 7a  or)+2*nField*siz
22a0: 65 6f 66 28 75 33 32 29 5d 3b 0a 20 20 20 20 7d  eof(u32)];.    }
22b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
22c0: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  x;.}../*.** Try 
22d0: 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c  to convert a val
22e0: 75 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69  ue into a numeri
22f0: 63 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  c representation
2300: 20 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f   if we can.** do
2310: 20 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73   so without loss
2320: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e   of information.
2330: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2340: 2c 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a  , if the string.
2350: 2a 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  ** looks like a 
2360: 6e 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20  number, convert 
2370: 69 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72  it into a number
2380: 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
2390: 74 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61  t.** look like a
23a0: 20 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69   number, leave i
23b0: 74 20 61 6c 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  t alone..*/.stat
23c0: 69 63 20 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d  ic void applyNum
23d0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 4d 65 6d  ericAffinity(Mem
23e0: 20 2a 70 52 65 63 29 7b 0a 20 20 69 66 28 20 28   *pRec){.  if( (
23f0: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pRec->flags & (M
2400: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29  EM_Real|MEM_Int)
2410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
2420: 72 65 61 6c 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  realnum;.    sql
2430: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65  ite3VdbeMemNulTe
2440: 72 6d 69 6e 61 74 65 28 70 52 65 63 29 3b 0a 20  rminate(pRec);. 
2450: 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c     if( (pRec->fl
2460: 61 67 73 26 4d 45 4d 5f 53 74 72 29 0a 20 20 20  ags&MEM_Str).   
2470: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2480: 49 73 4e 75 6d 62 65 72 28 70 52 65 63 2d 3e 7a  IsNumber(pRec->z
2490: 2c 20 26 72 65 61 6c 6e 75 6d 2c 20 70 52 65 63  , &realnum, pRec
24a0: 2d 3e 65 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  ->enc) ){.      
24b0: 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20  i64 value;.     
24c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24d0: 67 65 45 6e 63 6f 64 69 6e 67 28 70 52 65 63 2c  geEncoding(pRec,
24e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
24f0: 20 20 20 20 20 69 66 28 20 21 72 65 61 6c 6e 75       if( !realnu
2500: 6d 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69  m && sqlite3Atoi
2510: 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26 76 61 6c  64(pRec->z, &val
2520: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ue) ){.        p
2530: 52 65 63 2d 3e 75 2e 69 20 3d 20 76 61 6c 75 65  Rec->u.i = value
2540: 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74  ;.        MemSet
2550: 54 79 70 65 46 6c 61 67 28 70 52 65 63 2c 20 4d  TypeFlag(pRec, M
2560: 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 20 20 7d  EM_Int);.      }
2570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2580: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c  lite3VdbeMemReal
2590: 69 66 79 28 70 52 65 63 29 3b 0a 20 20 20 20 20  ify(pRec);.     
25a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
25b0: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 69 6e 67  /*.** Processing
25c0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 20 62 79   is determine by
25d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 61   the affinity pa
25e0: 72 61 6d 65 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 53  rameter:.**.** S
25f0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
2600: 52 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  R:.** SQLITE_AFF
2610: 5f 52 45 41 4c 3a 0a 2a 2a 20 53 51 4c 49 54 45  _REAL:.** SQLITE
2620: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 0a 2a 2a  _AFF_NUMERIC:.**
2630: 20 20 20 20 54 72 79 20 74 6f 20 63 6f 6e 76 65      Try to conve
2640: 72 74 20 70 52 65 63 20 74 6f 20 61 6e 20 69 6e  rt pRec to an in
2650: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2660: 74 69 6f 6e 20 6f 72 20 61 20 0a 2a 2a 20 20 20  tion or a .**   
2670: 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20   floating-point 
2680: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2690: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70  f an integer rep
26a0: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
26b0: 20 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c    is not possibl
26c0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
26d0: 65 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  e integer repres
26e0: 65 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 20  entation is.**  
26f0: 20 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 72    always preferr
2700: 65 64 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  ed, even if the 
2710: 61 66 66 69 6e 69 74 79 20 69 73 20 52 45 41 4c  affinity is REAL
2720: 2c 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20  , because.**    
2730: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2740: 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72  sentation is mor
2750: 65 20 73 70 61 63 65 20 65 66 66 69 63 69 65 6e  e space efficien
2760: 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  t on disk..**.**
2770: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
2780: 3a 0a 2a 2a 20 20 20 20 43 6f 6e 76 65 72 74 20  :.**    Convert 
2790: 70 52 65 63 20 74 6f 20 61 20 74 65 78 74 20 72  pRec to a text r
27a0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 2a  epresentation..*
27b0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  *.** SQLITE_AFF_
27c0: 4e 4f 4e 45 3a 0a 2a 2a 20 20 20 20 4e 6f 2d 6f  NONE:.**    No-o
27d0: 70 2e 20 20 70 52 65 63 20 69 73 20 75 6e 63 68  p.  pRec is unch
27e0: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
27f0: 20 76 6f 69 64 20 61 70 70 6c 79 41 66 66 69 6e   void applyAffin
2800: 69 74 79 28 0a 20 20 4d 65 6d 20 2a 70 52 65 63  ity(.  Mem *pRec
2810: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2820: 65 20 76 61 6c 75 65 20 74 6f 20 61 70 70 6c 79  e value to apply
2830: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 2a 2f 0a   affinity to */.
2840: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 2c    char affinity,
2850: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66        /* The aff
2860: 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c  inity to be appl
2870: 69 65 64 20 2a 2f 0a 20 20 75 38 20 65 6e 63 20  ied */.  u8 enc 
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2890: 55 73 65 20 74 68 69 73 20 74 65 78 74 20 65 6e  Use this text en
28a0: 63 6f 64 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  coding */.){.  i
28b0: 66 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  f( affinity==SQL
28c0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a  ITE_AFF_TEXT ){.
28d0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 74 74 65      /* Only atte
28e0: 6d 70 74 20 74 68 65 20 63 6f 6e 76 65 72 73 69  mpt the conversi
28f0: 6f 6e 20 74 6f 20 54 45 58 54 20 69 66 20 74 68  on to TEXT if th
2900: 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ere is an intege
2910: 72 20 6f 72 20 72 65 61 6c 0a 20 20 20 20 2a 2a  r or real.    **
2920: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2930: 28 62 6c 6f 62 20 61 6e 64 20 4e 55 4c 4c 20 64  (blob and NULL d
2940: 6f 20 6e 6f 74 20 67 65 74 20 63 6f 6e 76 65 72  o not get conver
2950: 74 65 64 29 20 62 75 74 20 6e 6f 20 73 74 72 69  ted) but no stri
2960: 6e 67 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73  ng.    ** repres
2970: 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  entation..    */
2980: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 52 65  .    if( 0==(pRe
2990: 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  c->flags&MEM_Str
29a0: 29 20 26 26 20 28 70 52 65 63 2d 3e 66 6c 61 67  ) && (pRec->flag
29b0: 73 26 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  s&(MEM_Real|MEM_
29c0: 49 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 73  Int)) ){.      s
29d0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72  qlite3VdbeMemStr
29e0: 69 6e 67 69 66 79 28 70 52 65 63 2c 20 65 6e 63  ingify(pRec, enc
29f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  );.    }.    pRe
2a00: 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45  c->flags &= ~(ME
2a10: 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 3b  M_Real|MEM_Int);
2a20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66  .  }else if( aff
2a30: 69 6e 69 74 79 21 3d 53 51 4c 49 54 45 5f 41 46  inity!=SQLITE_AF
2a40: 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73  F_NONE ){.    as
2a50: 73 65 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d  sert( affinity==
2a60: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
2a70: 45 52 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d  ER || affinity==
2a80: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2aa0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
2ab0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
2ac0: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2ad0: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2ae0: 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c      if( pRec->fl
2af0: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
2b00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2b10: 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69  dbeIntegerAffini
2b20: 74 79 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a  ty(pRec);.    }.
2b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
2b40: 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
2b50: 74 79 70 65 20 6f 66 20 61 20 66 75 6e 63 74 69  type of a functi
2b60: 6f 6e 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 61  on argument or a
2b70: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 0a 2a   result column.*
2b80: 2a 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  * into a numeric
2b90: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2ba0: 20 20 55 73 65 20 65 69 74 68 65 72 20 49 4e 54    Use either INT
2bb0: 45 47 45 52 20 6f 72 20 52 45 41 4c 20 77 68 69  EGER or REAL whi
2bc0: 63 68 65 76 65 72 0a 2a 2a 20 69 73 20 61 70 70  chever.** is app
2bd0: 72 6f 70 72 69 61 74 65 2e 20 20 42 75 74 20 6f  ropriate.  But o
2be0: 6e 6c 79 20 64 6f 20 74 68 65 20 63 6f 6e 76 65  nly do the conve
2bf0: 72 73 69 6f 6e 20 69 66 20 69 74 20 69 73 20 70  rsion if it is p
2c00: 6f 73 73 69 62 6c 65 20 77 69 74 68 6f 75 74 0a  ossible without.
2c10: 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72  ** loss of infor
2c20: 6d 61 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72  mation and retur
2c30: 6e 20 74 68 65 20 72 65 76 69 73 65 64 20 74 79  n the revised ty
2c40: 70 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  pe of the argume
2c50: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  nt..**.** This i
2c60: 73 20 61 6e 20 45 58 50 45 52 49 4d 45 4e 54 41  s an EXPERIMENTA
2c70: 4c 20 61 70 69 20 61 6e 64 20 69 73 20 73 75 62  L api and is sub
2c80: 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65 20 6f  ject to change o
2c90: 72 20 72 65 6d 6f 76 61 6c 2e 0a 2a 2f 0a 69 6e  r removal..*/.in
2ca0: 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  t sqlite3_value_
2cb0: 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71 6c  numeric_type(sql
2cc0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
2cd0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  ){.  Mem *pMem =
2ce0: 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20 20 61   (Mem*)pVal;.  a
2cf0: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
2d00: 69 74 79 28 70 4d 65 6d 29 3b 0a 20 20 73 74 6f  ity(pMem);.  sto
2d10: 72 65 54 79 70 65 49 6e 66 6f 28 70 4d 65 6d 2c  reTypeInfo(pMem,
2d20: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d   0);.  return pM
2d30: 65 6d 2d 3e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  em->type;.}../*.
2d40: 2a 2a 20 45 78 70 6f 72 74 65 64 20 76 65 72 73  ** Exported vers
2d50: 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41 66 66 69  ion of applyAffi
2d60: 6e 69 74 79 28 29 2e 20 54 68 69 73 20 6f 6e 65  nity(). This one
2d70: 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c 69 74 65   works on sqlite
2d80: 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a 20 6e 6f  3_value*, .** no
2d90: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 4d  t the internal M
2da0: 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a 76 6f 69  em* type..*/.voi
2db0: 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70  d sqlite3ValueAp
2dc0: 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20 73  plyAffinity(.  s
2dd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
2de0: 61 6c 2c 20 0a 20 20 75 38 20 61 66 66 69 6e 69  al, .  u8 affini
2df0: 74 79 2c 20 0a 20 20 75 38 20 65 6e 63 0a 29 7b  ty, .  u8 enc.){
2e00: 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79  .  applyAffinity
2e10: 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c 20 61 66  ((Mem *)pVal, af
2e20: 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b 0a 7d 0a  finity, enc);.}.
2e30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2e40: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  EBUG./*.** Write
2e50: 20 61 20 6e 69 63 65 20 73 74 72 69 6e 67 20 72   a nice string r
2e60: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2e70: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2e80: 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a 20 69 6e   cell pMem.** in
2e90: 74 6f 20 62 75 66 66 65 72 20 7a 42 75 66 2c 20  to buffer zBuf, 
2ea0: 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a 2a 2f 0a  length nBuf..*/.
2eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2ec0: 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 4d  MemPrettyPrint(M
2ed0: 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61 72 20 2a  em *pMem, char *
2ee0: 7a 42 75 66 29 7b 0a 20 20 63 68 61 72 20 2a 7a  zBuf){.  char *z
2ef0: 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20 20 69 6e  Csr = zBuf;.  in
2f00: 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  t f = pMem->flag
2f10: 73 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s;..  static con
2f20: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 65  st char *const e
2f30: 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 22 28 58  ncnames[] = {"(X
2f40: 29 22 2c 20 22 28 38 29 22 2c 20 22 28 31 36 4c  )", "(8)", "(16L
2f50: 45 29 22 2c 20 22 28 31 36 42 45 29 22 7d 3b 0a  E)", "(16BE)"};.
2f60: 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f 42 6c 6f  .  if( f&MEM_Blo
2f70: 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  b ){.    int i;.
2f80: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
2f90: 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20  if( f & MEM_Dyn 
2fa0: 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 7a 27  ){.      c = 'z'
2fb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2fc0: 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63  (f & (MEM_Static
2fd0: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
2fe0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2ff0: 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 20   f & MEM_Static 
3000: 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 74 27  ){.      c = 't'
3010: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3020: 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d 45  (f & (MEM_Dyn|ME
3030: 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a  M_Ephem))==0 );.
3040: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20      }else if( f 
3050: 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a 20  & MEM_Ephem ){. 
3060: 20 20 20 20 20 63 20 3d 20 27 65 27 3b 0a 20 20       c = 'e';.  
3070: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
3080: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
3090: 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20  _Dyn))==0 );.   
30a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 20   }else{.      c 
30b0: 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 0a 20 20  = 's';.    }..  
30c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30d0: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25  tf(100, zCsr, "%
30e0: 63 22 2c 20 63 29 3b 0a 20 20 20 20 7a 43 73 72  c", c);.    zCsr
30f0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3100: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 73  n30(zCsr);.    s
3110: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3120: 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64 5b 22  100, zCsr, "%d["
3130: 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  , pMem->n);.    
3140: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3150: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36     for(i=0; i<16
3170: 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69   && i<pMem->n; i
3180: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3190: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
31a0: 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c 20 28   zCsr, "%02X", (
31b0: 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20  (int)pMem->z[i] 
31c0: 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20 20 20  & 0xFF));.      
31d0: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
31e0: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
31f0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3200: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
3210: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
3220: 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e   char z = pMem->
3230: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[i];.      if( 
3240: 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20 29 20  z<32 || z>126 ) 
3250: 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20  *zCsr++ = '.';. 
3260: 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73 72 2b       else *zCsr+
3270: 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 0a 20 20  + = z;.    }..  
3280: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3290: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 5d  tf(100, zCsr, "]
32a0: 25 73 22 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d  %s", encnames[pM
32b0: 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 7a  em->enc]);.    z
32c0: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
32d0: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
32e0: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65    if( f & MEM_Ze
32f0: 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ro ){.      sqli
3300: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
3310: 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d  , zCsr,"+%dz",pM
3320: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20  em->u.nZero);.  
3330: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
3340: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
3350: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  );.    }.    *zC
3360: 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  sr = '\0';.  }el
3370: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
3380: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  tr ){.    int j,
3390: 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20   k;.    zBuf[0] 
33a0: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66  = ' ';.    if( f
33b0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
33c0: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a      zBuf[1] = 'z
33d0: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
33e0: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
33f0: 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30  c|MEM_Ephem))==0
3400: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
3410: 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63  ( f & MEM_Static
3420: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3430: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  ] = 't';.      a
3440: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3450: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
3460: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3470: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3480: 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  em ){.      zBuf
3490: 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20  [1] = 'e';.     
34a0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
34b0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79  EM_Static|MEM_Dy
34c0: 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  n))==0 );.    }e
34d0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  lse{.      zBuf[
34e0: 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a  1] = 's';.    }.
34f0: 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73      k = 2;.    s
3500: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3510: 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22  100, &zBuf[k], "
3520: 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  %d", pMem->n);. 
3530: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3540: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3550: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3560: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28   = '[';.    for(
3570: 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70  j=0; j<15 && j<p
3580: 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Mem->n; j++){.  
3590: 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d      u8 c = pMem-
35a0: 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  >z[j];.      if(
35b0: 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78   c>=0x20 && c<0x
35c0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  7f ){.        zB
35d0: 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  uf[k++] = c;.   
35e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35f0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e    zBuf[k++] = '.
3600: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
3610: 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d  .    zBuf[k++] =
3620: 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   ']';.    sqlite
3630: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26  3_snprintf(100,&
3640: 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65  zBuf[k], encname
3650: 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20  s[pMem->enc]);. 
3660: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3670: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3680: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3690: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
36a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
36b0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
36c0: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
36d0: 20 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20   a register for 
36e0: 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73  tracing purposes
36f0: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  :.*/.static void
3700: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 46   memTracePrint(F
3710: 49 4c 45 20 2a 6f 75 74 2c 20 4d 65 6d 20 2a 70  ILE *out, Mem *p
3720: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ){.  if( p->flag
3730: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
3740: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3750: 20 22 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c   " NULL");.  }el
3760: 73 65 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  se if( (p->flags
3770: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3780: 53 74 72 29 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c  Str))==(MEM_Int|
3790: 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20 20 20  MEM_Str) ){.    
37a0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 73  fprintf(out, " s
37b0: 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29  i:%lld", p->u.i)
37c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
37d0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
37e0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
37f0: 6f 75 74 2c 20 22 20 69 3a 25 6c 6c 64 22 2c 20  out, " i:%lld", 
3800: 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65  p->u.i);.  }else
3810: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3820: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
3830: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 72  fprintf(out, " r
3840: 3a 25 67 22 2c 20 70 2d 3e 72 29 3b 0a 20 20 7d  :%g", p->r);.  }
3850: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
3860: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
3870: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
3880: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
3890: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
38a0: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 66 70 72  t, " ");.    fpr
38b0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
38c0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  zBuf);.  }.}.sta
38d0: 74 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65  tic void registe
38e0: 72 54 72 61 63 65 28 46 49 4c 45 20 2a 6f 75 74  rTrace(FILE *out
38f0: 2c 20 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  , int iReg, Mem 
3900: 2a 70 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  *p){.  fprintf(o
3910: 75 74 2c 20 22 52 45 47 5b 25 64 5d 20 3d 20 22  ut, "REG[%d] = "
3920: 2c 20 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72  , iReg);.  memTr
3930: 61 63 65 50 72 69 6e 74 28 6f 75 74 2c 20 70 29  acePrint(out, p)
3940: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
3950: 20 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66   "\n");.}.#endif
3960: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3970: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
3980: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
3990: 2c 4d 29 20 69 66 28 70 2d 3e 74 72 61 63 65 29  ,M) if(p->trace)
39a0: 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d  registerTrace(p-
39b0: 3e 74 72 61 63 65 2c 52 2c 4d 29 0a 23 65 6c 73  >trace,R,M).#els
39c0: 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  e.#  define REGI
39d0: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 0a  STER_TRACE(R,M).
39e0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
39f0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a  VDBE_PROFILE../*
3a00: 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f   .** hwtime.h co
3a10: 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73  ntains inline as
3a20: 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72  sembler code for
3a30: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a   implementing .*
3a40: 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e  * high-performan
3a50: 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e  ce timing routin
3a60: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
3a70: 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65 6e 64  "hwtime.h"..#end
3a80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  if../*.** The CH
3a90: 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50  ECK_FOR_INTERRUP
3aa0: 54 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  T macro defined 
3ab0: 68 65 72 65 20 6c 6f 6f 6b 73 20 74 6f 20 73 65  here looks to se
3ac0: 65 20 69 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69  e if the.** sqli
3ad0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20  te3_interrupt() 
3ae0: 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
3af0: 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 74 20   called.  If it 
3b00: 68 61 73 20 62 65 65 6e 2c 20 74 68 65 6e 0a 2a  has been, then.*
3b10: 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  * processing of 
3b20: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
3b30: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 2e   is interrupted.
3b40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  .**.** This macr
3b50: 6f 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  o added to every
3b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
3b70: 74 20 64 6f 65 73 20 61 20 6a 75 6d 70 20 69 6e  t does a jump in
3b80: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 69 6d 70   order to.** imp
3b90: 6c 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 2e 20 20  lement a loop.  
3ba0: 54 68 69 73 20 74 65 73 74 20 75 73 65 64 20 74  This test used t
3bb0: 6f 20 62 65 20 6f 6e 20 65 76 65 72 79 20 73 69  o be on every si
3bc0: 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  ngle instruction
3bd0: 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74 20 6d 65  ,.** but that me
3be0: 61 6e 74 20 77 65 20 6d 6f 72 65 20 74 65 73 74  ant we more test
3bf0: 69 6e 67 20 74 68 61 74 20 77 65 20 6e 65 65 64  ing that we need
3c00: 65 64 2e 20 20 42 79 20 6f 6e 6c 79 20 74 65 73  ed.  By only tes
3c10: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6c 61 67  ting the.** flag
3c20: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
3c30: 74 69 6f 6e 73 2c 20 77 65 20 67 65 74 20 61 20  tions, we get a 
3c40: 28 73 6d 61 6c 6c 29 20 73 70 65 65 64 20 69 6d  (small) speed im
3c50: 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 64  provement..*/.#d
3c60: 65 66 69 6e 65 20 43 48 45 43 4b 5f 46 4f 52 5f  efine CHECK_FOR_
3c70: 49 4e 54 45 52 52 55 50 54 20 5c 0a 20 20 20 69  INTERRUPT \.   i
3c80: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
3c90: 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20 61  rrupted ) goto a
3ca0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65  bort_due_to_inte
3cb0: 72 72 75 70 74 3b 0a 0a 23 69 66 64 65 66 20 53  rrupt;..#ifdef S
3cc0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3cd0: 69 63 20 69 6e 74 20 66 69 6c 65 45 78 69 73 74  ic int fileExist
3ce0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  s(sqlite3 *db, c
3cf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3d00: 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  ){.  int res = 0
3d10: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3d20: 49 54 45 5f 4f 4b 3b 0a 23 69 66 64 65 66 20 53  ITE_OK;.#ifdef S
3d30: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20  QLITE_TEST.  /* 
3d40: 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  If we are curren
3d50: 74 6c 79 20 74 65 73 74 69 6e 67 20 49 4f 20 65  tly testing IO e
3d60: 72 72 6f 72 73 2c 20 74 68 65 6e 20 64 6f 20 6e  rrors, then do n
3d70: 6f 74 20 63 61 6c 6c 20 4f 73 41 63 63 65 73 73  ot call OsAccess
3d80: 28 29 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20  () to.  ** test 
3d90: 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e 63 65  for the presence
3da0: 20 6f 66 20 7a 46 69 6c 65 2e 20 54 68 69 73 20   of zFile. This 
3db0: 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 49  is because any I
3dc0: 4f 20 65 72 72 6f 72 20 74 68 61 74 0a 20 20 2a  O error that.  *
3dd0: 2a 20 6f 63 63 75 72 73 20 68 65 72 65 20 77 69  * occurs here wi
3de0: 6c 6c 20 6e 6f 74 20 62 65 20 72 65 70 6f 72 74  ll not be report
3df0: 65 64 2c 20 63 61 75 73 69 6e 67 20 74 68 65 20  ed, causing the 
3e00: 74 65 73 74 20 74 6f 20 66 61 69 6c 2e 0a 20 20  test to fail..  
3e10: 2a 2f 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  */.  extern int 
3e20: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
3e30: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20  _pending;.  if( 
3e40: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
3e50: 5f 70 65 6e 64 69 6e 67 3c 3d 30 20 29 0a 23 65  _pending<=0 ).#e
3e60: 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
3e70: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
3e80: 2d 3e 70 56 66 73 2c 20 7a 46 69 6c 65 2c 20 53  ->pVfs, zFile, S
3e90: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
3ea0: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 72 65  STS, &res);.  re
3eb0: 74 75 72 6e 20 28 72 65 73 20 26 26 20 72 63 3d  turn (res && rc=
3ec0: 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 23  =SQLITE_OK);.}.#
3ed0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
3ee0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
3ef0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
3f00: 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  y called from wi
3f10: 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74 28 29  thin an assert()
3f20: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 74 0a   expression. It.
3f30: 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ** checks that t
3f40: 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72 61 6e  he sqlite3.nTran
3f50: 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62 6c 65  saction variable
3f60: 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20 73 65   is correctly se
3f70: 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  t to.** the numb
3f80: 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e 73 61  er of non-transa
3f90: 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 73  ction savepoints
3fa0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
3fb0: 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
3fc0: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 73 71  t starting at sq
3fd0: 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69 6e 74  lite3.pSavepoint
3fe0: 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65 3a 0a  ..** .** Usage:.
3ff0: 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  **.**     assert
4000: 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74  ( checkSavepoint
4010: 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a 2f 0a  Count(db) );.*/.
4020: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
4030: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 73  SavepointCount(s
4040: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
4050: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61 76 65  nt n = 0;.  Save
4060: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f 72 28  point *p;.  for(
4070: 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  p=db->pSavepoint
4080: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
4090: 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20   n++;.  assert( 
40a0: 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70 6f 69  n==(db->nSavepoi
40b0: 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61 6e 73  nt + db->isTrans
40c0: 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 29  actionSavepoint)
40d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
40e0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
40f0: 45 78 65 63 75 74 65 20 61 73 20 6d 75 63 68 20  Execute as much 
4100: 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  of a VDBE progra
4110: 6d 20 61 73 20 77 65 20 63 61 6e 20 74 68 65 6e  m as we can then
4120: 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 73   return..**.** s
4130: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
4140: 61 64 79 28 29 20 6d 75 73 74 20 62 65 20 63 61  ady() must be ca
4150: 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  lled before this
4160: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
4170: 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65 20 74 68  r to.** close th
4180: 65 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20 61  e program with a
4190: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 61   final OP_Halt a
41a0: 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
41b0: 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a 20 61 6e   callbacks.** an
41c0: 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  d the error mess
41d0: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  age pointer..**.
41e0: 2a 2a 20 57 68 65 6e 65 76 65 72 20 61 20 72 6f  ** Whenever a ro
41f0: 77 20 6f 72 20 72 65 73 75 6c 74 20 64 61 74 61  w or result data
4200: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   is available, t
4210: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
4220: 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e 76 6f 6b   either.** invok
4230: 65 20 74 68 65 20 72 65 73 75 6c 74 20 63 61 6c  e the result cal
4240: 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72 65 20  lback (if there 
4250: 69 73 20 6f 6e 65 29 20 6f 72 20 72 65 74 75 72  is one) or retur
4260: 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  n with.** SQLITE
4270: 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  _ROW..**.** If a
4280: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
4290: 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c 6f 63 6b  e to open a lock
42a0: 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
42b0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
42c0: 2a 20 77 69 6c 6c 20 65 69 74 68 65 72 20 69 6e  * will either in
42d0: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61  voke the busy ca
42e0: 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72 65  llback (if there
42f0: 20 69 73 20 6f 6e 65 29 20 6f 72 20 69 74 20 77   is one) or it w
4300: 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51  ill.** return SQ
4310: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
4320: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
4330: 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  urs, an error me
4340: 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
4350: 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
4360: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
4370: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
4380: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69 73 20 6d   p->zErrMsg is m
4390: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
43a0: 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20  that memory..** 
43b0: 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  The error code i
43c0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 2d 3e 72  s stored in p->r
43d0: 63 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  c and this routi
43e0: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
43f0: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 49  E_ERROR..**.** I
4400: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 65  f the callback e
4410: 76 65 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ver returns non-
4420: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4430: 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a 2a 20  rogram exits.** 
4440: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68  immediately.  Th
4450: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 65  ere will be no e
4460: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 75 74  rror message but
4470: 20 74 68 65 20 70 2d 3e 72 63 20 66 69 65 6c 64   the p->rc field
4480: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 53 51   is.** set to SQ
4490: 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e 64 20 74  LITE_ABORT and t
44a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
44b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
44c0: 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65  RROR..**.** A me
44d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
44e0: 65 72 72 6f 72 20 63 61 75 73 65 73 20 70 2d 3e  error causes p->
44f0: 72 63 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  rc to be set to 
4500: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
4510: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
4520: 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
4530: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4f  E_ERROR..**.** O
4540: 74 68 65 72 20 66 61 74 61 6c 20 65 72 72 6f 72  ther fatal error
4550: 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
4560: 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  ERROR..**.** Aft
4570: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
4580: 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 73 71  has finished, sq
4590: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
45a0: 65 28 29 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  e() should be.**
45b0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
45c0: 70 20 74 68 65 20 6d 65 73 73 20 74 68 61 74 20  p the mess that 
45d0: 77 61 73 20 6c 65 66 74 20 62 65 68 69 6e 64 2e  was left behind.
45e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
45f0: 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65 20  dbeExec(.  Vdbe 
4600: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
4610: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
4620: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63  E */.){.  int pc
4630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4640: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67       /* The prog
4650: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
4660: 20 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20   Op *pOp;       
4670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4680: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
4690: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
46a0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
46b0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
46c0: 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
46d0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
46e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
46f0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f  ase */.  u8 enco
4700: 64 69 6e 67 20 3d 20 45 4e 43 28 64 62 29 3b 20  ding = ENC(db); 
4710: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
4720: 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  ase encoding */.
4730: 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b    Mem *pIn1 = 0;
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4750: 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e  1st input operan
4760: 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32  d */.  Mem *pIn2
4770: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4780: 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f    /* 2nd input o
4790: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20  perand */.  Mem 
47a0: 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20  *pIn3 = 0;      
47b0: 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e         /* 3rd in
47c0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
47d0: 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20   Mem *pOut = 0; 
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
47f0: 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  utput operand */
4800: 0a 20 20 75 38 20 6f 70 50 72 6f 70 65 72 74 79  .  u8 opProperty
4810: 3b 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72 65  ;.  int iCompare
4820: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
4830: 2a 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74  * Result of last
4840: 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72   OP_Compare oper
4850: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ation */.  int *
4860: 61 50 65 72 6d 75 74 65 20 3d 20 30 3b 20 20 20  aPermute = 0;   
4870: 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 75 61 74        /* Permuat
4880: 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  ion of columns f
4890: 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f  or OP_Compare */
48a0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
48b0: 46 49 4c 45 0a 20 20 75 36 34 20 73 74 61 72 74  FILE.  u64 start
48c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
48d0: 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63    /* CPU clock c
48e0: 6f 75 6e 74 20 61 74 20 73 74 61 72 74 20 6f 66  ount at start of
48f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
4900: 20 6f 72 69 67 50 63 3b 20 20 20 20 20 20 20 20   origPc;        
4910: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
4920: 61 6d 20 63 6f 75 6e 74 65 72 20 61 74 20 73 74  am counter at st
4930: 61 72 74 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f  art of opcode */
4940: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
4950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
4960: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
4970: 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 4f 70 73  int nProgressOps
4980: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 70   = 0;      /* Op
4990: 63 6f 64 65 73 20 65 78 65 63 75 74 65 64 20 73  codes executed s
49a0: 69 6e 63 65 20 70 72 6f 67 72 65 73 73 20 63 61  ince progress ca
49b0: 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 23 65 6e 64 69  llback. */.#endi
49c0: 66 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  f.  UnpackedReco
49d0: 72 64 20 61 54 65 6d 70 52 65 63 5b 31 36 5d 3b  rd aTempRec[16];
49e0: 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
49f0: 64 20 61 20 74 72 61 6e 73 69 65 6e 74 20 55 6e  d a transient Un
4a00: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 2f 0a  packedRecord */.
4a10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4a20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4a30: 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74  RUN );  /* sqlit
4a40: 65 33 5f 73 74 65 70 28 29 20 76 65 72 69 66 69  e3_step() verifi
4a50: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 61 73 73  es this */.  ass
4a60: 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d  ert( db->magic==
4a70: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
4a80: 59 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Y );.  sqlite3Bt
4a90: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
4aa0: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
4ab0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
4ac0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
4ad0: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
4ae0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
4af0: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
4b00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4b10: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
4b20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4b30: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
4b40: 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   */.    goto no_
4b50: 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  mem;.  }.  asser
4b60: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
4b70: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
4b80: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 70  LITE_BUSY );.  p
4b90: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
4ba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
4bb0: 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  xplain==0 );.  p
4bc0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
4bd0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
4be0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
4bf0: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
4c00: 52 55 50 54 3b 0a 20 20 73 71 6c 69 74 65 33 56  RUPT;.  sqlite3V
4c10: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70 29  dbeIOTraceSql(p)
4c20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4c30: 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33 42  DEBUG.  sqlite3B
4c40: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
4c50: 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d  ();.  if( p->pc=
4c60: 3d 30 20 0a 20 20 20 26 26 20 28 28 70 2d 3e 64  =0 .   && ((p->d
4c70: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4c80: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 20 7c  E_VdbeListing) |
4c90: 7c 20 66 69 6c 65 45 78 69 73 74 73 28 64 62 2c  | fileExists(db,
4ca0: 20 22 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29   "vdbe_explain")
4cb0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ).  ){.    int i
4cc0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56 44  ;.    printf("VD
4cd0: 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69  BE Program Listi
4ce0: 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ng:\n");.    sql
4cf0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
4d00: 28 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (p);.    for(i=0
4d10: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
4d20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4d30: 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75  dbePrintOp(stdou
4d40: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
4d50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4d60: 66 28 20 66 69 6c 65 45 78 69 73 74 73 28 64 62  f( fileExists(db
4d70: 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 20  , "vdbe_trace") 
4d80: 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 20  ){.    p->trace 
4d90: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20 20  = stdout;.  }.  
4da0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
4db0: 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64 69 66  Malloc();.#endif
4dc0: 0a 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70 63 3b  .  for(pc=p->pc;
4dd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
4de0: 70 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  pc++){.    asser
4df0: 74 28 20 70 63 3e 3d 30 20 26 26 20 70 63 3c 70  t( pc>=0 && pc<p
4e00: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28  ->nOp );.    if(
4e10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4e20: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
4e30: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
4e40: 46 49 4c 45 0a 20 20 20 20 6f 72 69 67 50 63 20  FILE.    origPc 
4e50: 3d 20 70 63 3b 0a 20 20 20 20 73 74 61 72 74 20  = pc;.    start 
4e60: 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28  = sqlite3Hwtime(
4e70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4f  );.#endif.    pO
4e80: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 63 5d 3b  p = &p->aOp[pc];
4e90: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c  ..    /* Only al
4ea0: 6c 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53  low tracing if S
4eb0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
4ec0: 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23  efined..    */.#
4ed0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4ee0: 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72  UG.    if( p->tr
4ef0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ace ){.      if(
4f00: 20 70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   pc==0 ){.      
4f10: 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 45    printf("VDBE E
4f20: 78 65 63 75 74 69 6f 6e 20 54 72 61 63 65 3a 5c  xecution Trace:\
4f30: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
4f40: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
4f50: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
4f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4f70: 69 6e 74 4f 70 28 70 2d 3e 74 72 61 63 65 2c 20  intOp(p->trace, 
4f80: 70 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a  pc, pOp);.    }.
4f90: 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65      if( p->trace
4fa0: 3d 3d 30 20 26 26 20 70 63 3d 3d 30 20 29 7b 0a  ==0 && pc==0 ){.
4fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
4fc0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
4fd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6c 65  ;.      if( file
4fe0: 45 78 69 73 74 73 28 64 62 2c 20 22 76 64 62 65  Exists(db, "vdbe
4ff0: 5f 73 71 6c 74 72 61 63 65 22 29 20 29 7b 0a 20  _sqltrace") ){. 
5000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5010: 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20  bePrintSql(p);. 
5020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5030: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
5040: 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  loc();.    }.#en
5050: 64 69 66 0a 20 20 20 20 20 20 0a 0a 20 20 20 20  dif.      ..    
5060: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
5070: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 69  if we need to si
5080: 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74 65 72 72  mulate an interr
5090: 75 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  upt.  This only 
50a0: 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69  happens.    ** i
50b0: 66 20 77 65 20 68 61 76 65 20 61 20 73 70 65 63  f we have a spec
50c0: 69 61 6c 20 74 65 73 74 20 62 75 69 6c 64 2e 0a  ial test build..
50d0: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
50e0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66  LITE_TEST.    if
50f0: 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ( sqlite3_interr
5100: 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20  upt_count>0 ){. 
5110: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
5120: 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a  errupt_count--;.
5130: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5140: 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
5150: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
5160: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
5170: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t(db);.      }. 
5180: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66     }.#endif..#if
5190: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
51a0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
51b0: 43 4b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74  CK.    /* Call t
51c0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
51d0: 62 61 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f  back if it is co
51e0: 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74 68 65  nfigured and the
51f0: 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72   required number
5200: 0a 20 20 20 20 2a 2a 20 6f 66 20 56 44 42 45 20  .    ** of VDBE 
5210: 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78  ops have been ex
5220: 65 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73  ecuted (either s
5230: 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61  ince this invoca
5240: 74 69 6f 6e 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tion of.    ** s
5250: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
5260: 20 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74   or since last t
5270: 69 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73 73  ime the progress
5280: 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61   callback was ca
5290: 6c 6c 65 64 29 2e 0a 20 20 20 20 2a 2a 20 49 66  lled)..    ** If
52a0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
52b0: 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
52c0: 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20 74 68  on-zero, exit th
52d0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
52e0: 65 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 20  e with.    ** a 
52f0: 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c 49  return code SQLI
5300: 54 45 5f 41 42 4f 52 54 2e 0a 20 20 20 20 2a 2f  TE_ABORT..    */
5310: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72  .    if( db->xPr
5320: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
5330: 69 66 28 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73  if( db->nProgres
5340: 73 4f 70 73 3d 3d 6e 50 72 6f 67 72 65 73 73 4f  sOps==nProgressO
5350: 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ps ){.        in
5360: 74 20 70 72 63 3b 0a 20 20 20 20 20 20 20 20 69  t prc;.        i
5370: 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
5380: 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20 61  Off(db) ) goto a
5390: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75  bort_due_to_misu
53a0: 73 65 3b 0a 20 20 20 20 20 20 20 20 70 72 63 20  se;.        prc 
53b0: 3d 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28 64  =db->xProgress(d
53c0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 29  b->pProgressArg)
53d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
53e0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
53f0: 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
5400: 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20  ue_to_misuse;.  
5410: 20 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30        if( prc!=0
5420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
5430: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
5440: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
5450: 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
5460: 61 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  alt;.        }. 
5470: 20 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73         nProgress
5480: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ops = 0;.      }
5490: 0a 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73  .      nProgress
54a0: 4f 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  Ops++;.    }.#en
54b0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 63  dif..    /* Do c
54c0: 6f 6d 6d 6f 6e 20 73 65 74 75 70 20 70 72 6f 63  ommon setup proc
54d0: 65 73 73 69 6e 67 20 66 6f 72 20 61 6e 79 20 6f  essing for any o
54e0: 70 63 6f 64 65 20 74 68 61 74 20 69 73 20 6d 61  pcode that is ma
54f0: 72 6b 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68  rked.    ** with
5500: 20 74 68 65 20 22 6f 75 74 32 2d 70 72 65 72 65   the "out2-prere
5510: 6c 65 61 73 65 22 20 74 61 67 2e 20 20 53 75 63  lease" tag.  Suc
5520: 68 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 61  h opcodes have a
5530: 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20 6f   single.    ** o
5540: 75 74 70 75 74 20 77 68 69 63 68 20 69 73 20 73  utput which is s
5550: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
5560: 50 32 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54  P2 parameter.  T
5570: 68 65 20 50 32 20 72 65 67 69 73 74 65 72 0a 20  he P2 register. 
5580: 20 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c     ** is initial
5590: 69 7a 65 64 20 74 6f 20 61 20 4e 55 4c 4c 2e 0a  ized to a NULL..
55a0: 20 20 20 20 2a 2f 0a 20 20 20 20 6f 70 50 72 6f      */.    opPro
55b0: 70 65 72 74 79 20 3d 20 6f 70 63 6f 64 65 50 72  perty = opcodePr
55c0: 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f  operty[pOp->opco
55d0: 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 6f 70  de];.    if( (op
55e0: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
55f0: 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53 45  _OUT2_PRERELEASE
5600: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5610: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
5620: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5630: 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65   pOp->p2<=p->nMe
5640: 6d 20 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20  m );.      pOut 
5650: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
5660: 70 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p2];.      sqlit
5670: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
5680: 45 78 74 65 72 6e 61 6c 28 70 4f 75 74 29 3b 0a  External(pOut);.
5690: 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67        pOut->flag
56a0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
56b0: 20 20 7d 65 6c 73 65 0a 20 0a 20 20 20 20 2f 2a    }else. .    /*
56c0: 20 44 6f 20 63 6f 6d 6d 6f 6e 20 73 65 74 75 70   Do common setup
56d0: 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 6d 61 72   for opcodes mar
56e0: 6b 65 64 20 77 69 74 68 20 6f 6e 65 20 6f 66 20  ked with one of 
56f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
5700: 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e    ** combination
5710: 73 20 6f 66 20 70 72 6f 70 65 72 74 69 65 73 2e  s of properties.
5720: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
5730: 20 20 20 20 20 20 20 20 20 69 6e 31 0a 20 20 20           in1.   
5740: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 6e   **           in
5750: 31 20 69 6e 32 0a 20 20 20 20 2a 2a 20 20 20 20  1 in2.    **    
5760: 20 20 20 20 20 20 20 69 6e 31 20 69 6e 32 20 6f         in1 in2 o
5770: 75 74 33 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ut3.    **      
5780: 20 20 20 20 20 69 6e 31 20 69 6e 33 0a 20 20 20       in1 in3.   
5790: 20 2a 2a 0a 20 20 20 20 2a 2a 20 56 61 72 69 61   **.    ** Varia
57a0: 62 6c 65 73 20 70 49 6e 31 2c 20 70 49 6e 32 2c  bles pIn1, pIn2,
57b0: 20 61 6e 64 20 70 49 6e 33 20 61 72 65 20 6d 61   and pIn3 are ma
57c0: 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  de to point to a
57d0: 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a  ppropriate.    *
57e0: 2a 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  * registers for 
57f0: 69 6e 70 75 74 73 2e 20 20 56 61 72 69 61 62 6c  inputs.  Variabl
5800: 65 20 70 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  e pOut points to
5810: 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69   the output regi
5820: 73 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ster..    */.   
5830: 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79   if( (opProperty
5840: 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30   & OPFLG_IN1)!=0
5850: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
5860: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20  ( pOp->p1>0 );. 
5870: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5880: 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p1<=p->nMem );
5890: 0a 20 20 20 20 20 20 70 49 6e 31 20 3d 20 26 70  .      pIn1 = &p
58a0: 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b  ->aMem[pOp->p1];
58b0: 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f  .      REGISTER_
58c0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
58d0: 49 6e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  In1);.      if( 
58e0: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
58f0: 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20  FLG_IN2)!=0 ){. 
5900: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5910: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
5920: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5930: 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p2<=p->nMem );.
5940: 20 20 20 20 20 20 20 20 70 49 6e 32 20 3d 20 26          pIn2 = &
5950: 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  p->aMem[pOp->p2]
5960: 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54  ;.        REGIST
5970: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
5980: 2c 20 70 49 6e 32 29 3b 0a 20 20 20 20 20 20 20  , pIn2);.       
5990: 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79   if( (opProperty
59a0: 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29 21 3d   & OPFLG_OUT3)!=
59b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
59c0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
59d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
59e0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70  sert( pOp->p3<=p
59f0: 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20  ->nMem );.      
5a00: 20 20 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61      pOut = &p->a
5a10: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
5a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5a30: 6c 73 65 20 69 66 28 20 28 6f 70 50 72 6f 70 65  lse if( (opPrope
5a40: 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29  rty & OPFLG_IN3)
5a50: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5a60: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
5a70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5a80: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e  rt( pOp->p3<=p->
5a90: 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  nMem );.        
5aa0: 70 49 6e 33 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pIn3 = &p->aMem[
5ab0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
5ac0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
5ad0: 28 70 4f 70 2d 3e 70 33 2c 20 70 49 6e 33 29 3b  (pOp->p3, pIn3);
5ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5af0: 73 65 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72  se if( (opProper
5b00: 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21  ty & OPFLG_IN2)!
5b10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
5b20: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b  rt( pOp->p2>0 );
5b30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5b40: 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p2<=p->nMem 
5b50: 29 3b 0a 20 20 20 20 20 20 70 49 6e 32 20 3d 20  );.      pIn2 = 
5b60: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  &p->aMem[pOp->p2
5b70: 5d 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  ];.      REGISTE
5b80: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
5b90: 20 70 49 6e 32 29 3b 0a 20 20 20 20 7d 65 6c 73   pIn2);.    }els
5ba0: 65 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74  e if( (opPropert
5bb0: 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d  y & OPFLG_IN3)!=
5bc0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
5bd0: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
5be0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5bf0: 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
5c00: 3b 0a 20 20 20 20 20 20 70 49 6e 33 20 3d 20 26  ;.      pIn3 = &
5c10: 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  p->aMem[pOp->p3]
5c20: 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52  ;.      REGISTER
5c30: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
5c40: 70 49 6e 33 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pIn3);.    }..  
5c50: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
5c60: 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a  pcode ){../*****
5c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cb0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74  ********.** What
5cc0: 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61   follows is a ma
5cd0: 73 73 69 76 65 20 73 77 69 74 63 68 20 73 74 61  ssive switch sta
5ce0: 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61 63  tement where eac
5cf0: 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74  h case implement
5d00: 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  s a.** separate 
5d10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  instruction in t
5d20: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
5d30: 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f  ne.  If we follo
5d40: 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69  w the usual.** i
5d50: 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65  ndentation conve
5d60: 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61 73  ntions, each cas
5d70: 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
5d80: 6e 74 65 64 20 62 79 20 36 20 73 70 61 63 65 73  nted by 6 spaces
5d90: 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 69  .  But.** that i
5da0: 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74 65  s a lot of waste
5db0: 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 6c  d space on the l
5dc0: 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20  eft margin.  So 
5dd0: 74 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 0a  the code within.
5de0: 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20 73 74  ** the switch st
5df0: 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65  atement will bre
5e00: 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74 69  ak with conventi
5e10: 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68 2d  on and be flush-
5e20: 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a  left. Another.**
5e30: 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69   big comment (si
5e40: 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f 6e  milar to this on
5e50: 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65  e) will mark the
5e60: 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
5e70: 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20 74  de where.** we t
5e80: 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74  ransition back t
5e90: 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61  o normal indenta
5ea0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5eb0: 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65 61  formatting of ea
5ec0: 63 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f 72  ch case is impor
5ed0: 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65 66  tant.  The makef
5ee0: 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a  ile for SQLite.*
5ef0: 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  * generates two 
5f00: 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65 73  C files "opcodes
5f10: 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65 73  .h" and "opcodes
5f20: 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .c" by scanning 
5f30: 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f  this.** file loo
5f40: 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20 74  king for lines t
5f50: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
5f60: 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65 20  case OP_".  The 
5f70: 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a  opcodes.h files.
5f80: 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65  ** will be fille
5f90: 64 20 77 69 74 68 20 23 64 65 66 69 6e 65 73 20  d with #defines 
5fa0: 74 68 61 74 20 67 69 76 65 20 75 6e 69 71 75 65  that give unique
5fb0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
5fc0: 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64  to each.** opcod
5fd0: 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  e and the opcode
5fe0: 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c 6c  s.c file is fill
5ff0: 65 64 20 77 69 74 68 20 61 6e 20 61 72 72 61 79  ed with an array
6000: 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65 72   of strings wher
6010: 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e 67  e.** each string
6020: 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63   is the symbolic
6030: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
6040: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f  rresponding opco
6050: 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  de.  If the.** c
6060: 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ase statement is
6070: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
6080: 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f  omment of the fo
6090: 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20 2e  rm "/# same as .
60a0: 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63  .. #/".** that c
60b0: 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  omment is used t
60c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
60d0: 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
60e0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a   of the opcode..
60f0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77  **.** Other keyw
6100: 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ords in the comm
6110: 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ent that follows
6120: 20 65 61 63 68 20 63 61 73 65 20 61 72 65 20 75   each case are u
6130: 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72  sed to.** constr
6140: 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e  uct the OPFLG_IN
6150: 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65 20  ITIALIZER value 
6160: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
6170: 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b   opcodeProperty[
6180: 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69  ]..** Keywords i
6190: 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32  nclude: in1, in2
61a0: 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72 65 72  , in3, out2_prer
61b0: 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20 6f 75  elease, out2, ou
61c0: 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  t3.  See.** the 
61d0: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
61e0: 72 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f  ript for additio
61f0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
6200: 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61  .**.** Documenta
6210: 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20  tion about VDBE 
6220: 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72  opcodes is gener
6230: 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67  ated by scanning
6240: 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f   this file.** fo
6250: 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20  r lines of that 
6260: 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a  contain "Opcode:
6270: 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e  ".  That line an
6280: 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
6290: 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65  .** comment line
62a0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
62b0: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
62c0: 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20  the opcode.html 
62d0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  documentation.**
62e0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d   file..**.** SUM
62f0: 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  MARY:.**.**     
6300: 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d  Formatting is im
6310: 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70  portant to scrip
6320: 74 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69  ts that scan thi
6330: 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44  s file..**     D
6340: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
6350: 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e  om the formattin
6360: 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c  g style currentl
6370: 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a  y in use..**.***
6380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20  **********/../* 
63d0: 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20  Opcode:  Goto * 
63e0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
63f0: 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
6400: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
6410: 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  P2..** The next 
6420: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63  instruction exec
6430: 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  uted will be .**
6440: 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65   the one at inde
6450: 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65  x P2 from the be
6460: 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
6470: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61  e program..*/.ca
6480: 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20  se OP_Goto: {   
6490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
64a0: 70 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46 4f 52  p */.  CHECK_FOR
64b0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 63  _INTERRUPT;.  pc
64c0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
64d0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
64e0: 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20 50 31  pcode:  Gosub P1
64f0: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
6500: 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
6510: 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f 20 72  t address onto r
6520: 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 61 6e  egister P1.** an
6530: 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 61  d then jump to a
6540: 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a 63 61  ddress P2..*/.ca
6550: 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b 20 20  se OP_Gosub: {  
6560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
6570: 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  p */.  assert( p
6580: 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73  Op->p1>0 );.  as
6590: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c 3d 70  sert( pOp->p1<=p
65a0: 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 49 6e 31  ->nMem );.  pIn1
65b0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d   = &p->aMem[pOp-
65c0: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
65d0: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
65e0: 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20  EM_Dyn)==0 );.  
65f0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pIn1->flags = ME
6600: 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d 3e 75  M_Int;.  pIn1->u
6610: 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47 49 53  .i = pc;.  REGIS
6620: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
6630: 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63 20 3d  1, pIn1);.  pc =
6640: 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
6650: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
6660: 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 31 20  ode:  Return P1 
6670: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75  * * * *.**.** Ju
6680: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
6690: 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65 72  nstruction after
66a0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e 20   the address in 
66b0: 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2f 0a  register P1..*/.
66c0: 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e 3a 20  case OP_Return: 
66d0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  {           /* i
66e0: 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n1 */.  assert( 
66f0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
6700: 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63 20 3d 20  M_Int );.  pc = 
6710: 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a  (int)pIn1->u.i;.
6720: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6730: 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50 31  pcode:  Yield P1
6740: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53   * * * *.**.** S
6750: 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d 20  wap the program 
6760: 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68 65  counter with the
6770: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
6780: 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P1..*/.case O
6790: 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20 20 20  P_Yield: {      
67a0: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
67b0: 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20 20    int pcDest;.  
67c0: 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66  assert( (pIn1->f
67d0: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d  lags & MEM_Dyn)=
67e0: 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c  =0 );.  pIn1->fl
67f0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
6800: 20 70 63 44 65 73 74 20 3d 20 28 69 6e 74 29 70   pcDest = (int)p
6810: 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70 49 6e 31  In1->u.i;.  pIn1
6820: 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45  ->u.i = pc;.  RE
6830: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
6840: 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70  ->p1, pIn1);.  p
6850: 63 20 3d 20 70 63 44 65 73 74 3b 0a 20 20 62 72  c = pcDest;.  br
6860: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
6870: 65 3a 20 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20  e:  HaltIfNull  
6880: 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
6890: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61  .** Check the va
68a0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
68b0: 50 33 2e 20 20 49 66 20 69 73 20 69 73 20 4e 55  P3.  If is is NU
68c0: 4c 4c 20 74 68 65 6e 20 48 61 6c 74 20 75 73 69  LL then Halt usi
68d0: 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ng.** parameter 
68e0: 50 31 2c 20 50 32 2c 20 61 6e 64 20 50 34 20 61  P1, P2, and P4 a
68f0: 73 20 69 66 20 74 68 69 73 20 77 65 72 65 20 61  s if this were a
6900: 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f   Halt instructio
6910: 6e 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 76 61  n.  If the.** va
6920: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
6930: 50 33 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P3 is not NULL, 
6940: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6950: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
6960: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e  .case OP_HaltIfN
6970: 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69  ull: {      /* i
6980: 6e 33 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e  n3 */.  if( (pIn
6990: 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  3->flags & MEM_N
69a0: 75 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ull)==0 ) break;
69b0: 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
69c0: 67 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20  gh into OP_Halt 
69d0: 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  */.}../* Opcode:
69e0: 20 20 48 61 6c 74 20 50 31 20 50 32 20 2a 20 50    Halt P1 P2 * P
69f0: 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69  4 *.**.** Exit i
6a00: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c  mmediately.  All
6a10: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 65   open cursors, e
6a20: 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a  tc are closed.**
6a30: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
6a40: 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
6a50: 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74 75  result code retu
6a60: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
6a70: 65 78 65 63 28 29 2c 20 73 71 6c 69 74 65 33 5f  exec(), sqlite3_
6a80: 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73  reset(),.** or s
6a90: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6aa0: 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c  ).  For a normal
6ab0: 20 68 61 6c 74 2c 20 74 68 69 73 20 73 68 6f 75   halt, this shou
6ac0: 6c 64 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20  ld be SQLITE_OK 
6ad0: 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f  (0)..** For erro
6ae0: 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20 73 6f  rs, it can be so
6af0: 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 65 2e 20  me other value. 
6b00: 20 49 66 20 50 31 21 3d 30 20 74 68 65 6e 20 50   If P1!=0 then P
6b10: 32 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  2 will determine
6b20: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
6b30: 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ot to rollback t
6b40: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
6b50: 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20  action.  Do not 
6b60: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50  rollback.** if P
6b70: 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74  2==OE_Fail. Do t
6b80: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50  he rollback if P
6b90: 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20  2==OE_Rollback. 
6ba0: 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74   If P2==OE_Abort
6bb0: 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f  ,.** then back o
6bc0: 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  ut all changes t
6bd0: 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65  hat have occurre
6be0: 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 65 78  d during this ex
6bf0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ecution of the.*
6c00: 2a 20 56 44 42 45 2c 20 62 75 74 20 64 6f 20 6e  * VDBE, but do n
6c10: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ot rollback the 
6c20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
6c30: 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74  .** If P4 is not
6c40: 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69 73   null then it is
6c50: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
6c60: 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  e string..**.** 
6c70: 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d 70 6c  There is an impl
6c80: 69 65 64 20 22 48 61 6c 74 20 30 20 30 20 30 22  ied "Halt 0 0 0"
6c90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 73   instruction ins
6ca0: 65 72 74 65 64 20 61 74 20 74 68 65 20 76 65 72  erted at the ver
6cb0: 79 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72  y end of.** ever
6cc0: 79 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61  y program.  So a
6cd0: 20 6a 75 6d 70 20 70 61 73 74 20 74 68 65 20 6c   jump past the l
6ce0: 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ast instruction 
6cf0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a  of the program.*
6d00: 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
6d10: 20 65 78 65 63 75 74 69 6e 67 20 48 61 6c 74 2e   executing Halt.
6d20: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74  .*/.case OP_Halt
6d30: 3a 20 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f  : {.  p->rc = pO
6d40: 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 70 63 20 3d  p->p1;.  p->pc =
6d50: 20 70 63 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41   pc;.  p->errorA
6d60: 63 74 69 6f 6e 20 3d 20 70 4f 70 2d 3e 70 32 3b  ction = pOp->p2;
6d70: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e 7a  .  if( pOp->p4.z
6d80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
6d90: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
6da0: 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
6db0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 7d 0a  pOp->p4.z);.  }.
6dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
6dd0: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73  beHalt(p);.  ass
6de0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
6df0: 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
6e00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72  TE_OK );.  if( r
6e10: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
6e20: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63  {.    p->rc = rc
6e30: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
6e40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
6e50: 3d 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45  = p->rc ? SQLITE
6e60: 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
6e70: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f  DONE;.  }.  goto
6e80: 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a   vdbe_return;.}.
6e90: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65  ./* Opcode: Inte
6ea0: 67 65 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ger P1 P2 * * *.
6eb0: 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62 69 74  **.** The 32-bit
6ec0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50   integer value P
6ed0: 31 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  1 is written int
6ee0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
6ef0: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 65  /.case OP_Intege
6f00: 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  r: {         /* 
6f10: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
6f20: 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  */.  pOut->flags
6f30: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 4f   = MEM_Int;.  pO
6f40: 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  ut->u.i = pOp->p
6f50: 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  1;.  break;.}../
6f60: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20  * Opcode: Int64 
6f70: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  * P2 * P4 *.**.*
6f80: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
6f90: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
6fa0: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
6fb0: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
6fc0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
6fd0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
6fe0: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
6ff0: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
7000: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7010: 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30   pOp->p4.pI64!=0
7020: 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67   );.  pOut->flag
7030: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70  s = MEM_Int;.  p
7040: 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d  Out->u.i = *pOp-
7050: 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65 61  >p4.pI64;.  brea
7060: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7070: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
7080: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
7090: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
70a0: 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
70b0: 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69  nt value..** Wri
70c0: 74 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  te that value in
70d0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
70e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 3a  */.case OP_Real:
70f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
7100: 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c 4f 41   same as TK_FLOA
7110: 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  T, out2-prerelea
7120: 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c  se */.  pOut->fl
7130: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
7140: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
7150: 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34  e3IsNaN(*pOp->p4
7160: 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f 75  .pReal) );.  pOu
7170: 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e  t->r = *pOp->p4.
7180: 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a  pReal;.  break;.
7190: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 74  }../* Opcode: St
71a0: 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50 34 20  ring8 * P2 * P4 
71b0: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74  *.**.** P4 point
71c0: 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  s to a nul termi
71d0: 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74 72 69  nated UTF-8 stri
71e0: 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20  ng. This opcode 
71f0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a  is transformed .
7200: 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 53 74  ** into an OP_St
7210: 72 69 6e 67 20 62 65 66 6f 72 65 20 69 74 20 69  ring before it i
7220: 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74  s executed for t
7230: 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 0a 2a  he first time..*
7240: 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67  /.case OP_String
7250: 38 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  8: {         /* 
7260: 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52 49 4e  same as TK_STRIN
7270: 47 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  G, out2-prerelea
7280: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
7290: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a  pOp->p4.z!=0 );.
72a0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
72b0: 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70  OP_String;.  pOp
72c0: 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33 53 74  ->p1 = sqlite3St
72d0: 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a  rlen30(pOp->p4.z
72e0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
72f0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
7300: 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51  if( encoding!=SQ
7310: 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20  LITE_UTF8 ){.   
7320: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
7330: 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d  etStr(pOut, pOp-
7340: 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  >p4.z, -1, SQLIT
7350: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7360: 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20  TATIC);.    if( 
7370: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7380: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
7390: 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63 6f 64  ding(pOut, encod
73a0: 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  ing) ) goto no_m
73b0: 65 6d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  em;.    if( SQLI
73c0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64  TE_OK!=sqlite3Vd
73d0: 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62  beMemMakeWriteab
73e0: 6c 65 28 70 4f 75 74 29 20 29 20 67 6f 74 6f 20  le(pOut) ) goto 
73f0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 70 4f 75 74  no_mem;.    pOut
7400: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
7410: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c     pOut->flags |
7420: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a 20 20  = MEM_Static;.  
7430: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26 3d    pOut->flags &=
7440: 20 7e 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 69   ~MEM_Dyn;.    i
7450: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
7460: 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  P4_DYNAMIC ){.  
7470: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7480: 65 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  e(db, pOp->p4.z)
7490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 2d  ;.    }.    pOp-
74a0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
74b0: 41 4d 49 43 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  AMIC;.    pOp->p
74c0: 34 2e 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20  4.z = pOut->z;. 
74d0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 75     pOp->p1 = pOu
74e0: 74 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 70 4f  t->n;.    if( pO
74f0: 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  p->p1>db->aLimit
7500: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
7510: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67  NGTH] ){.      g
7520: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
7530: 20 7d 0a 20 20 20 20 55 50 44 41 54 45 5f 4d 41   }.    UPDATE_MA
7540: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
7550: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
7560: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f  .#endif.  if( pO
7570: 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  p->p1>db->aLimit
7580: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
7590: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
75a0: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
75b0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
75c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
75d0: 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a  e, OP_String */.
75e0: 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  }.  ./* Opcode: 
75f0: 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a 20 50  String P1 P2 * P
7600: 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74  4 *.**.** The st
7610: 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20 6f 66  ring value P4 of
7620: 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79 74 65   length P1 (byte
7630: 73 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  s) is stored in 
7640: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
7650: 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20  case OP_String: 
7660: 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
7670: 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
7680: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7690: 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75  p4.z!=0 );.  pOu
76a0: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  t->flags = MEM_S
76b0: 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  tr|MEM_Static|ME
76c0: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
76d0: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
76e0: 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e   pOut->n = pOp->
76f0: 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  p1;.  pOut->enc 
7700: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50  = encoding;.  UP
7710: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
7720: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
7730: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
7740: 4e 75 6c 6c 20 2a 20 50 32 20 2a 20 2a 20 2a 0a  Null * P2 * * *.
7750: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e 55  **.** Write a NU
7760: 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  LL into register
7770: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
7780: 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20  Null: {         
7790: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
77a0: 65 61 73 65 20 2a 2f 0a 20 20 62 72 65 61 6b 3b  ease */.  break;
77b0: 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
77c0: 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 0a  Blob P1 P2 * P4.
77d0: 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20  **.** P4 points 
77e0: 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  to a blob of dat
77f0: 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e  a P1 bytes long.
7800: 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20    Store this.** 
7810: 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72  blob in register
7820: 20 50 32 2e 20 54 68 69 73 20 69 6e 73 74 72 75   P2. This instru
7830: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 64  ction is not cod
7840: 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
7850: 79 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  y the compiler. 
7860: 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63 6f 6d  Instead, the com
7870: 70 69 6c 65 72 20 6c 61 79 65 72 20 73 70 65 63  piler layer spec
7880: 69 66 69 65 73 0a 2a 2a 20 61 6e 20 4f 50 5f 48  ifies.** an OP_H
7890: 65 78 42 6c 6f 62 20 6f 70 63 6f 64 65 2c 20 77  exBlob opcode, w
78a0: 69 74 68 20 74 68 65 20 68 65 78 20 73 74 72 69  ith the hex stri
78b0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
78c0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  n of.** the blob
78d0: 20 61 73 20 50 34 2e 20 54 68 69 73 20 6f 70 63   as P4. This opc
78e0: 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ode is transform
78f0: 65 64 20 74 6f 20 61 6e 20 4f 50 5f 42 6c 6f 62  ed to an OP_Blob
7900: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
7910: 6d 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  me it is execute
7920: 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c  d..*/.case OP_Bl
7930: 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ob: {           
7940: 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65       /* out2-pre
7950: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73  release */.  ass
7960: 65 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20  ert( pOp->p1 <= 
7970: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
7980: 48 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  H );.  sqlite3Vd
7990: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
79a0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70  , pOp->p4.z, pOp
79b0: 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70  ->p1, 0, 0);.  p
79c0: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
79d0: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
79e0: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
79f0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7a00: 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c   Opcode: Variabl
7a10: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
7a20: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
7a30: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75  he values of bou
7a40: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 50 31  nd parameters P1
7a50: 2e 2e 50 31 2b 50 33 2d 31 20 69 6e 74 6f 20 72  ..P1+P3-1 into r
7a60: 65 67 69 73 74 65 72 73 0a 2a 2a 20 50 32 2e 2e  egisters.** P2..
7a70: 50 32 2b 50 33 2d 31 2e 0a 2a 2a 0a 2a 2a 20 49  P2+P3-1..**.** I
7a80: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
7a90: 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69  is named, then i
7aa0: 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73 20  ts name appears 
7ab0: 69 6e 20 50 34 20 61 6e 64 20 50 33 3d 3d 31 2e  in P4 and P3==1.
7ac0: 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65  .** The P4 value
7ad0: 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
7ae0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
7af0: 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63 61  er_name()..*/.ca
7b00: 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a 20  se OP_Variable: 
7b10: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 70 4f 70 2d  {.  int j = pOp-
7b20: 3e 70 31 20 2d 20 31 3b 0a 20 20 69 6e 74 20 6b  >p1 - 1;.  int k
7b30: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 4d 65   = pOp->p2;.  Me
7b40: 6d 20 2a 70 56 61 72 3b 0a 20 20 69 6e 74 20 6e  m *pVar;.  int n
7b50: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
7b60: 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 2b  sert( j>=0 && j+
7b70: 6e 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20  n<=p->nVar );.  
7b80: 61 73 73 65 72 74 28 20 6b 3e 3d 31 20 26 26 20  assert( k>=1 && 
7b90: 6b 2b 6e 2d 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  k+n-1<=p->nMem )
7ba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
7bb0: 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d  >p4.z==0 || pOp-
7bc0: 3e 70 33 3d 3d 31 20 29 3b 0a 0a 20 20 77 68 69  >p3==1 );..  whi
7bd0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
7be0: 20 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56     pVar = &p->aV
7bf0: 61 72 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  ar[j++];.    if(
7c00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
7c10: 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a 20  ooBig(pVar) ){. 
7c20: 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69       goto too_bi
7c30: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  g;.    }.    pOu
7c40: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6b 2b 2b  t = &p->aMem[k++
7c50: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
7c60: 62 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65  beMemReleaseExte
7c70: 72 6e 61 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  rnal(pOut);.    
7c80: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
7c90: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  M_Null;.    sqli
7ca0: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
7cb0: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72  wCopy(pOut, pVar
7cc0: 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
7cd0: 20 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c     UPDATE_MAX_BL
7ce0: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20  OBSIZE(pOut);.  
7cf0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
7d00: 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31   Opcode: Move P1
7d10: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
7d20: 20 4d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 73   Move the values
7d30: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
7d40: 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69 6e  .P1+P3-1 over in
7d50: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  to.** registers 
7d60: 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52 65  P2..P2+P3-1.  Re
7d70: 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50  gisters P1..P1+P
7d80: 31 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74 20  1-1 are.** left 
7d90: 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e 20  holding a NULL. 
7da0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
7db0: 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61 6e  for register ran
7dc0: 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50 33  ges.** P1..P1+P3
7dd0: 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50 33  -1 and P2..P2+P3
7de0: 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 0a 2a  -1 to overlap..*
7df0: 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20  /.case OP_Move: 
7e00: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f  {.  char *zMallo
7e10: 63 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 4f 70  c;.  int n = pOp
7e20: 2d 3e 70 33 3b 0a 20 20 69 6e 74 20 70 31 20 3d  ->p3;.  int p1 =
7e30: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20   pOp->p1;.  int 
7e40: 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  p2 = pOp->p2;.  
7e50: 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20 70  assert( n>0 && p
7e60: 31 3e 30 20 26 26 20 70 32 3e 30 20 29 3b 0a 20  1>0 && p2>0 );. 
7e70: 20 61 73 73 65 72 74 28 20 70 31 2b 6e 3c 3d 70   assert( p1+n<=p
7e80: 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31 20 29 3b  2 || p2+n<=p1 );
7e90: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 70 2d 3e 61  ..  pIn1 = &p->a
7ea0: 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Mem[p1];.  pOut 
7eb0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 32 5d 3b 0a  = &p->aMem[p2];.
7ec0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a    while( n-- ){.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74      assert( pOut
7ee0: 3c 3d 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d  <=&p->aMem[p->nM
7ef0: 65 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  em] );.    asser
7f00: 74 28 20 70 49 6e 31 3c 3d 26 70 2d 3e 61 4d 65  t( pIn1<=&p->aMe
7f10: 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20  m[p->nMem] );.  
7f20: 20 20 7a 4d 61 6c 6c 6f 63 20 3d 20 70 4f 75 74    zMalloc = pOut
7f30: 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70  ->zMalloc;.    p
7f40: 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Out->zMalloc = 0
7f50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7f60: 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70  eMemMove(pOut, p
7f70: 49 6e 31 29 3b 0a 20 20 20 20 70 49 6e 31 2d 3e  In1);.    pIn1->
7f80: 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4d 61 6c 6c 6f  zMalloc = zMallo
7f90: 63 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  c;.    REGISTER_
7fa0: 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74  TRACE(p2++, pOut
7fb0: 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
7fc0: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20     pOut++;.  }. 
7fd0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
7fe0: 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20 50 32  code: Copy P1 P2
7ff0: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b   * * *.**.** Mak
8000: 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67 69  e a copy of regi
8010: 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  ster P1 into reg
8020: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
8030: 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
8040: 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63 6f   makes a deep co
8050: 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  py of the value.
8060: 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a    A duplicate.**
8070: 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79 20   is made of any 
8080: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63  string or blob c
8090: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61 6c  onstant.  See al
80a0: 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a  so OP_SCopy..*/.
80b0: 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b 20  case OP_Copy: { 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
80d0: 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n1 */.  assert( 
80e0: 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61  pOp->p2>0 );.  a
80f0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
8100: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75  p->nMem );.  pOu
8110: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  t = &p->aMem[pOp
8120: 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
8130: 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20   pOut!=pIn1 );. 
8140: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
8150: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
8160: 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d   pIn1, MEM_Ephem
8170: 29 3b 0a 20 20 44 65 65 70 68 65 6d 65 72 61 6c  );.  Deephemeral
8180: 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 52 45 47  ize(pOut);.  REG
8190: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
81a0: 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72  >p2, pOut);.  br
81b0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
81c0: 65 3a 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a  e: SCopy P1 P2 *
81d0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20   * *.**.** Make 
81e0: 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  a shallow copy o
81f0: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  f register P1 in
8200: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
8210: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
8220: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73  uction makes a s
8230: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
8240: 68 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  he value.  If th
8250: 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20  e value.** is a 
8260: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20  string or blob, 
8270: 74 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73  then the copy is
8280: 20 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20   only a pointer 
8290: 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  to the.** origin
82a0: 61 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20  al and hence if 
82b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61  the original cha
82c0: 6e 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65  nges so will the
82d0: 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c   copy..** Worse,
82e0: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
82f0: 20 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   is deallocated,
8300: 20 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65   the copy become
8310: 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68  s invalid..** Th
8320: 75 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d  us the program m
8330: 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
8340: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
8350: 77 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a  will not change.
8360: 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  ** during the li
8370: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f  fetime of the co
8380: 70 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79  py.  Use OP_Copy
8390: 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c   to make a compl
83a0: 65 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a  ete.** copy..*/.
83b0: 63 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b  case OP_SCopy: {
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
83d0: 6e 31 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52  n1 */.  REGISTER
83e0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
83f0: 70 49 6e 31 29 3b 0a 20 20 61 73 73 65 72 74 28  pIn1);.  assert(
8400: 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
8410: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c  assert( pOp->p2<
8420: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f  =p->nMem );.  pO
8430: 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  ut = &p->aMem[pO
8440: 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
8450: 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a  ( pOut!=pIn1 );.
8460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
8470: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
8480: 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65  , pIn1, MEM_Ephe
8490: 6d 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54  m);.  REGISTER_T
84a0: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
84b0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
84c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75  ./* Opcode: Resu
84d0: 6c 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20  ltRow P1 P2 * * 
84e0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  *.**.** The regi
84f0: 73 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68  sters P1 through
8500: 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e   P1+P2-1 contain
8510: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
8520: 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69  .** results. Thi
8530: 73 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20  s opcode causes 
8540: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  the sqlite3_step
8550: 28 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69  () call to termi
8560: 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20  nate.** with an 
8570: 53 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72  SQLITE_ROW retur
8580: 6e 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65  n code and it se
8590: 74 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65  ts up the sqlite
85a0: 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74  3_stmt.** struct
85b0: 75 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ure to provide a
85c0: 63 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70  ccess to the top
85d0: 20 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68   P1 values as th
85e0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e  e result.** row.
85f0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75  .*/.case OP_Resu
8600: 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a  ltRow: {.  Mem *
8610: 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pMem;.  int i;. 
8620: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73   assert( p->nRes
8630: 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20  Column==pOp->p2 
8640: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
8650: 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p1>0 );.  asse
8660: 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d  rt( pOp->p1+pOp-
8670: 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  >p2<=p->nMem+1 )
8680: 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61  ;..  /* Invalida
8690: 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61 6c  te all ephemeral
86a0: 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63 68   cursor row cach
86b0: 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68 65  es */.  p->cache
86c0: 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65 43  Ctr = (p->cacheC
86d0: 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a  tr + 2)|1;..  /*
86e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 72   Make sure the r
86f0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63 75  esults of the cu
8700: 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c 30  rrent row are \0
8710: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20  00 terminated.  
8720: 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20 61  ** and have an a
8730: 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20 54  ssigned type.  T
8740: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
8750: 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64 20  e-ephemeralized 
8760: 61 73 0a 20 20 2a 2a 20 61 73 20 73 69 64 65 20  as.  ** as side 
8770: 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70  effect..  */.  p
8780: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
8790: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Set = &p->aMem[p
87a0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69  Op->p1];.  for(i
87b0: 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69  =0; i<pOp->p2; i
87c0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
87d0: 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e  VdbeMemNulTermin
87e0: 61 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  ate(&pMem[i]);. 
87f0: 20 20 20 73 74 6f 72 65 54 79 70 65 49 6e 66 6f     storeTypeInfo
8800: 28 26 70 4d 65 6d 5b 69 5d 2c 20 65 6e 63 6f 64  (&pMem[i], encod
8810: 69 6e 67 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ing);.    REGIST
8820: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
8830: 2b 69 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  +i, &pMem[i]);. 
8840: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
8850: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
8860: 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 2f 2a 20 52   no_mem;..  /* R
8870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57  eturn SQLITE_ROW
8880: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20  .  */.  p->pc = 
8890: 70 63 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53  pc + 1;.  rc = S
88a0: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74  QLITE_ROW;.  got
88b0: 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d  o vdbe_return;.}
88c0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e  ../* Opcode: Con
88d0: 63 61 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  cat P1 P2 P3 * *
88e0: 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  .**.** Add the t
88f0: 65 78 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ext in register 
8900: 50 31 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  P1 onto the end 
8910: 6f 66 20 74 68 65 20 74 65 78 74 20 69 6e 0a 2a  of the text in.*
8920: 2a 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  * register P2 an
8930: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
8940: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
8950: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
8960: 74 68 65 20 50 31 20 6f 72 20 50 32 20 74 65 78  the P1 or P2 tex
8970: 74 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20  t are NULL then 
8980: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33  store NULL in P3
8990: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50  ..**.**   P3 = P
89a0: 32 20 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74  2 || P1.**.** It
89b0: 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20   is illegal for 
89c0: 50 31 20 61 6e 64 20 50 33 20 74 6f 20 62 65 20  P1 and P3 to be 
89d0: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
89e0: 72 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a  r. Sometimes,.**
89f0: 20 69 66 20 50 33 20 69 73 20 74 68 65 20 73 61   if P3 is the sa
8a00: 6d 65 20 72 65 67 69 73 74 65 72 20 61 73 20 50  me register as P
8a10: 32 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  2, the implement
8a20: 61 74 69 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a  ation is able.**
8a30: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 63   to avoid a memc
8a40: 70 79 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  py()..*/.case OP
8a50: 5f 43 6f 6e 63 61 74 3a 20 7b 20 20 20 20 20 20  _Concat: {      
8a60: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
8a70: 54 4b 5f 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20  TK_CONCAT, in1, 
8a80: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in2, out3 */.  i
8a90: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 61 73 73  64 nByte;..  ass
8aa0: 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75 74 20  ert( pIn1!=pOut 
8ab0: 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
8ac0: 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c  flags | pIn2->fl
8ad0: 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  ags) & MEM_Null 
8ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8af0: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
8b00: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
8b10: 20 7d 0a 20 20 45 78 70 61 6e 64 42 6c 6f 62 28   }.  ExpandBlob(
8b20: 70 49 6e 31 29 3b 0a 20 20 53 74 72 69 6e 67 69  pIn1);.  Stringi
8b30: 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e  fy(pIn1, encodin
8b40: 67 29 3b 0a 20 20 45 78 70 61 6e 64 42 6c 6f 62  g);.  ExpandBlob
8b50: 28 70 49 6e 32 29 3b 0a 20 20 53 74 72 69 6e 67  (pIn2);.  String
8b60: 69 66 79 28 70 49 6e 32 2c 20 65 6e 63 6f 64 69  ify(pIn2, encodi
8b70: 6e 67 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 70  ng);.  nByte = p
8b80: 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e 32 2d 3e 6e  In1->n + pIn2->n
8b90: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 64 62  ;.  if( nByte>db
8ba0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8bb0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
8bc0: 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
8bd0: 67 3b 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54  g;.  }.  MemSetT
8be0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
8bf0: 4d 5f 53 74 72 29 3b 0a 20 20 69 66 28 20 73 71  M_Str);.  if( sq
8c00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
8c10: 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79 74  (pOut, (int)nByt
8c20: 65 2b 32 2c 20 70 4f 75 74 3d 3d 70 49 6e 32 29  e+2, pOut==pIn2)
8c30: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   ){.    goto no_
8c40: 6d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  mem;.  }.  if( p
8c50: 4f 75 74 21 3d 70 49 6e 32 20 29 7b 0a 20 20 20  Out!=pIn2 ){.   
8c60: 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c   memcpy(pOut->z,
8c70: 20 70 49 6e 32 2d 3e 7a 2c 20 70 49 6e 32 2d 3e   pIn2->z, pIn2->
8c80: 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  n);.  }.  memcpy
8c90: 28 26 70 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e  (&pOut->z[pIn2->
8ca0: 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e  n], pIn1->z, pIn
8cb0: 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75 74 2d 3e 7a  1->n);.  pOut->z
8cc0: 5b 6e 42 79 74 65 5d 20 3d 20 30 3b 0a 20 20 70  [nByte] = 0;.  p
8cd0: 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31 5d 20  Out->z[nByte+1] 
8ce0: 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  = 0;.  pOut->fla
8cf0: 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
8d00: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74    pOut->n = (int
8d10: 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e  )nByte;.  pOut->
8d20: 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
8d30: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
8d40: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
8d50: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
8d60: 64 65 3a 20 41 64 64 20 50 31 20 50 32 20 50 33  de: Add P1 P2 P3
8d70: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74   * *.**.** Add t
8d80: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
8d90: 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 76  ster P1 to the v
8da0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
8db0: 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65   P2.** and store
8dc0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
8dd0: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
8de0: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
8df0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
8e00: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
8e10: 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69 70  * Opcode: Multip
8e20: 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ly P1 P2 P3 * *.
8e30: 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c  **.**.** Multipl
8e40: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
8e50: 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68  egister P1 by th
8e60: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
8e70: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74  ter P2.** and st
8e80: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
8e90: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
8ea0: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
8eb0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
8ec0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
8ed0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62  /./* Opcode: Sub
8ee0: 74 72 61 63 74 20 50 31 20 50 32 20 50 33 20 2a  tract P1 P2 P3 *
8ef0: 20 2a 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63   *.**.** Subtrac
8f00: 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  t the value in r
8f10: 65 67 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20  egister P1 from 
8f20: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
8f30: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
8f40: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
8f50: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
8f60: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
8f70: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
8f80: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
8f90: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .*/./* Opcode: D
8fa0: 69 76 69 64 65 20 50 31 20 50 32 20 50 33 20 2a  ivide P1 P2 P3 *
8fb0: 20 2a 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20   *.**.** Divide 
8fc0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
8fd0: 69 73 74 65 72 20 50 31 20 62 79 20 74 68 65 20  ister P1 by the 
8fe0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
8ff0: 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  r P2.** and stor
9000: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
9010: 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 49 66  register P3.  If
9020: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
9030: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 69 73 20  gister P2.** is 
9040: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72  zero, then the r
9050: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
9060: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
9070: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
9080: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
9090: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d  /./* Opcode: Rem
90a0: 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20  ainder P1 P2 P3 
90b0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  * *.**.** Comput
90c0: 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  e the remainder 
90d0: 61 66 74 65 72 20 69 6e 74 65 67 65 72 20 64 69  after integer di
90e0: 76 69 73 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  vision of the va
90f0: 6c 75 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  lue in.** regist
9100: 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c  er P1 by the val
9110: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
9120: 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  2 and store the 
9130: 72 65 73 75 6c 74 20 69 6e 20 50 33 2e 20 0a 2a  result in P3. .*
9140: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
9150: 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73  n register P2 is
9160: 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74   zero the result
9170: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20   is NULL..** If 
9180: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
9190: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
91a0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  lt is NULL..*/.c
91b0: 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20  ase OP_Add:     
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91d0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53   same as TK_PLUS
91e0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
91f0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74   */.case OP_Subt
9200: 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20 20  ract:           
9210: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
9220: 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32  _MINUS, in1, in2
9230: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
9240: 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20  P_Multiply:     
9250: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
9260: 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31   as TK_STAR, in1
9270: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
9280: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20  ase OP_Divide:  
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
92a0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53   same as TK_SLAS
92b0: 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  H, in1, in2, out
92c0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d  3 */.case OP_Rem
92d0: 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20  ainder: {       
92e0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
92f0: 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_REM, in1, in2,
9300: 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 66   out3 */.  int f
9310: 6c 61 67 73 3b 0a 20 20 61 70 70 6c 79 4e 75 6d  lags;.  applyNum
9320: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e  ericAffinity(pIn
9330: 31 29 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72  1);.  applyNumer
9340: 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 32 29  icAffinity(pIn2)
9350: 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 49 6e 31  ;.  flags = pIn1
9360: 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e  ->flags | pIn2->
9370: 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c  flags;.  if( (fl
9380: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21  ags & MEM_Null)!
9390: 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d  =0 ) goto arithm
93a0: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
93b0: 75 6c 6c 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  ull;.  if( (pIn1
93c0: 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e 32 2d 3e  ->flags & pIn2->
93d0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
93e0: 3d 3d 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  ==MEM_Int ){.   
93f0: 20 69 36 34 20 61 2c 20 62 3b 0a 20 20 20 20 61   i64 a, b;.    a
9400: 20 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20   = pIn1->u.i;.  
9410: 20 20 62 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b    b = pIn2->u.i;
9420: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
9430: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
9440: 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20    case OP_Add:  
9450: 20 20 20 20 20 20 20 62 20 2b 3d 20 61 3b 20 20         b += a;  
9460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9470: 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61    case OP_Subtra
9480: 63 74 3a 20 20 20 20 62 20 2d 3d 20 61 3b 20 20  ct:    b -= a;  
9490: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94a0: 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70    case OP_Multip
94b0: 6c 79 3a 20 20 20 20 62 20 2a 3d 20 61 3b 20 20  ly:    b *= a;  
94c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94d0: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
94e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
94f0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  a==0 ) goto arit
9500: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
9510: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 2f  _null;.        /
9520: 2a 20 44 69 76 69 64 69 6e 67 20 74 68 65 20 6c  * Dividing the l
9530: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
9540: 6e 65 67 61 74 69 76 65 20 36 34 2d 62 69 74 20  negative 64-bit 
9550: 69 6e 74 65 67 65 72 20 28 31 3c 3c 36 33 29 20  integer (1<<63) 
9560: 62 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 2d  by .        ** -
9570: 31 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  1 returns an int
9580: 65 67 65 72 20 74 6f 6f 20 6c 61 72 67 65 20 74  eger too large t
9590: 6f 20 73 74 6f 72 65 20 69 6e 20 61 20 36 34 2d  o store in a 64-
95a0: 62 69 74 20 64 61 74 61 2d 74 79 70 65 2e 20 4f  bit data-type. O
95b0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d  n.        ** som
95c0: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  e architectures,
95d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 76 65 72 66   the value overf
95e0: 6c 6f 77 73 20 74 6f 20 28 31 3c 3c 36 33 29 2e  lows to (1<<63).
95f0: 20 4f 6e 20 6f 74 68 65 72 73 2c 0a 20 20 20 20   On others,.    
9600: 20 20 20 20 2a 2a 20 61 20 53 49 47 46 50 45 20      ** a SIGFPE 
9610: 69 73 20 69 73 73 75 65 64 2e 20 54 68 65 20 66  is issued. The f
9620: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
9630: 6e 74 20 6e 6f 72 6d 61 6c 69 7a 65 73 20 74 68  nt normalizes th
9640: 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  is.        ** be
9650: 68 61 76 69 6f 72 20 73 6f 20 74 68 61 74 20 61  havior so that a
9660: 6c 6c 20 61 72 63 68 69 74 65 63 74 75 72 65 73  ll architectures
9670: 20 62 65 68 61 76 65 20 61 73 20 69 66 20 69 6e   behave as if in
9680: 74 65 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  teger .        *
9690: 2a 20 6f 76 65 72 66 6c 6f 77 20 6f 63 63 75 72  * overflow occur
96a0: 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
96b0: 20 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 2d          if( a==-
96c0: 31 20 26 26 20 62 3d 3d 53 4d 41 4c 4c 45 53 54  1 && b==SMALLEST
96d0: 5f 49 4e 54 36 34 20 29 20 61 20 3d 20 31 3b 0a  _INT64 ) a = 1;.
96e0: 20 20 20 20 20 20 20 20 62 20 2f 3d 20 61 3b 0a          b /= a;.
96f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
9710: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
9720: 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20  if( a==0 ) goto 
9730: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
9740: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20  t_is_null;.     
9750: 20 20 20 69 66 28 20 61 3d 3d 2d 31 20 29 20 61     if( a==-1 ) a
9760: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 20   = 1;.        b 
9770: 25 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62 72  %= a;.        br
9780: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9790: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69   }.    pOut->u.i
97a0: 20 3d 20 62 3b 0a 20 20 20 20 4d 65 6d 53 65 74   = b;.    MemSet
97b0: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
97c0: 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  EM_Int);.  }else
97d0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 61 2c 20  {.    double a, 
97e0: 62 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  b;.    a = sqlit
97f0: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
9800: 70 49 6e 31 29 3b 0a 20 20 20 20 62 20 3d 20 73  pIn1);.    b = s
9810: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
9820: 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20 20 20 73  lue(pIn2);.    s
9830: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
9840: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
9850: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20   OP_Add:        
9860: 20 62 20 2b 3d 20 61 3b 20 20 20 20 20 20 20 62   b += a;       b
9870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9880: 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20   OP_Subtract:   
9890: 20 62 20 2d 3d 20 61 3b 20 20 20 20 20 20 20 62   b -= a;       b
98a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
98b0: 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20   OP_Multiply:   
98c0: 20 62 20 2a 3d 20 61 3b 20 20 20 20 20 20 20 62   b *= a;       b
98d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
98e0: 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20   OP_Divide: {.  
98f0: 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65        /* (double
9900: 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
9910: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
9920: 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
9930: 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 28 64         if( a==(d
9940: 6f 75 62 6c 65 29 30 20 29 20 67 6f 74 6f 20 61  ouble)0 ) goto a
9950: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
9960: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
9970: 20 20 62 20 2f 3d 20 61 3b 0a 20 20 20 20 20 20    b /= a;.      
9980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9990: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
99a0: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 61  {.        i64 ia
99b0: 20 3d 20 28 69 36 34 29 61 3b 0a 20 20 20 20 20   = (i64)a;.     
99c0: 20 20 20 69 36 34 20 69 62 20 3d 20 28 69 36 34     i64 ib = (i64
99d0: 29 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  )b;.        if( 
99e0: 69 61 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  ia==0 ) goto ari
99f0: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
9a00: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
9a10: 69 66 28 20 69 61 3d 3d 2d 31 20 29 20 69 61 20  if( ia==-1 ) ia 
9a20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 20 3d  = 1;.        b =
9a30: 20 28 64 6f 75 62 6c 65 29 28 69 62 20 25 20 69   (double)(ib % i
9a40: 61 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  a);.        brea
9a50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9a60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9a70: 49 73 4e 61 4e 28 62 29 20 29 7b 0a 20 20 20 20  IsNaN(b) ){.    
9a80: 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69    goto arithmeti
9a90: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
9aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
9ab0: 2d 3e 72 20 3d 20 62 3b 0a 20 20 20 20 4d 65 6d  ->r = b;.    Mem
9ac0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
9ad0: 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 20  , MEM_Real);.   
9ae0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
9af0: 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Real)==0 ){.  
9b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 49      sqlite3VdbeI
9b10: 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28 70  ntegerAffinity(p
9b20: 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Out);.    }.  }.
9b30: 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68 6d    break;..arithm
9b40: 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e  etic_result_is_n
9b50: 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 64  ull:.  sqlite3Vd
9b60: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
9b70: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
9b80: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c 53  /* Opcode: CollS
9b90: 65 71 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20  eq * * P4.**.** 
9ba0: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
9bb0: 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20 73 74 72  to a CollSeq str
9bc0: 75 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74  uct. If the next
9bd0: 20 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20   call to a user 
9be0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61  function.** or a
9bf0: 67 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73  ggregate calls s
9c00: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
9c10: 6c 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c  lSeq(), this col
9c20: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9c30: 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72  will.** be retur
9c40: 6e 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  ned. This is use
9c50: 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69  d by the built-i
9c60: 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61  n min(), max() a
9c70: 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66  nd nullif().** f
9c80: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
9c90: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75 73  The interface us
9ca0: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
9cb0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
9cc0: 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20 66  aforementioned f
9cd0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20 72  unctions.** to r
9ce0: 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 6c  etrieve the coll
9cf0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73  ation sequence s
9d00: 65 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  et by this opcod
9d10: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9d20: 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2c 20  le.** publicly, 
9d30: 6f 6e 6c 79 20 74 6f 20 75 73 65 72 20 66 75 6e  only to user fun
9d40: 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 69  ctions defined i
9d50: 6e 20 66 75 6e 63 2e 63 2e 0a 2a 2f 0a 63 61 73  n func.c..*/.cas
9d60: 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a  e OP_CollSeq: {.
9d70: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
9d80: 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45  4type==P4_COLLSE
9d90: 51 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  Q );.  break;.}.
9da0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e 63  ./* Opcode: Func
9db0: 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50 34  tion P1 P2 P3 P4
9dc0: 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65   P5.**.** Invoke
9dd0: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
9de0: 20 28 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65   (P4 is a pointe
9df0: 72 20 74 6f 20 61 20 46 75 6e 63 74 69 6f 6e 20  r to a Function 
9e00: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a 2a  structure that.*
9e10: 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 66 75  * defines the fu
9e20: 6e 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35 20  nction) with P5 
9e30: 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e 20  arguments taken 
9e40: 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32  from register P2
9e50: 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73 6f   and.** successo
9e60: 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  rs.  The result 
9e70: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
9e80: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
9e90: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65 67  ister P3..** Reg
9ea0: 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e 6f  ister P3 must no
9eb0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
9ec0: 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73 2e  function inputs.
9ed0: 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 33  .**.** P1 is a 3
9ee0: 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69 6e  2-bit bitmask in
9ef0: 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65 72  dicating whether
9f00: 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72 67   or not each arg
9f10: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a  ument to the .**
9f20: 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64 65   function was de
9f30: 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20 63  termined to be c
9f40: 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70 69  onstant at compi
9f50: 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65 20  le time. If the 
9f60: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
9f70: 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20 74  t was constant t
9f80: 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31 20  hen bit 0 of P1 
9f90: 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73 20  is set. This is 
9fa0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
9fb0: 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65 74  e.** whether met
9fc0: 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a data associate
9fd0: 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66 75  d with a user fu
9fe0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
9ff0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
a000: 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61  ite3_set_auxdata
a010: 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73 61  () API may be sa
a020: 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75 6e  fely retained un
a030: 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  til the next.** 
a040: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
a050: 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  is opcode..**.**
a060: 20 53 65 65 20 61 6c 73 6f 3a 20 41 67 67 53 74   See also: AggSt
a070: 65 70 20 61 6e 64 20 41 67 67 46 69 6e 61 6c 0a  ep and AggFinal.
a080: 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63 74  */.case OP_Funct
a090: 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a  ion: {.  int i;.
a0a0: 20 20 4d 65 6d 20 2a 70 41 72 67 3b 0a 20 20 73    Mem *pArg;.  s
a0b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 63  qlite3_context c
a0c0: 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  tx;.  sqlite3_va
a0d0: 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 20 20 69  lue **apVal;.  i
a0e0: 6e 74 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  nt n = pOp->p5;.
a0f0: 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70  .  apVal = p->ap
a100: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 61  Arg;.  assert( a
a110: 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a  pVal || n==0 );.
a120: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20  .  assert( n==0 
a130: 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26  || (pOp->p2>0 &&
a140: 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 70 2d 3e 6e   pOp->p2+n<=p->n
a150: 4d 65 6d 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  Mem+1) );.  asse
a160: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d  rt( pOp->p3<pOp-
a170: 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d  >p2 || pOp->p3>=
a180: 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70  pOp->p2+n );.  p
a190: 41 72 67 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Arg = &p->aMem[p
a1a0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28 69  Op->p2];.  for(i
a1b0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 41  =0; i<n; i++, pA
a1c0: 72 67 2b 2b 29 7b 0a 20 20 20 20 61 70 56 61 6c  rg++){.    apVal
a1d0: 5b 69 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20 20  [i] = pArg;.    
a1e0: 73 74 6f 72 65 54 79 70 65 49 6e 66 6f 28 70 41  storeTypeInfo(pA
a1f0: 72 67 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  rg, encoding);. 
a200: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
a210: 45 28 70 4f 70 2d 3e 70 32 2c 20 70 41 72 67 29  E(pOp->p2, pArg)
a220: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
a230: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
a240: 5f 46 55 4e 43 44 45 46 20 7c 7c 20 70 4f 70 2d  _FUNCDEF || pOp-
a250: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 44 42 45  >p4type==P4_VDBE
a260: 46 55 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 4f  FUNC );.  if( pO
a270: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
a280: 4e 43 44 45 46 20 29 7b 0a 20 20 20 20 63 74 78  NCDEF ){.    ctx
a290: 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34  .pFunc = pOp->p4
a2a0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e  .pFunc;.    ctx.
a2b0: 70 56 64 62 65 46 75 6e 63 20 3d 20 30 3b 0a 20  pVdbeFunc = 0;. 
a2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 74 78 2e   }else{.    ctx.
a2d0: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
a2e0: 65 46 75 6e 63 2a 29 70 4f 70 2d 3e 70 34 2e 70  eFunc*)pOp->p4.p
a2f0: 56 64 62 65 46 75 6e 63 3b 0a 20 20 20 20 63 74  VdbeFunc;.    ct
a300: 78 2e 70 46 75 6e 63 20 3d 20 63 74 78 2e 70 56  x.pFunc = ctx.pV
a310: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a  dbeFunc->pFunc;.
a320: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
a330: 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
a340: 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
a350: 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65    pOut = &p->aMe
a360: 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 63 74  m[pOp->p3];.  ct
a370: 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  x.s.flags = MEM_
a380: 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e 73 2e 64 62  Null;.  ctx.s.db
a390: 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 73 2e 78   = db;.  ctx.s.x
a3a0: 44 65 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73  Del = 0;.  ctx.s
a3b0: 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 0a 20  .zMalloc = 0;.. 
a3c0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63   /* The output c
a3d0: 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20  ell may already 
a3e0: 68 61 76 65 20 61 20 62 75 66 66 65 72 20 61 6c  have a buffer al
a3f0: 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20  located. Move.  
a400: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  ** the pointer t
a410: 6f 20 63 74 78 2e 73 20 73 6f 20 69 6e 20 63 61  o ctx.s so in ca
a420: 73 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63  se the user-func
a430: 74 69 6f 6e 20 63 61 6e 20 75 73 65 0a 20 20 2a  tion can use.  *
a440: 2a 20 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c  * the already al
a450: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 69  located buffer i
a460: 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61  nstead of alloca
a470: 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  ting a new one..
a480: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
a490: 62 65 4d 65 6d 4d 6f 76 65 28 26 63 74 78 2e 73  beMemMove(&ctx.s
a4a0: 2c 20 70 4f 75 74 29 3b 0a 20 20 4d 65 6d 53 65  , pOut);.  MemSe
a4b0: 74 54 79 70 65 46 6c 61 67 28 26 63 74 78 2e 73  tTypeFlag(&ctx.s
a4c0: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20  , MEM_Null);..  
a4d0: 63 74 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b  ctx.isError = 0;
a4e0: 0a 20 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63  .  if( ctx.pFunc
a4f0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
a500: 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
a510: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
a520: 70 3e 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  p>p->aOp );.    
a530: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
a540: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
a550: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
a560: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
a570: 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a  ==OP_CollSeq );.
a580: 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20      ctx.pColl = 
a590: 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c  pOp[-1].p4.pColl
a5a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
a5b0: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
a5c0: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
a5d0: 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 28  e_to_misuse;.  (
a5e0: 2a 63 74 78 2e 70 46 75 6e 63 2d 3e 78 46 75 6e  *ctx.pFunc->xFun
a5f0: 63 29 28 26 63 74 78 2c 20 6e 2c 20 61 70 56 61  c)(&ctx, n, apVa
a600: 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l);.  if( sqlite
a610: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b  3SafetyOn(db) ){
a620: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a630: 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e  MemRelease(&ctx.
a640: 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  s);.    goto abo
a650: 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65  rt_due_to_misuse
a660: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
a670: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a680: 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75      /* Even thou
a690: 67 68 20 61 20 6d 61 6c 6c 6f 63 28 29 20 68 61  gh a malloc() ha
a6a0: 73 20 66 61 69 6c 65 64 2c 20 74 68 65 20 69 6d  s failed, the im
a6b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
a6c0: 74 68 65 0a 20 20 20 20 2a 2a 20 75 73 65 72 20  the.    ** user 
a6d0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76  function may hav
a6e0: 65 20 63 61 6c 6c 65 64 20 61 6e 20 73 71 6c 69  e called an sqli
a6f0: 74 65 33 5f 72 65 73 75 6c 74 5f 58 58 58 28 29  te3_result_XXX()
a700: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a   function.    **
a710: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 76 61 6c   to return a val
a720: 75 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ue. The followin
a730: 67 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 73 20  g call releases 
a740: 61 6e 79 20 72 65 73 6f 75 72 63 65 73 0a 20 20  any resources.  
a750: 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
a760: 77 69 74 68 20 73 75 63 68 20 61 20 76 61 6c 75  with such a valu
a770: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
a780: 20 4e 6f 74 65 3a 20 4d 61 79 62 65 20 4d 65 6d   Note: Maybe Mem
a790: 52 65 6c 65 61 73 65 28 29 20 73 68 6f 75 6c 64  Release() should
a7a0: 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 73 71   be called if sq
a7b0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 29 0a  lite3SafetyOn().
a7c0: 20 20 20 20 2a 2a 20 66 61 69 6c 73 20 61 6c 73      ** fails als
a7d0: 6f 20 28 74 68 65 20 69 66 28 2e 2e 2e 29 20 73  o (the if(...) s
a7e0: 74 61 74 65 6d 65 6e 74 20 61 62 6f 76 65 29 2e  tatement above).
a7f0: 20 42 75 74 20 69 66 20 70 65 6f 70 6c 65 20 61   But if people a
a800: 72 65 0a 20 20 20 20 2a 2a 20 6d 69 73 75 73 69  re.    ** misusi
a810: 6e 67 20 73 71 6c 69 74 65 2c 20 74 68 65 79 20  ng sqlite, they 
a820: 68 61 76 65 20 62 69 67 67 65 72 20 70 72 6f 62  have bigger prob
a830: 6c 65 6d 73 20 74 68 61 6e 20 61 20 6c 65 61 6b  lems than a leak
a840: 65 64 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  ed value..    */
a850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a860: 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e  MemRelease(&ctx.
a870: 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  s);.    goto no_
a880: 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  mem;.  }..  /* I
a890: 66 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  f any auxiliary 
a8a0: 64 61 74 61 20 66 75 6e 63 74 69 6f 6e 73 20 68  data functions h
a8b0: 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ave been called 
a8c0: 62 79 20 74 68 69 73 20 75 73 65 72 20 66 75 6e  by this user fun
a8d0: 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 69 6d 6d 65  ction,.  ** imme
a8e0: 64 69 61 74 65 6c 79 20 63 61 6c 6c 20 74 68 65  diately call the
a8f0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
a900: 61 6e 79 20 6e 6f 6e 2d 73 74 61 74 69 63 20 76  any non-static v
a910: 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  alues..  */.  if
a920: 28 20 63 74 78 2e 70 56 64 62 65 46 75 6e 63 20  ( ctx.pVdbeFunc 
a930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a940: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
a950: 63 74 78 2e 70 56 64 62 65 46 75 6e 63 2c 20 70  ctx.pVdbeFunc, p
a960: 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 70 4f 70  Op->p1);.    pOp
a970: 2d 3e 70 34 2e 70 56 64 62 65 46 75 6e 63 20 3d  ->p4.pVdbeFunc =
a980: 20 63 74 78 2e 70 56 64 62 65 46 75 6e 63 3b 0a   ctx.pVdbeFunc;.
a990: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
a9a0: 3d 20 50 34 5f 56 44 42 45 46 55 4e 43 3b 0a 20  = P4_VDBEFUNC;. 
a9b0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
a9c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
a9d0: 64 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 72 6f  d an error, thro
a9e0: 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 2a  w an exception *
a9f0: 2f 0a 20 20 69 66 28 20 63 74 78 2e 69 73 45 72  /.  if( ctx.isEr
aa00: 72 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ror ){.    sqlit
aa10: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
aa20: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
aa30: 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
aa40: 5f 74 65 78 74 28 26 63 74 78 2e 73 29 29 3b 0a  _text(&ctx.s));.
aa50: 20 20 20 20 72 63 20 3d 20 63 74 78 2e 69 73 45      rc = ctx.isE
aa60: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
aa70: 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c 74 20  Copy the result 
aa80: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
aa90: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33  into register P3
aaa0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
aab0: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
aac0: 26 63 74 78 2e 73 2c 20 65 6e 63 6f 64 69 6e 67  &ctx.s, encoding
aad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
aae0: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 26 63  MemMove(pOut, &c
aaf0: 74 78 2e 73 29 3b 0a 20 20 69 66 28 20 73 71 6c  tx.s);.  if( sql
ab00: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
ab10: 67 28 70 4f 75 74 29 20 29 7b 0a 20 20 20 20 67  g(pOut) ){.    g
ab20: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
ab30: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
ab40: 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
ab50: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
ab60: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
ab70: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
ab80: 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20  code: BitAnd P1 
ab90: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
aba0: 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73  Take the bit-wis
abb0: 65 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c  e AND of the val
abc0: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
abd0: 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a  P1 and P2 and.**
abe0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
abf0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
ac00: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
ac10: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
ac20: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
ac30: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
ac40: 42 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a  BitOr P1 P2 P3 *
ac50: 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68   *.**.** Take th
ac60: 65 20 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66  e bit-wise OR of
ac70: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
ac80: 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50  egister P1 and P
ac90: 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74  2 and.** store t
aca0: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
acb0: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
acc0: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
acd0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
ace0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
acf0: 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66  Opcode: ShiftLef
ad00: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
ad10: 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69  *.** Shift the i
ad20: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20  nteger value in 
ad30: 72 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 74  register P2 to t
ad40: 68 65 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a  he left by the.*
ad50: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  * number of bits
ad60: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
ad70: 65 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67  e integer in reg
ad80: 69 73 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72  iser P1..** Stor
ad90: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
ada0: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
adb0: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
adc0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
add0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
ade0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74  /* Opcode: Shift
adf0: 52 69 67 68 74 20 50 31 20 50 32 20 50 33 20 2a  Right P1 P2 P3 *
ae00: 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74   *.**.** Shift t
ae10: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
ae20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20   in register P2 
ae30: 74 6f 20 74 68 65 20 72 69 67 68 74 20 62 79 20  to the right by 
ae40: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
ae50: 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20   bits specified 
ae60: 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  by the integer i
ae70: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
ae80: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
ae90: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
aea0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
aeb0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
aec0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
aed0: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69  L..*/.case OP_Bi
aee0: 74 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20  tAnd:           
aef0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
af00: 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 2c   TK_BITAND, in1,
af10: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
af20: 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20  se OP_BitOr:    
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af40: 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4f   same as TK_BITO
af50: 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
af60: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69  3 */.case OP_Shi
af70: 66 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20  ftLeft:         
af80: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
af90: 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c 20  TK_LSHIFT, in1, 
afa0: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
afb0: 65 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3a  e OP_ShiftRight:
afc0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
afd0: 73 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 46  same as TK_RSHIF
afe0: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
aff0: 33 20 2a 2f 0a 20 20 69 36 34 20 61 2c 20 62 3b  3 */.  i64 a, b;
b000: 0a 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ..  if( (pIn1->f
b010: 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61  lags | pIn2->fla
b020: 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  gs) & MEM_Null )
b030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b040: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
b050: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
b060: 7d 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 56  }.  a = sqlite3V
b070: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32  dbeIntValue(pIn2
b080: 29 3b 0a 20 20 62 20 3d 20 73 71 6c 69 74 65 33  );.  b = sqlite3
b090: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
b0a0: 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  1);.  switch( pO
b0b0: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
b0c0: 20 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a   case OP_BitAnd:
b0d0: 20 20 20 20 20 20 61 20 26 3d 20 62 3b 20 20 20        a &= b;   
b0e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b0f0: 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20 20  e OP_BitOr:     
b100: 20 20 61 20 7c 3d 20 62 3b 20 20 20 20 20 62 72    a |= b;     br
b110: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50  eak;.    case OP
b120: 5f 53 68 69 66 74 4c 65 66 74 3a 20 20 20 61 20  _ShiftLeft:   a 
b130: 3c 3c 3d 20 62 3b 20 20 20 20 62 72 65 61 6b 3b  <<= b;    break;
b140: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 61  .    default:  a
b150: 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
b160: 64 65 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  de==OP_ShiftRigh
b170: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 20                a 
b190: 3e 3e 3d 20 62 3b 20 20 20 20 62 72 65 61 6b 3b  >>= b;    break;
b1a0: 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
b1b0: 20 3d 20 61 3b 0a 20 20 4d 65 6d 53 65 74 54 79   = a;.  MemSetTy
b1c0: 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
b1d0: 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  _Int);.  break;.
b1e0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64  }../* Opcode: Ad
b1f0: 64 49 6d 6d 20 20 50 31 20 50 32 20 2a 20 2a 20  dImm  P1 P2 * * 
b200: 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65  *.** .** Add the
b210: 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f 20   constant P2 to 
b220: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b230: 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65  ister P1..** The
b240: 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79   result is alway
b250: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  s an integer..**
b260: 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e 79  .** To force any
b270: 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20   register to be 
b280: 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74  an integer, just
b290: 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20   add 0..*/.case 
b2a0: 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20  OP_AddImm: {    
b2b0: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
b2c0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
b2d0: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
b2e0: 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20  1);.  pIn1->u.i 
b2f0: 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72  += pOp->p2;.  br
b300: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
b310: 65 3a 20 4d 75 73 74 42 65 49 6e 74 20 50 31 20  e: MustBeInt P1 
b320: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20  P2 * * *.** .** 
b330: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
b340: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
b350: 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e  o be an integer.
b360: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
b370: 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f 74 20 61  * in P1 is not a
b380: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 63 61  n integer and ca
b390: 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
b3a0: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  d into an intege
b3b0: 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20 64 61 74  r.** without dat
b3c0: 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d  a loss, then jum
b3d0: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
b3e0: 20 50 32 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30   P2, or if P2==0
b3f0: 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20 53 51 4c  .** raise an SQL
b400: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 65 78 63  ITE_MISMATCH exc
b410: 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  eption..*/.case 
b420: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20  OP_MustBeInt: { 
b430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
b440: 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 61 70 70  mp, in1 */.  app
b450: 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  lyAffinity(pIn1,
b460: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
b470: 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  RIC, encoding);.
b480: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
b490: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
b4a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   ){.    if( pOp-
b4b0: 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p2==0 ){.      
b4c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d  rc = SQLITE_MISM
b4d0: 41 54 43 48 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ATCH;.      goto
b4e0: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
b4f0: 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ror;.    }else{.
b500: 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
b510: 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  p2 - 1;.    }.  
b520: 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65 6d 53 65  }else{.    MemSe
b530: 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20  tTypeFlag(pIn1, 
b540: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20  MEM_Int);.  }.  
b550: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
b560: 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69 74  ode: RealAffinit
b570: 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  y P1 * * * *.**.
b580: 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50  ** If register P
b590: 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67  1 holds an integ
b5a0: 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f  er convert it to
b5b0: 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a   a real value..*
b5c0: 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
b5d0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65 78   is used when ex
b5e0: 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d 61  tracting informa
b5f0: 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c 75  tion from a colu
b600: 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 52  mn that.** has R
b610: 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20 53  EAL affinity.  S
b620: 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  uch column value
b630: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 73  s may still be s
b640: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74 65  tored as.** inte
b650: 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65 20  gers, for space 
b660: 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74 20  efficiency, but 
b670: 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f 6e  after extraction
b680: 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a 2a   we want them.**
b690: 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61 20   to have only a 
b6a0: 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63  real value..*/.c
b6b0: 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  ase OP_RealAffin
b6c0: 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ity: {          
b6d0: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
b6e0: 2f 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c  /.  if( pIn1->fl
b6f0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
b700: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b710: 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e 31 29  MemRealify(pIn1)
b720: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
b730: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b740: 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f 70  _OMIT_CAST./* Op
b750: 63 6f 64 65 3a 20 54 6f 54 65 78 74 20 50 31 20  code: ToText P1 
b760: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
b770: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
b780: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
b790: 62 65 20 74 65 78 74 2e 0a 2a 2a 20 49 66 20 74  be text..** If t
b7a0: 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d 65  he value is nume
b7b0: 72 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74 20  ric, convert it 
b7c0: 74 6f 20 61 20 73 74 72 69 6e 67 20 75 73 69 6e  to a string usin
b7d0: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
b7e0: 65 6e 74 20 6f 66 20 70 72 69 6e 74 66 28 29 2e  ent of printf().
b7f0: 20 20 42 6c 6f 62 20 76 61 6c 75 65 73 20 61 72    Blob values ar
b800: 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
b810: 2a 2a 20 61 72 65 20 61 66 74 65 72 77 61 72 64  ** are afterward
b820: 73 20 73 69 6d 70 6c 79 20 69 6e 74 65 72 70 72  s simply interpr
b830: 65 74 65 64 20 61 73 20 74 65 78 74 2e 0a 2a 2a  eted as text..**
b840: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65  .** A NULL value
b850: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20   is not changed 
b860: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
b870: 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c    It remains NUL
b880: 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f  L..*/.case OP_To
b890: 54 65 78 74 3a 20 7b 20 20 20 20 20 20 20 20 20  Text: {         
b8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
b8b0: 20 61 73 20 54 4b 5f 54 4f 5f 54 45 58 54 2c 20   as TK_TO_TEXT, 
b8c0: 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20 70 49 6e  in1 */.  if( pIn
b8d0: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
b8e0: 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 61  ull ) break;.  a
b8f0: 73 73 65 72 74 28 20 4d 45 4d 5f 53 74 72 3d 3d  ssert( MEM_Str==
b900: 28 4d 45 4d 5f 42 6c 6f 62 3e 3e 33 29 20 29 3b  (MEM_Blob>>3) );
b910: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c  .  pIn1->flags |
b920: 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d  = (pIn1->flags&M
b930: 45 4d 5f 42 6c 6f 62 29 3e 3e 33 3b 0a 20 20 61  EM_Blob)>>3;.  a
b940: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
b950: 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  1, SQLITE_AFF_TE
b960: 58 54 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  XT, encoding);. 
b970: 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62   rc = ExpandBlob
b980: 28 70 49 6e 31 29 3b 0a 20 20 61 73 73 65 72 74  (pIn1);.  assert
b990: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
b9a0: 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62 2d 3e 6d  MEM_Str || db->m
b9b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b9c0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 3d 20   pIn1->flags &= 
b9d0: 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  ~(MEM_Int|MEM_Re
b9e0: 61 6c 7c 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  al|MEM_Blob|MEM_
b9f0: 5a 65 72 6f 29 3b 0a 20 20 55 50 44 41 54 45 5f  Zero);.  UPDATE_
ba00: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e  MAX_BLOBSIZE(pIn
ba10: 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  1);.  break;.}..
ba20: 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 42 6c 6f  /* Opcode: ToBlo
ba30: 62 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  b P1 * * * *.**.
ba40: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
ba50: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
ba60: 31 20 74 6f 20 62 65 20 61 20 42 4c 4f 42 2e 0a  1 to be a BLOB..
ba70: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
ba80: 69 73 20 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76  is numeric, conv
ba90: 65 72 74 20 69 74 20 74 6f 20 61 20 73 74 72 69  ert it to a stri
baa0: 6e 67 20 66 69 72 73 74 2e 0a 2a 2a 20 53 74 72  ng first..** Str
bab0: 69 6e 67 73 20 61 72 65 20 73 69 6d 70 6c 79 20  ings are simply 
bac0: 72 65 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  reinterpreted as
bad0: 20 62 6c 6f 62 73 20 77 69 74 68 20 6e 6f 20 63   blobs with no c
bae0: 68 61 6e 67 65 0a 2a 2a 20 74 6f 20 74 68 65 20  hange.** to the 
baf0: 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 2e  underlying data.
bb00: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61  .**.** A NULL va
bb10: 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  lue is not chang
bb20: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
bb30: 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20  ne.  It remains 
bb40: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
bb50: 5f 54 6f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20  _ToBlob: {      
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
bb70: 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 42 4c 4f  ame as TK_TO_BLO
bb80: 42 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20  B, in1 */.  if( 
bb90: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
bba0: 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a  M_Null ) break;.
bbb0: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
bbc0: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d  gs & MEM_Blob)==
bbd0: 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66  0 ){.    applyAf
bbe0: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
bbf0: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e  ITE_AFF_TEXT, en
bc00: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 61 73 73  coding);.    ass
bc10: 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
bc20: 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62   & MEM_Str || db
bc30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bc40: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
bc50: 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 42  Flag(pIn1, MEM_B
bc60: 6c 6f 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lob);.  }else{. 
bc70: 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26     pIn1->flags &
bc80: 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d 61 73 6b  = ~(MEM_TypeMask
bc90: 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d  &~MEM_Blob);.  }
bca0: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
bcb0: 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20  OBSIZE(pIn1);.  
bcc0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
bcd0: 6f 64 65 3a 20 54 6f 4e 75 6d 65 72 69 63 20 50  ode: ToNumeric P
bce0: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
bcf0: 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20  Force the value 
bd00: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
bd10: 6f 20 62 65 20 6e 75 6d 65 72 69 63 20 28 65 69  o be numeric (ei
bd20: 74 68 65 72 20 61 6e 0a 2a 2a 20 69 6e 74 65 67  ther an.** integ
bd30: 65 72 20 6f 72 20 61 20 66 6c 6f 61 74 69 6e 67  er or a floating
bd40: 2d 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 29 0a  -point number.).
bd50: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
bd60: 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c  is text or blob,
bd70: 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   try to convert 
bd80: 69 74 20 74 6f 20 61 6e 20 75 73 69 6e 67 20 74  it to an using t
bd90: 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  he.** equivalent
bda0: 20 6f 66 20 61 74 6f 69 28 29 20 6f 72 20 61 74   of atoi() or at
bdb0: 6f 66 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30  of() and store 0
bdc0: 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76   if no such conv
bdd0: 65 72 73 69 6f 6e 20 0a 2a 2a 20 69 73 20 70 6f  ersion .** is po
bde0: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  ssible..**.** A 
bdf0: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f  NULL value is no
be00: 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  t changed by thi
be10: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72  s routine.  It r
be20: 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  emains NULL..*/.
be30: 63 61 73 65 20 4f 50 5f 54 6f 4e 75 6d 65 72 69  case OP_ToNumeri
be40: 63 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  c: {            
be50: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
be60: 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49 43 2c 20   TK_TO_NUMERIC, 
be70: 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20 28 70 49  in1 */.  if( (pI
be80: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  n1->flags & (MEM
be90: 5f 4e 75 6c 6c 7c 4d 45 4d 5f 49 6e 74 7c 4d 45  _Null|MEM_Int|ME
bea0: 4d 5f 52 65 61 6c 29 29 3d 3d 30 20 29 7b 0a 20  M_Real))==0 ){. 
beb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
bec0: 6d 4e 75 6d 65 72 69 66 79 28 70 49 6e 31 29 3b  mNumerify(pIn1);
bed0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
bee0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bef0: 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f  _OMIT_CAST */../
bf00: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 49 6e 74 20  * Opcode: ToInt 
bf10: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
bf20: 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65   Force the value
bf30: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
bf40: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  be an integer.  
bf50: 49 66 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  If.** The value 
bf60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20 72  is currently a r
bf70: 65 61 6c 20 6e 75 6d 62 65 72 2c 20 64 72 6f 70  eal number, drop
bf80: 20 69 74 73 20 66 72 61 63 74 69 6f 6e 61 6c 20   its fractional 
bf90: 70 61 72 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  part..** If the 
bfa0: 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72  value is text or
bfb0: 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f   blob, try to co
bfc0: 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20 69  nvert it to an i
bfd0: 6e 74 65 67 65 72 20 75 73 69 6e 67 20 74 68 65  nteger using the
bfe0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  .** equivalent o
bff0: 66 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74 6f  f atoi() and sto
c000: 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20  re 0 if no such 
c010: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  conversion is po
c020: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  ssible..**.** A 
c030: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f  NULL value is no
c040: 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  t changed by thi
c050: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72  s routine.  It r
c060: 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  emains NULL..*/.
c070: 63 61 73 65 20 4f 50 5f 54 6f 49 6e 74 3a 20 7b  case OP_ToInt: {
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
c0a0: 54 4f 5f 49 4e 54 2c 20 69 6e 31 20 2a 2f 0a 20  TO_INT, in1 */. 
c0b0: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
c0c0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
c0d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c0e0: 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
c0f0: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
c100: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
c110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
c120: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 52 65  ./* Opcode: ToRe
c130: 61 6c 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  al P1 * * * *.**
c140: 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61  .** Force the va
c150: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
c160: 50 31 20 74 6f 20 62 65 20 61 20 66 6c 6f 61 74  P1 to be a float
c170: 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
c180: 2e 0a 2a 2a 20 49 66 20 54 68 65 20 76 61 6c 75  ..** If The valu
c190: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  e is currently a
c1a0: 6e 20 69 6e 74 65 67 65 72 2c 20 63 6f 6e 76 65  n integer, conve
c1b0: 72 74 20 69 74 2e 0a 2a 2a 20 49 66 20 74 68 65  rt it..** If the
c1c0: 20 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f   value is text o
c1d0: 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63  r blob, try to c
c1e0: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20  onvert it to an 
c1f0: 69 6e 74 65 67 65 72 20 75 73 69 6e 67 20 74 68  integer using th
c200: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
c210: 6f 66 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74  of atoi() and st
c220: 6f 72 65 20 30 2e 30 20 69 66 20 6e 6f 20 73 75  ore 0.0 if no su
c230: 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  ch conversion is
c240: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
c250: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
c260: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
c270: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
c280: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
c290: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 52 65 61  */.case OP_ToRea
c2a0: 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
c2b0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
c2c0: 20 54 4b 5f 54 4f 5f 52 45 41 4c 2c 20 69 6e 31   TK_TO_REAL, in1
c2d0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d   */.  if( (pIn1-
c2e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
c2f0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  l)==0 ){.    sql
c300: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69  ite3VdbeMemReali
c310: 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20  fy(pIn1);.  }.  
c320: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
c330: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
c340: 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  AST */../* Opcod
c350: 65 3a 20 4c 74 20 50 31 20 50 32 20 50 33 20 50  e: Lt P1 P2 P3 P
c360: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  4 P5.**.** Compa
c370: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
c380: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
c390: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
c3a0: 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a  <reg(P1) then.**
c3b0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
c3c0: 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20   P2.  .**.** If 
c3d0: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
c3e0: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
c3f0: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
c400: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
c410: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
c420: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
c430: 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51 4c 49  mp.  If the SQLI
c440: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a  TE_JUMPIFNULL .*
c450: 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72 20 74  * bit is clear t
c460: 68 65 6e 20 66 61 6c 6c 20 74 68 72 75 20 69 66  hen fall thru if
c470: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
c480: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
c490: 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41  he SQLITE_AFF_MA
c4a0: 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35  SK portion of P5
c4b0: 20 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69   must be an affi
c4c0: 6e 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d  nity character -
c4d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  .** SQLITE_AFF_T
c4e0: 45 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  EXT, SQLITE_AFF_
c4f0: 49 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20  INTEGER, and so 
c500: 66 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70  forth. An attemp
c510: 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f  t is made .** to
c520: 20 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70   coerce both inp
c530: 75 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  uts according to
c540: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62   this affinity b
c550: 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  efore the.** com
c560: 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e  parison is made.
c570: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   If the SQLITE_A
c580: 46 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c  FF_MASK is 0x00,
c590: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a   then numeric.**
c5a0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
c5b0: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  d. Note that the
c5c0: 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72   affinity conver
c5d0: 73 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64  sions are stored
c5e0: 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  .** back into th
c5f0: 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
c600: 73 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f  s P1 and P3.  So
c610: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e   this opcode can
c620: 20 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73   cause.** persis
c630: 74 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20  tent changes to 
c640: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
c650: 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20   P3..**.** Once 
c660: 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  any conversions 
c670: 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65  have taken place
c680: 2c 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61  , and neither va
c690: 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a  lue is NULL, .**
c6a0: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
c6b0: 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74  compared. If bot
c6c0: 68 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f  h values are blo
c6d0: 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29  bs then memcmp()
c6e0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64   is.** used to d
c6f0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73  etermine the res
c700: 75 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ults of the comp
c710: 61 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68  arison.  If both
c720: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74   values.** are t
c730: 65 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70  ext, then the ap
c740: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
c750: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65  ing function spe
c760: 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20  cified in.** P4 
c770: 69 73 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74  is  used to do t
c780: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
c790: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65  If P4 is not spe
c7a0: 63 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d  cified then.** m
c7b0: 65 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20  emcmp() is used 
c7c0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20  to compare text 
c7d0: 73 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68  string.  If both
c7e0: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e   values are.** n
c7f0: 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e  umeric, then a n
c800: 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f  umeric compariso
c810: 6e 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68  n is used. If th
c820: 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
c830: 61 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  are of different
c840: 20 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d   types, then num
c850: 62 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  bers are conside
c860: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a  red less than.**
c870: 20 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72   strings and str
c880: 69 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ings are conside
c890: 72 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  red less than bl
c8a0: 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  obs..**.** If th
c8b0: 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  e SQLITE_STOREP2
c8c0: 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65   bit of P5 is se
c8d0: 74 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a  t, then do not j
c8e0: 75 6d 70 2e 20 20 49 6e 73 74 65 61 64 2c 0a 2a  ump.  Instead,.*
c8f0: 2a 20 73 74 6f 72 65 20 61 20 62 6f 6f 6c 65 61  * store a boolea
c900: 6e 20 72 65 73 75 6c 74 20 28 65 69 74 68 65 72  n result (either
c910: 20 30 2c 20 6f 72 20 31 2c 20 6f 72 20 4e 55 4c   0, or 1, or NUL
c920: 4c 29 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  L) in register P
c930: 32 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  2..*/./* Opcode:
c940: 20 4e 65 20 50 31 20 50 32 20 50 33 20 50 34 20   Ne P1 P2 P3 P4 
c950: 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  P5.**.** This wo
c960: 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68  rks just like th
c970: 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65  e Lt opcode exce
c980: 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  pt that the jump
c990: 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20   is taken if.** 
c9a0: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20  the operands in 
c9b0: 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64  registers P1 and
c9c0: 20 50 33 20 61 72 65 20 6e 6f 74 20 65 71 75 61   P3 are not equa
c9d0: 6c 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f  l.  See the Lt o
c9e0: 70 63 6f 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64  pcode for.** add
c9f0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
ca00: 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ion..*/./* Opcod
ca10: 65 3a 20 45 71 20 50 31 20 50 32 20 50 33 20 50  e: Eq P1 P2 P3 P
ca20: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
ca30: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
ca40: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
ca50: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
ca60: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
ca70: 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20 69  * the operands i
ca80: 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  n registers P1 a
ca90: 6e 64 20 50 33 20 61 72 65 20 65 71 75 61 6c 2e  nd P3 are equal.
caa0: 0a 2a 2a 20 53 65 65 20 74 68 65 20 4c 74 20 6f  .** See the Lt o
cab0: 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69  pcode for additi
cac0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
cad0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
cae0: 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Le P1 P2 P3 P4 P
caf0: 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  5.**.** This wor
cb00: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
cb10: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
cb20: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
cb30: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
cb40: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
cb50: 67 69 73 74 65 72 20 50 33 20 69 73 20 6c 65 73  gister P3 is les
cb60: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
cb70: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
cb80: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  f.** register P1
cb90: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
cba0: 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
cbb0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
cbc0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47  .*/./* Opcode: G
cbd0: 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
cbe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
cbf0: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
cc00: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
cc10: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
cc20: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
cc30: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
cc40: 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65 61  ister P3 is grea
cc50: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 6f 6e  ter than the con
cc60: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
cc70: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
cc80: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
cc90: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
cca0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  ation..*/./* Opc
ccb0: 6f 64 65 3a 20 47 65 20 50 31 20 50 32 20 50 33  ode: Ge P1 P2 P3
ccc0: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
ccd0: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
cce0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
ccf0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
cd00: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
cd10: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cd20: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
cd30: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
cd40: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63  r equal to the c
cd50: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67  ontent of.** reg
cd60: 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74  ister P1.  See t
cd70: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72  he Lt opcode for
cd80: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
cd90: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  rmation..*/.case
cda0: 20 4f 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20   OP_Eq:         
cdb0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
cdc0: 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e   TK_EQ, jump, in
cdd0: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
cde0: 50 5f 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20  P_Ne:           
cdf0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ce00: 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_NE, jump, in1,
ce10: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
ce20: 4c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Lt:             
ce30: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
ce40: 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  LT, jump, in1, i
ce50: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65  n3 */.case OP_Le
ce60: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
ce70: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45  /* same as TK_LE
ce80: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
ce90: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20   */.case OP_Gt: 
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ceb0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20   same as TK_GT, 
cec0: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
ced0: 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20  /.case OP_Ge: { 
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
cef0: 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75  ame as TK_GE, ju
cf00: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
cf10: 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 69    int flags;.  i
cf20: 6e 74 20 72 65 73 3b 0a 20 20 63 68 61 72 20 61  nt res;.  char a
cf30: 66 66 69 6e 69 74 79 3b 0a 0a 20 20 66 6c 61 67  ffinity;..  flag
cf40: 73 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 7c  s = pIn1->flags|
cf50: 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20  pIn3->flags;..  
cf60: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
cf70: 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ll ){.    /* If 
cf80: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
cf90: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  s NULL then the 
cfa0: 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
cfb0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 54 68   NULL..    ** Th
cfc0: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
cfd0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  if the SQLITE_JU
cfe0: 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 69 73 20  MPIFNULL bit is 
cff0: 73 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  set..    */.    
d000: 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
d010: 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
d020: 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 70 2d        pOut = &p-
d030: 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  >aMem[pOp->p2];.
d040: 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65        MemSetType
d050: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e  Flag(pOut, MEM_N
d060: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 52 45 47 49  ull);.      REGI
d070: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
d080: 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 7d  p2, pOut);.    }
d090: 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 35  else if( pOp->p5
d0a0: 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   & SQLITE_JUMPIF
d0b0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 63  NULL ){.      pc
d0c0: 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
d0d0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
d0e0: 20 7d 0a 0a 20 20 61 66 66 69 6e 69 74 79 20 3d   }..  affinity =
d0f0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
d100: 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20 20 69 66  E_AFF_MASK;.  if
d110: 28 20 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ( affinity ){.  
d120: 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
d130: 70 49 6e 31 2c 20 61 66 66 69 6e 69 74 79 2c 20  pIn1, affinity, 
d140: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 61  encoding);.    a
d150: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
d160: 33 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63  3, affinity, enc
d170: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  oding);.    if( 
d180: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d190: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
d1a0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
d1b0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
d1c0: 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70  OLLSEQ || pOp->p
d1d0: 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20  4.pColl==0 );.  
d1e0: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29  ExpandBlob(pIn1)
d1f0: 3b 0a 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  ;.  ExpandBlob(p
d200: 49 6e 33 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  In3);.  res = sq
d210: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
d220: 70 49 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d  pIn3, pIn1, pOp-
d230: 3e 70 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 73 77  >p4.pColl);.  sw
d240: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
d250: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50  e ){.    case OP
d260: 5f 45 71 3a 20 20 20 20 72 65 73 20 3d 20 72 65  _Eq:    res = re
d270: 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b  s==0;     break;
d280: 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a  .    case OP_Ne:
d290: 20 20 20 20 72 65 73 20 3d 20 72 65 73 21 3d 30      res = res!=0
d2a0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
d2b0: 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20   case OP_Lt:    
d2c0: 72 65 73 20 3d 20 72 65 73 3c 30 3b 20 20 20 20  res = res<0;    
d2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
d2e0: 65 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65 73 20  e OP_Le:    res 
d2f0: 3d 20 72 65 73 3c 3d 30 3b 20 20 20 20 20 62 72  = res<=0;     br
d300: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50  eak;.    case OP
d310: 5f 47 74 3a 20 20 20 20 72 65 73 20 3d 20 72 65  _Gt:    res = re
d320: 73 3e 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  s>0;      break;
d330: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
d340: 20 20 20 20 72 65 73 20 3d 20 72 65 73 3e 3d 30      res = res>=0
d350: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;     break;.  }
d360: 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  ..  if( pOp->p5 
d370: 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
d380: 20 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 26   ){.    pOut = &
d390: 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  p->aMem[pOp->p2]
d3a0: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
d3b0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
d3c0: 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  nt);.    pOut->u
d3d0: 2e 69 20 3d 20 72 65 73 3b 0a 20 20 20 20 52 45  .i = res;.    RE
d3e0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
d3f0: 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d  ->p2, pOut);.  }
d400: 65 6c 73 65 20 69 66 28 20 72 65 73 20 29 7b 0a  else if( res ){.
d410: 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
d420: 2d 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  -1;.  }.  break;
d430: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  .}../* Opcode: P
d440: 65 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20 2a  ermutation * * *
d450: 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20   P4 *.**.** Set 
d460: 74 68 65 20 70 65 72 6d 75 61 74 69 6f 6e 20 75  the permuation u
d470: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 43 6f  sed by the OP_Co
d480: 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72 20 74  mpare operator t
d490: 6f 20 62 65 20 74 68 65 20 61 72 72 61 79 0a 2a  o be the array.*
d4a0: 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e  * of integers in
d4b0: 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70   P4..**.** The p
d4c0: 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e  ermutation is on
d4d0: 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ly valid until t
d4e0: 68 65 20 6e 65 78 74 20 4f 50 5f 50 65 72 6d 75  he next OP_Permu
d4f0: 74 61 74 69 6f 6e 2c 20 4f 50 5f 43 6f 6d 70 61  tation, OP_Compa
d500: 72 65 2c 0a 2a 2a 20 4f 50 5f 48 61 6c 74 2c 20  re,.** OP_Halt, 
d510: 6f 72 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2e  or OP_ResultRow.
d520: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 20    Typically the 
d530: 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 73  OP_Permutation s
d540: 68 6f 75 6c 64 20 6f 63 63 75 72 0a 2a 2a 20 69  hould occur.** i
d550: 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 69 6f 72  mmediately prior
d560: 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61   to the OP_Compa
d570: 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  re..*/.case OP_P
d580: 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20  ermutation: {.  
d590: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
d5a0: 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59  ype==P4_INTARRAY
d5b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
d5c0: 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61 50  p->p4.ai );.  aP
d5d0: 65 72 6d 75 74 65 20 3d 20 70 4f 70 2d 3e 70 34  ermute = pOp->p4
d5e0: 2e 61 69 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .ai;.  break;.}.
d5f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6d 70  ./* Opcode: Comp
d600: 61 72 65 20 50 31 20 50 32 20 50 33 20 50 34 20  are P1 P2 P3 P4 
d610: 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  *.**.** Compare 
d620: 74 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72 65  to vectors of re
d630: 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28 50  gisters in reg(P
d640: 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31 29  1)..reg(P1+P3-1)
d650: 20 28 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 6f 6e   (all this.** on
d660: 65 20 22 41 22 29 20 61 6e 64 20 69 6e 20 72 65  e "A") and in re
d670: 67 28 50 32 29 2e 2e 72 65 67 28 50 32 2b 50 33  g(P2)..reg(P2+P3
d680: 2d 31 29 20 28 22 42 22 29 2e 20 20 53 61 76 65  -1) ("B").  Save
d690: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
d6a0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
d6b0: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
d6c0: 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20 69 6e 73  next OP_Jump ins
d6d0: 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  truct..**.** P4 
d6e0: 69 73 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  is a KeyInfo str
d6f0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
d700: 6e 65 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  nes collating se
d710: 71 75 65 6e 63 65 73 20 61 6e 64 20 73 6f 72 74  quences and sort
d720: 0a 2a 2a 20 6f 72 64 65 72 73 20 66 6f 72 20 74  .** orders for t
d730: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
d740: 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
d750: 61 70 70 6c 69 65 73 20 74 6f 20 72 65 67 69 73  applies to regis
d760: 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 20 54  ters.** only.  T
d770: 68 65 20 4b 65 79 49 6e 66 6f 20 65 6c 65 6d 65  he KeyInfo eleme
d780: 6e 74 73 20 61 72 65 20 75 73 65 64 20 73 65 71  nts are used seq
d790: 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  uentially..**.**
d7a0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
d7b0: 69 73 20 61 20 73 6f 72 74 20 63 6f 6d 70 61 72  is a sort compar
d7c0: 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c 4c 73 20 63  ison, so NULLs c
d7d0: 6f 6d 70 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a  ompare equal,.**
d7e0: 20 4e 55 4c 4c 73 20 61 72 65 20 6c 65 73 73 20   NULLs are less 
d7f0: 74 68 61 6e 20 6e 75 6d 62 65 72 73 2c 20 6e 75  than numbers, nu
d800: 6d 62 65 72 73 20 61 72 65 20 6c 65 73 73 20 74  mbers are less t
d810: 68 61 6e 20 73 74 72 69 6e 67 73 2c 0a 2a 2a 20  han strings,.** 
d820: 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20  and strings are 
d830: 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e  less than blobs.
d840: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6d 70  .*/.case OP_Comp
d850: 61 72 65 3a 20 7b 0a 20 20 69 6e 74 20 6e 20 3d  are: {.  int n =
d860: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 6e 74 20   pOp->p3;.  int 
d870: 69 2c 20 70 31 2c 20 70 32 3b 0a 20 20 63 6f 6e  i, p1, p2;.  con
d880: 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
d890: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
d8a0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
d8b0: 74 28 20 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65  t( n>0 );.  asse
d8c0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
d8d0: 29 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70  );.  p1 = pOp->p
d8e0: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e  1;.  assert( p1>
d8f0: 30 20 26 26 20 70 31 2b 6e 3c 3d 70 2d 3e 6e 4d  0 && p1+n<=p->nM
d900: 65 6d 2b 31 20 29 3b 0a 20 20 70 32 20 3d 20 70  em+1 );.  p2 = p
d910: 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
d920: 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d  ( p2>0 && p2+n<=
d930: 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 66  p->nMem+1 );.  f
d940: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
d950: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
d960: 20 61 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72   aPermute ? aPer
d970: 6d 75 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20  mute[i] : i;.   
d980: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
d990: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
d9a0: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73 65   sequence to use
d9b0: 20 6f 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   on this term */
d9c0: 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20  .    int bRev;  
d9d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
d9e0: 66 6f 72 20 44 45 53 43 45 4e 44 49 4e 47 20 73  for DESCENDING s
d9f0: 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ort order */.   
da00: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
da10: 70 31 2b 69 64 78 2c 20 26 70 2d 3e 61 4d 65 6d  p1+idx, &p->aMem
da20: 5b 70 31 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52  [p1+idx]);.    R
da30: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32  EGISTER_TRACE(p2
da40: 2b 69 64 78 2c 20 26 70 2d 3e 61 4d 65 6d 5b 70  +idx, &p->aMem[p
da50: 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73 73  2+idx]);.    ass
da60: 65 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  ert( i<pKeyInfo-
da70: 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 20 20 70  >nField );.    p
da80: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
da90: 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 62  >aColl[i];.    b
daa0: 52 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  Rev = pKeyInfo->
dab0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
dac0: 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 73 71     iCompare = sq
dad0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
dae0: 26 70 2d 3e 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  &p->aMem[p1+idx]
daf0: 2c 20 26 70 2d 3e 61 4d 65 6d 5b 70 32 2b 69 64  , &p->aMem[p2+id
db00: 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  x], pColl);.    
db10: 69 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a  if( iCompare ){.
db20: 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
db30: 20 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f   iCompare = -iCo
db40: 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65  mpare;.      bre
db50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
db60: 61 50 65 72 6d 75 74 65 20 3d 20 30 3b 0a 20 20  aPermute = 0;.  
db70: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
db80: 6f 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20  ode: Jump P1 P2 
db90: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d  P3 * *.**.** Jum
dba0: 70 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  p to the instruc
dbb0: 74 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20  tion at address 
dbc0: 50 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65  P1, P2, or P3 de
dbd0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
dbe0: 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73  er.** in the mos
dbf0: 74 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70  t recent OP_Comp
dc00: 61 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  are instruction 
dc10: 74 68 65 20 50 31 20 76 65 63 74 6f 72 20 77 61  the P1 vector wa
dc20: 73 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65  s less than.** e
dc30: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
dc40: 74 65 72 20 74 68 61 6e 20 74 68 65 20 50 32 20  ter than the P2 
dc50: 76 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69  vector, respecti
dc60: 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  vely..*/.case OP
dc70: 5f 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20  _Jump: {        
dc80: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
dc90: 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30    if( iCompare<0
dca0: 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
dcb0: 2d 3e 70 31 20 2d 20 31 3b 0a 20 20 7d 65 6c 73  ->p1 - 1;.  }els
dcc0: 65 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3d 3d  e if( iCompare==
dcd0: 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f  0 ){.    pc = pO
dce0: 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65 6c  p->p2 - 1;.  }el
dcf0: 73 65 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70  se{.    pc = pOp
dd00: 2d 3e 70 33 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p3 - 1;.  }.  
dd10: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
dd20: 6f 64 65 3a 20 41 6e 64 20 50 31 20 50 32 20 50  ode: And P1 P2 P
dd30: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65  3 * *.**.** Take
dd40: 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44   the logical AND
dd50: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
dd60: 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  n registers P1 a
dd70: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69  nd P2 and.** wri
dd80: 74 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  te the result in
dd90: 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  to register P3..
dda0: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
ddb0: 50 31 20 6f 72 20 50 32 20 69 73 20 30 20 28 66  P1 or P2 is 0 (f
ddc0: 61 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20 72  alse) then the r
ddd0: 65 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20  esult is 0 even 
dde0: 69 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  if.** the other 
ddf0: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20  input is NULL.  
de00: 41 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20  A NULL and true 
de10: 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76  or two NULLs giv
de20: 65 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70  e.** a NULL outp
de30: 75 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  ut..*/./* Opcode
de40: 3a 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20  : Or P1 P2 P3 * 
de50: 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  *.**.** Take the
de60: 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74   logical OR of t
de70: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
de80: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
de90: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
dea0: 20 61 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73   answer in regis
deb0: 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P3..**.** If
dec0: 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
ded0: 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75   is nonzero (tru
dee0: 65 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e) then the resu
def0: 6c 74 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a  lt is 1 (true).*
df00: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74  * even if the ot
df10: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
df20: 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66  L.  A NULL and f
df30: 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c  alse or two NULL
df40: 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c  s.** give a NULL
df50: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65   output..*/.case
df60: 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20   OP_And:        
df70: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
df80: 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e   TK_AND, in1, in
df90: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
dfa0: 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20  OP_Or: {        
dfb0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dfc0: 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c  TK_OR, in1, in2,
dfd0: 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76   out3 */.  int v
dfe0: 31 2c 20 76 32 3b 20 20 20 20 2f 2a 20 30 3d 3d  1, v2;    /* 0==
dff0: 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20  FALSE, 1==TRUE, 
e000: 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55  2==UNKNOWN or NU
e010: 4c 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 70 49 6e  LL */..  if( pIn
e020: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
e030: 75 6c 6c 20 29 7b 0a 20 20 20 20 76 31 20 3d 20  ull ){.    v1 = 
e040: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
e050: 76 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  v1 = sqlite3Vdbe
e060: 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d  IntValue(pIn1)!=
e070: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  0;.  }.  if( pIn
e080: 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  2->flags & MEM_N
e090: 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d 20  ull ){.    v2 = 
e0a0: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
e0b0: 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  v2 = sqlite3Vdbe
e0c0: 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 21 3d  IntValue(pIn2)!=
e0d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
e0e0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64  ->opcode==OP_And
e0f0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
e100: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
e110: 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d  ar and_logic[] =
e120: 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31   { 0, 0, 0, 0, 1
e130: 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a  , 2, 0, 2, 2 };.
e140: 20 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67      v1 = and_log
e150: 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
e160: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
e170: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
e180: 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20  char or_logic[] 
e190: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20  = { 0, 1, 2, 1, 
e1a0: 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b  1, 1, 2, 1, 2 };
e1b0: 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67  .    v1 = or_log
e1c0: 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
e1d0: 0a 20 20 69 66 28 20 76 31 3d 3d 32 20 29 7b 0a  .  if( v1==2 ){.
e1e0: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
e1f0: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c  ag(pOut, MEM_Nul
e200: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
e210: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31 3b   pOut->u.i = v1;
e220: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
e230: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
e240: 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  t);.  }.  break;
e250: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .}../* Opcode: N
e260: 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ot P1 P2 * * *.*
e270: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
e280: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
e290: 73 74 65 72 20 50 31 20 61 73 20 61 20 62 6f 6f  ster P1 as a boo
e2a0: 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f  lean value.  Sto
e2b0: 72 65 20 74 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61  re the.** boolea
e2c0: 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 20  n complement in 
e2d0: 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66  register P2.  If
e2e0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
e2f0: 67 69 73 74 65 72 20 50 31 20 69 73 20 0a 2a 2a  gister P1 is .**
e300: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 4e 55   NULL, then a NU
e310: 4c 4c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  LL is stored in 
e320: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  P2..*/.case OP_N
e330: 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ot: {           
e340: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
e350: 54 4b 5f 4e 4f 54 2c 20 69 6e 31 20 2a 2f 0a 20  TK_NOT, in1 */. 
e360: 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d   pOut = &p->aMem
e370: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28  [pOp->p2];.  if(
e380: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
e390: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
e3a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
e3b0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d 65  Null(pOut);.  }e
e3c0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
e3d0: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
e3e0: 70 4f 75 74 2c 20 21 73 71 6c 69 74 65 33 56 64  pOut, !sqlite3Vd
e3f0: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
e400: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
e410: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
e420: 74 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  tNot P1 P2 * * *
e430: 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
e440: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
e450: 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61  register P1 as a
e460: 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f 72  n integer.  Stor
e470: 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63 6f  e the.** ones-co
e480: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  mplement of the 
e490: 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  P1 value into re
e4a0: 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20 50  gister P2.  If P
e4b0: 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55 4c  1 holds.** a NUL
e4c0: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20 4e  L then store a N
e4d0: 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  ULL in P2..*/.ca
e4e0: 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b 20  se OP_BitNot: { 
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
e500: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f 54  ame as TK_BITNOT
e510: 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 4f 75 74 20  , in1 */.  pOut 
e520: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
e530: 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d  p2];.  if( pIn1-
e540: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
e550: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
e560: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
e570: 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
e580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
e590: 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20  mSetInt64(pOut, 
e5a0: 7e 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56  ~sqlite3VdbeIntV
e5b0: 61 6c 75 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d  alue(pIn1));.  }
e5c0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
e5d0: 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32  Opcode: If P1 P2
e5e0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
e5f0: 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
e600: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
e610: 72 20 50 31 20 69 73 20 74 72 75 65 2e 20 20 54  r P1 is true.  T
e620: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 69  he value is.** i
e630: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75  s considered tru
e640: 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72  e if it is numer
e650: 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e  ic and non-zero.
e660: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
e670: 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
e680: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
e690: 6d 70 20 69 66 20 50 33 20 69 73 20 74 72 75 65  mp if P3 is true
e6a0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
e6b0: 49 66 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a  IfNot P1 P2 P3 *
e6c0: 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
e6d0: 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
e6e0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
e6f0: 69 73 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76  is False.  The v
e700: 61 6c 75 65 20 69 73 0a 2a 2a 20 69 73 20 63 6f  alue is.** is co
e710: 6e 73 69 64 65 72 65 64 20 74 72 75 65 20 69 66  nsidered true if
e720: 20 69 74 20 68 61 73 20 61 20 6e 75 6d 65 72 69   it has a numeri
e730: 63 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e  c value of zero.
e740: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
e750: 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
e760: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
e770: 6d 70 20 69 66 20 50 33 20 69 73 20 74 72 75 65  mp if P3 is true
e780: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a  ..*/.case OP_If:
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
e7b0: 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20  .case OP_IfNot: 
e7c0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
e7d0: 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69  jump, in1 */.  i
e7e0: 6e 74 20 63 3b 0a 20 20 69 66 28 20 70 49 6e 31  nt c;.  if( pIn1
e7f0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
e800: 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 4f  ll ){.    c = pO
e810: 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->p3;.  }else{.
e820: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e830: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
e840: 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  T.    c = sqlite
e850: 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
e860: 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a 20 20  n1)!=0;.#else.  
e870: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
e880: 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29  eRealValue(pIn1)
e890: 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 20 20  !=0.0;.#endif.  
e8a0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e8b0: 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20 63 20  e==OP_IfNot ) c 
e8c0: 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = !c;.  }.  if( 
e8d0: 63 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f  c ){.    pc = pO
e8e0: 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62  p->p2-1;.  }.  b
e8f0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
e900: 64 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32  de: IsNull P1 P2
e910: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
e920: 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
e930: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
e940: 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 20 20 49  r P1 is NULL.  I
e950: 66 20 50 33 20 69 73 20 67 72 65 61 74 65 72 0a  f P3 is greater.
e960: 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ** than zero, th
e970: 65 6e 20 63 68 65 63 6b 20 61 6c 6c 20 76 61 6c  en check all val
e980: 75 65 73 20 72 65 67 28 50 31 29 2c 20 72 65 67  ues reg(P1), reg
e990: 28 50 31 2b 31 29 2c 20 0a 2a 2a 20 72 65 67 28  (P1+1), .** reg(
e9a0: 50 31 2b 32 29 2c 20 2e 2e 2e 2c 20 72 65 67 28  P1+2), ..., reg(
e9b0: 50 31 2b 50 33 2d 31 29 2e 0a 2a 2f 0a 63 61 73  P1+P3-1)..*/.cas
e9c0: 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20 20  e OP_IsNull: {  
e9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
e9e0: 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20  e as TK_ISNULL, 
e9f0: 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69  jump, in1 */.  i
ea00: 6e 74 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  nt n = pOp->p3;.
ea10: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
ea20: 33 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 31 3e  3==0 || pOp->p1>
ea30: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
ea40: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
ea50: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
ea60: 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  {.      pc = pOp
ea70: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20  ->p2 - 1;.      
ea80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ea90: 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 77 68 69 6c   pIn1++;.  }whil
eaa0: 65 28 20 2d 2d 6e 20 3e 20 30 20 29 3b 0a 20 20  e( --n > 0 );.  
eab0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
eac0: 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
ead0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a  P2 * * *.**.** J
eae0: 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65  ump to P2 if the
eaf0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
eb00: 65 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c  er P1 is not NUL
eb10: 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  L.  .*/.case OP_
eb20: 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20  NotNull: {      
eb30: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
eb40: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d   TK_NOTNULL, jum
eb50: 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20  p, in1 */.  if( 
eb60: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
eb70: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Null)==0 ){. 
eb80: 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
eb90: 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
eba0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
ebb0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 2a 20  SetNumColumns * 
ebc0: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
ebd0: 68 69 73 20 6f 70 63 6f 64 65 20 73 65 74 73 20  his opcode sets 
ebe0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
ebf0: 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 63 75  lumns for the cu
ec00: 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 74  rsor opened by t
ec10: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
ec20: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 50  instruction to P
ec30: 32 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 50 5f 53  2..**.** An OP_S
ec40: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 69 73 20  etNumColumns is 
ec50: 6f 6e 6c 79 20 75 73 65 66 75 6c 20 69 66 20 69  only useful if i
ec60: 74 20 6f 63 63 75 72 73 20 69 6d 6d 65 64 69 61  t occurs immedia
ec70: 74 65 6c 79 20 62 65 66 6f 72 65 20 0a 2a 2a 20  tely before .** 
ec80: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
ec90: 77 69 6e 67 20 6f 70 63 6f 64 65 73 3a 0a 2a 2a  wing opcodes:.**
eca0: 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 52 65 61 64  .**     OpenRead
ecb0: 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 57 72 69 74  .**     OpenWrit
ecc0: 65 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 50 73 65  e.**     OpenPse
ecd0: 75 64 6f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  udo.**.** If the
ece0: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
ecf0: 65 20 69 73 20 74 6f 20 62 65 20 65 78 65 63 75  e is to be execu
ed00: 74 65 64 20 6f 6e 20 61 20 63 75 72 73 6f 72 2c  ted on a cursor,
ed10: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 6f 70   then.** this op
ed20: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 70 72 65  code must be pre
ed30: 73 65 6e 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  sent immediately
ed40: 20 62 65 66 6f 72 65 20 74 68 65 20 6f 70 63 6f   before the opco
ed50: 64 65 20 74 68 61 74 0a 2a 2a 20 6f 70 65 6e 73  de that.** opens
ed60: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
ed70: 63 61 73 65 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  case OP_SetNumCo
ed80: 6c 75 6d 6e 73 3a 20 7b 0a 20 20 62 72 65 61 6b  lumns: {.  break
ed90: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
eda0: 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20  Column P1 P2 P3 
edb0: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72  P4 *.**.** Inter
edc0: 70 72 65 74 20 74 68 65 20 64 61 74 61 20 74 68  pret the data th
edd0: 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69  at cursor P1 poi
ede0: 6e 74 73 20 74 6f 20 61 73 20 61 20 73 74 72 75  nts to as a stru
edf0: 63 74 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e  cture built usin
ee00: 67 0a 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63  g.** the MakeRec
ee10: 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ord instruction.
ee20: 20 20 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52    (See the MakeR
ee30: 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72  ecord opcode for
ee40: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69   additional.** i
ee50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
ee60: 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74   the format of t
ee70: 68 65 20 64 61 74 61 2e 29 20 20 45 78 74 72 61  he data.)  Extra
ee80: 63 74 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c  ct the P2-th col
ee90: 75 6d 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73  umn.** from this
eea0: 20 72 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65   record.  If the
eeb0: 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 74  re are less that
eec0: 20 28 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75   (P2+1) .** valu
eed0: 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  es in the record
eee0: 2c 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c  , extract a NULL
eef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
ef00: 65 20 65 78 74 72 61 63 74 65 64 20 69 73 20 73  e extracted is s
ef10: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
ef20: 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  r P3..**.** If t
ef30: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
ef40: 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 50 32  ns fewer than P2
ef50: 20 66 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78   fields, then ex
ef60: 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f  tract a NULL.  O
ef70: 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20  r,.** if the P4 
ef80: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34  argument is a P4
ef90: 5f 4d 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c  _MEM use the val
efa0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 61 72 67  ue of the P4 arg
efb0: 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20  ument as.** the 
efc0: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20  result..*/.case 
efd0: 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 69  OP_Column: {.  i
efe0: 6e 74 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b 20  nt payloadSize; 
eff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
f000: 79 74 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f  ytes in the reco
f010: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 70 31 20 3d  rd */.  int p1 =
f020: 20 70 4f 70 2d 3e 70 31 3b 20 20 2f 2a 20 50 31   pOp->p1;  /* P1
f030: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70   value of the op
f040: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 32  code */.  int p2
f050: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 2f 2a 20   = pOp->p2;  /* 
f060: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 6f  column number to
f070: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 56   retrieve */.  V
f080: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
f090: 30 3b 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75  0;/* The VDBE cu
f0a0: 72 73 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rsor */.  char *
f0b0: 7a 52 65 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  zRec;        /* 
f0c0: 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 6d 70 6c  Pointer to compl
f0d0: 65 74 65 20 72 65 63 6f 72 64 2d 64 61 74 61 20  ete record-data 
f0e0: 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
f0f0: 43 72 73 72 3b 20 20 20 2f 2a 20 54 68 65 20 42  Crsr;   /* The B
f100: 54 72 65 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20  Tree cursor */. 
f110: 20 75 33 32 20 2a 61 54 79 70 65 3b 20 20 20 20   u32 *aType;    
f120: 20 20 20 20 2f 2a 20 61 54 79 70 65 5b 69 5d 20      /* aType[i] 
f130: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 65 72 69  holds the numeri
f140: 63 20 74 79 70 65 20 6f 66 20 74 68 65 20 69 2d  c type of the i-
f150: 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 75  th column */.  u
f160: 33 32 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20  32 *aOffset;    
f170: 20 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20    /* aOffset[i] 
f180: 69 73 20 6f 66 66 73 65 74 20 74 6f 20 73 74 61  is offset to sta
f190: 72 74 20 6f 66 20 64 61 74 61 20 66 6f 72 20 69  rt of data for i
f1a0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  -th column */.  
f1b0: 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20  int nField;     
f1c0: 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
f1d0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65  fields in the re
f1e0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  cord */.  int le
f1f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
f200: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  The length of th
f210: 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
f220: 61 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  a for the column
f230: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f240: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
f250: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68   counter */.  ch
f260: 61 72 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20  ar *zData;      
f270: 20 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65 20   /* Part of the 
f280: 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
f290: 6f 64 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  oded */.  Mem *p
f2a0: 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Dest;        /* 
f2b0: 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
f2c0: 68 65 20 65 78 74 72 61 63 74 65 64 20 76 61 6c  he extracted val
f2d0: 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d 65 6d  ue */.  Mem sMem
f2e0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
f2f0: 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72 65  r storing the re
f300: 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64  cord being decod
f310: 65 64 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28  ed */..  memset(
f320: 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sMem, 0, sizeof
f330: 28 73 4d 65 6d 29 29 3b 0a 20 20 61 73 73 65 72  (sMem));.  asser
f340: 74 28 20 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  t( p1<p->nCursor
f350: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
f360: 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
f370: 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
f380: 20 70 44 65 73 74 20 3d 20 26 70 2d 3e 61 4d 65   pDest = &p->aMe
f390: 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 4d 65  m[pOp->p3];.  Me
f3a0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 44 65  mSetTypeFlag(pDe
f3b0: 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a  st, MEM_Null);..
f3c0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
f3d0: 73 65 74 73 20 74 68 65 20 76 61 72 69 61 62 6c  sets the variabl
f3e0: 65 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 74 6f  e payloadSize to
f3f0: 20 62 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   be the total nu
f400: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 79 74  mber of.  ** byt
f410: 65 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  es in the record
f420: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 7a 52 65 63  ..  **.  ** zRec
f430: 20 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68   is set to be th
f440: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
f450: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 66  of the record if
f460: 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
f470: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  ** The compl
f480: 65 74 65 20 72 65 63 6f 72 64 20 74 65 78 74 20  ete record text 
f490: 69 73 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61  is always availa
f4a0: 62 6c 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74  ble for pseudo-t
f4b0: 61 62 6c 65 73 0a 20 20 2a 2a 20 49 66 20 74 68  ables.  ** If th
f4c0: 65 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72  e record is stor
f4d0: 65 64 20 69 6e 20 61 20 63 75 72 73 6f 72 2c 20  ed in a cursor, 
f4e0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 63  the complete rec
f4f0: 6f 72 64 20 74 65 78 74 0a 20 20 2a 2a 20 6d 69  ord text.  ** mi
f500: 67 68 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ght be available
f510: 20 69 6e 20 74 68 65 20 20 70 43 2d 3e 61 52 6f   in the  pC->aRo
f520: 77 20 63 61 63 68 65 2e 20 20 4f 72 20 69 74 20  w cache.  Or it 
f530: 6d 69 67 68 74 20 6e 6f 74 20 62 65 2e 0a 20 20  might not be..  
f540: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 20 69  ** If the data i
f550: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 20  s unavailable,  
f560: 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 4e  zRec is set to N
f570: 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ULL..  **.  ** W
f580: 65 20 61 6c 73 6f 20 63 6f 6d 70 75 74 65 20 74  e also compute t
f590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
f5a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 6f  umns in the reco
f5b0: 72 64 2e 20 20 46 6f 72 20 63 75 72 73 6f 72 73  rd.  For cursors
f5c0: 2c 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65  ,.  ** the numbe
f5d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20  r of columns is 
f5e0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
f5f0: 62 65 43 75 72 73 6f 72 2e 6e 46 69 65 6c 64 20  beCursor.nField 
f600: 65 6c 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  element..  */.  
f610: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 31  pC = p->apCsr[p1
f620: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
f630: 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
f640: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f650: 4c 54 41 42 4c 45 0a 20 20 61 73 73 65 72 74 28  LTABLE.  assert(
f660: 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72   pC->pVtabCursor
f670: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
f680: 69 66 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21  if( pC->pCursor!
f690: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
f6a0: 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65   record is store
f6b0: 64 20 69 6e 20 61 20 42 2d 54 72 65 65 20 2a 2f  d in a B-Tree */
f6c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f6d0: 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
f6e0: 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72  o(pC);.    if( r
f6f0: 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
f700: 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
f710: 20 7a 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70   zRec = 0;.    p
f720: 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
f730: 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e  or;.    if( pC->
f740: 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  nullRow ){.     
f750: 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 30   payloadSize = 0
f760: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f770: 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d  pC->cacheStatus=
f780: 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a  =p->cacheCtr ){.
f790: 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a        payloadSiz
f7a0: 65 20 3d 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53  e = pC->payloadS
f7b0: 69 7a 65 3b 0a 20 20 20 20 20 20 7a 52 65 63 20  ize;.      zRec 
f7c0: 3d 20 28 63 68 61 72 2a 29 70 43 2d 3e 61 52 6f  = (char*)pC->aRo
f7d0: 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  w;.    }else if(
f7e0: 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a   pC->isIndex ){.
f7f0: 20 20 20 20 20 20 69 36 34 20 70 61 79 6c 6f 61        i64 payloa
f800: 64 53 69 7a 65 36 34 3b 0a 20 20 20 20 20 20 73  dSize64;.      s
f810: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
f820: 7a 65 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f  ze(pCrsr, &paylo
f830: 61 64 53 69 7a 65 36 34 29 3b 0a 20 20 20 20 20  adSize64);.     
f840: 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 28   payloadSize = (
f850: 69 6e 74 29 70 61 79 6c 6f 61 64 53 69 7a 65 36  int)payloadSize6
f860: 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  4;.    }else{.  
f870: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f880: 44 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20  DataSize(pCrsr, 
f890: 28 75 33 32 20 2a 29 26 70 61 79 6c 6f 61 64 53  (u32 *)&payloadS
f8a0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
f8b0: 6e 46 69 65 6c 64 20 3d 20 70 43 2d 3e 6e 46 69  nField = pC->nFi
f8c0: 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eld;.  }else{.  
f8d0: 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73    assert( pC->ps
f8e0: 65 75 64 6f 54 61 62 6c 65 20 29 3b 0a 20 20 20  eudoTable );.   
f8f0: 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69   /* The record i
f900: 73 20 74 68 65 20 73 6f 6c 65 20 65 6e 74 72 79  s the sole entry
f910: 20 6f 66 20 61 20 70 73 65 75 64 6f 2d 74 61 62   of a pseudo-tab
f920: 6c 65 20 2a 2f 0a 20 20 20 20 70 61 79 6c 6f 61  le */.    payloa
f930: 64 53 69 7a 65 20 3d 20 70 43 2d 3e 6e 44 61 74  dSize = pC->nDat
f940: 61 3b 0a 20 20 20 20 7a 52 65 63 20 3d 20 70 43  a;.    zRec = pC
f950: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 70 43 2d  ->pData;.    pC-
f960: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
f970: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
f980: 61 73 73 65 72 74 28 20 70 61 79 6c 6f 61 64 53  assert( payloadS
f990: 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65 63 21 3d  ize==0 || zRec!=
f9a0: 30 20 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20  0 );.    nField 
f9b0: 3d 20 70 43 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  = pC->nField;.  
f9c0: 20 20 70 43 72 73 72 20 3d 20 30 3b 0a 20 20 7d    pCrsr = 0;.  }
f9d0: 0a 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f 61  ..  /* If payloa
f9e0: 64 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65 6e  dSize is 0, then
f9f0: 20 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e 55   just store a NU
fa00: 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 70 61 79 6c  LL */.  if( payl
fa10: 6f 61 64 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  oadSize==0 ){.  
fa20: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
fa30: 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  >flags&MEM_Null 
fa40: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63  );.    goto op_c
fa50: 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20  olumn_out;.  }. 
fa60: 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65   if( payloadSize
fa70: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
fa80: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
fa90: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
faa0: 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  _big;.  }..  ass
fab0: 65 72 74 28 20 70 32 3c 6e 46 69 65 6c 64 20 29  ert( p2<nField )
fac0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 61 6e 64  ;..  /* Read and
fad0: 20 70 61 72 73 65 20 74 68 65 20 74 61 62 6c 65   parse the table
fae0: 20 68 65 61 64 65 72 2e 20 20 53 74 6f 72 65 20   header.  Store 
faf0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
fb00: 68 65 20 70 61 72 73 65 0a 20 20 2a 2a 20 69 6e  he parse.  ** in
fb10: 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 68 65  to the record he
fb20: 61 64 65 72 20 63 61 63 68 65 20 66 69 65 6c 64  ader cache field
fb30: 73 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  s of the cursor.
fb40: 0a 20 20 2a 2f 0a 20 20 61 54 79 70 65 20 3d 20  .  */.  aType = 
fb50: 70 43 2d 3e 61 54 79 70 65 3b 0a 20 20 69 66 28  pC->aType;.  if(
fb60: 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
fb70: 3d 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b  ==p->cacheCtr ){
fb80: 0a 20 20 20 20 61 4f 66 66 73 65 74 20 3d 20 70  .    aOffset = p
fb90: 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20 7d 65  C->aOffset;.  }e
fba0: 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 7a 49 64  lse{.    u8 *zId
fbb0: 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  x;        /* Ind
fbc0: 65 78 20 69 6e 74 6f 20 68 65 61 64 65 72 20 2a  ex into header *
fbd0: 2f 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 48 64  /.    u8 *zEndHd
fbe0: 72 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  r;     /* Pointe
fbf0: 72 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  r to first byte 
fc00: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
fc10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 66 66 73   */.    int offs
fc20: 65 74 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  et;      /* Offs
fc30: 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  et into the data
fc40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 48 64   */.    int szHd
fc50: 72 53 7a 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  rSz;     /* Size
fc60: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 73   of the header s
fc70: 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73 74 61  ize field at sta
fc80: 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a 2f 0a  rt of record */.
fc90: 20 20 20 20 69 6e 74 20 61 76 61 69 6c 20 3d 20      int avail = 
fca0: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
fcb0: 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
fcc0: 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 0a 20 20  able data */..  
fcd0: 20 20 61 73 73 65 72 74 28 61 54 79 70 65 29 3b    assert(aType);
fce0: 0a 20 20 20 20 70 43 2d 3e 61 4f 66 66 73 65 74  .    pC->aOffset
fcf0: 20 3d 20 61 4f 66 66 73 65 74 20 3d 20 26 61 54   = aOffset = &aT
fd00: 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  ype[nField];.   
fd10: 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
fd20: 20 3d 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a   = payloadSize;.
fd30: 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
fd40: 74 75 73 20 3d 20 70 2d 3e 63 61 63 68 65 43 74  tus = p->cacheCt
fd50: 72 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  r;..    /* Figur
fd60: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
fd70: 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ytes are in the 
fd80: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 69 66  header */.    if
fd90: 28 20 7a 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( zRec ){.      
fda0: 7a 44 61 74 61 20 3d 20 7a 52 65 63 3b 0a 20 20  zData = zRec;.  
fdb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
fdc0: 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29  f( pC->isIndex )
fdd0: 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61 20  {.        zData 
fde0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
fdf0: 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 70 43  BtreeKeyFetch(pC
fe00: 72 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20  rsr, &avail);.  
fe10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe20: 20 20 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72     zData = (char
fe30: 2a 29 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  *)sqlite3BtreeDa
fe40: 74 61 46 65 74 63 68 28 70 43 72 73 72 2c 20 26  taFetch(pCrsr, &
fe50: 61 76 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  avail);.      }.
fe60: 20 20 20 20 20 20 2f 2a 20 49 66 20 4b 65 79 46        /* If KeyF
fe70: 65 74 63 68 28 29 2f 44 61 74 61 46 65 74 63 68  etch()/DataFetch
fe80: 28 29 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  () managed to ge
fe90: 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  t the entire pay
fea0: 6c 6f 61 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73  load,.      ** s
feb0: 61 76 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ave the payload 
fec0: 69 6e 20 74 68 65 20 70 43 2d 3e 61 52 6f 77 20  in the pC->aRow 
fed0: 63 61 63 68 65 2e 20 20 54 68 61 74 20 77 69 6c  cache.  That wil
fee0: 6c 20 73 61 76 65 20 75 73 20 66 72 6f 6d 0a 20  l save us from. 
fef0: 20 20 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 74       ** having t
ff00: 6f 20 6d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  o make additiona
ff10: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 65 74 63 68  l calls to fetch
ff20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 70 6f 72   the content por
ff30: 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
ff40: 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20   the record..   
ff50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
ff60: 61 76 61 69 6c 3e 3d 70 61 79 6c 6f 61 64 53 69  avail>=payloadSi
ff70: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ze ){.        zR
ff80: 65 63 20 3d 20 7a 44 61 74 61 3b 0a 20 20 20 20  ec = zData;.    
ff90: 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28      pC->aRow = (
ffa0: 75 38 2a 29 7a 44 61 74 61 3b 0a 20 20 20 20 20  u8*)zData;.     
ffb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ffc0: 70 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20  pC->aRow = 0;.  
ffd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ffe0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
fff0: 20 61 73 73 65 72 74 20 69 73 20 74 72 75 65 20   assert is true 
10000 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 63 63  in all cases acc
10010 65 70 74 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ept when.    ** 
10020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10030 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
10040 70 74 65 64 20 65 78 74 65 72 6e 61 6c 6c 79 2e  pted externally.
10050 0a 20 20 20 20 2a 2a 20 20 20 20 61 73 73 65 72  .    **    asser
10060 74 28 20 7a 52 65 63 21 3d 30 20 7c 7c 20 61 76  t( zRec!=0 || av
10070 61 69 6c 3e 3d 70 61 79 6c 6f 61 64 53 69 7a 65  ail>=payloadSize
10080 20 7c 7c 20 61 76 61 69 6c 3e 3d 39 20 29 3b 20   || avail>=9 ); 
10090 2a 2f 0a 20 20 20 20 73 7a 48 64 72 53 7a 20 3d  */.    szHdrSz =
100a0 20 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38   getVarint32((u8
100b0 2a 29 7a 44 61 74 61 2c 20 6f 66 66 73 65 74 29  *)zData, offset)
100c0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4b 65  ;..    /* The Ke
100d0 79 46 65 74 63 68 28 29 20 6f 72 20 44 61 74 61  yFetch() or Data
100e0 46 65 74 63 68 28 29 20 61 62 6f 76 65 20 61 72  Fetch() above ar
100f0 65 20 66 61 73 74 20 61 6e 64 20 77 69 6c 6c 20  e fast and will 
10100 67 65 74 20 74 68 65 20 65 6e 74 69 72 65 0a 20  get the entire. 
10110 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 68 65 61     ** record hea
10120 64 65 72 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  der in most case
10130 73 2e 20 20 42 75 74 20 74 68 65 79 20 77 69 6c  s.  But they wil
10140 6c 20 66 61 69 6c 20 74 6f 20 67 65 74 20 74 68  l fail to get th
10150 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  e complete.    *
10160 2a 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  * record header 
10170 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 68 65  if the record he
10180 61 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 66 69  ader does not fi
10190 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  t on a single pa
101a0 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
101b0 20 42 2d 54 72 65 65 2e 20 20 57 68 65 6e 20 74   B-Tree.  When t
101c0 68 61 74 20 68 61 70 70 65 6e 73 2c 20 75 73 65  hat happens, use
101d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
101e0 72 6f 6d 42 74 72 65 65 28 29 20 74 6f 0a 20 20  romBtree() to.  
101f0 20 20 2a 2a 20 61 63 71 75 69 72 65 20 74 68 65    ** acquire the
10200 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
10210 20 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20   text..    */.  
10220 20 20 69 66 28 20 21 7a 52 65 63 20 26 26 20 61    if( !zRec && a
10230 76 61 69 6c 3c 6f 66 66 73 65 74 20 29 7b 0a 20  vail<offset ){. 
10240 20 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20       sMem.flags 
10250 3d 20 30 3b 0a 20 20 20 20 20 20 73 4d 65 6d 2e  = 0;.      sMem.
10260 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  db = 0;.      rc
10270 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
10280 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
10290 2c 20 30 2c 20 6f 66 66 73 65 74 2c 20 70 43 2d  , 0, offset, pC-
102a0 3e 69 73 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29  >isIndex, &sMem)
102b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
102c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
102d0 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c       goto op_col
102e0 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  umn_out;.      }
102f0 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 73  .      zData = s
10300 4d 65 6d 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  Mem.z;.    }.   
10310 20 7a 45 6e 64 48 64 72 20 3d 20 28 75 38 20 2a   zEndHdr = (u8 *
10320 29 26 7a 44 61 74 61 5b 6f 66 66 73 65 74 5d 3b  )&zData[offset];
10330 0a 20 20 20 20 7a 49 64 78 20 3d 20 28 75 38 20  .    zIdx = (u8 
10340 2a 29 26 7a 44 61 74 61 5b 73 7a 48 64 72 53 7a  *)&zData[szHdrSz
10350 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 61 6e 20  ];..    /* Scan 
10360 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 75  the header and u
10370 73 65 20 69 74 20 74 6f 20 66 69 6c 6c 20 69 6e  se it to fill in
10380 20 74 68 65 20 61 54 79 70 65 5b 5d 20 61 6e 64   the aType[] and
10390 20 61 4f 66 66 73 65 74 5b 5d 0a 20 20 20 20 2a   aOffset[].    *
103a0 2a 20 61 72 72 61 79 73 2e 20 20 61 54 79 70 65  * arrays.  aType
103b0 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  [i] will contain
103c0 20 74 68 65 20 74 79 70 65 20 69 6e 74 65 67 65   the type intege
103d0 72 20 66 6f 72 20 74 68 65 20 69 2d 74 68 0a 20  r for the i-th. 
103e0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 61 6e 64     ** column and
103f0 20 61 4f 66 66 73 65 74 5b 69 5d 20 77 69 6c 6c   aOffset[i] will
10400 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6f 66 66   contain the off
10410 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67  set from the beg
10420 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
10430 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 74   the record to t
10440 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10450 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 2d 74  data for the i-t
10460 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  h column.    */.
10470 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10480 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
10490 20 20 20 69 66 28 20 7a 49 64 78 3c 7a 45 6e 64     if( zIdx<zEnd
104a0 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Hdr ){.        a
104b0 4f 66 66 73 65 74 5b 69 5d 20 3d 20 6f 66 66 73  Offset[i] = offs
104c0 65 74 3b 0a 20 20 20 20 20 20 20 20 7a 49 64 78  et;.        zIdx
104d0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
104e0 7a 49 64 78 2c 20 61 54 79 70 65 5b 69 5d 29 3b  zIdx, aType[i]);
104f0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
10500 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
10510 72 69 61 6c 54 79 70 65 4c 65 6e 28 61 54 79 70  rialTypeLen(aTyp
10520 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e[i]);.      }el
10530 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
10540 66 20 69 20 69 73 20 6c 65 73 73 20 74 68 61 74  f i is less that
10550 20 6e 46 69 65 6c 64 2c 20 74 68 65 6e 20 74 68   nField, then th
10560 65 72 65 20 61 72 65 20 6c 65 73 73 20 66 69 65  ere are less fie
10570 6c 64 73 20 69 6e 20 74 68 69 73 0a 20 20 20 20  lds in this.    
10580 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 74 68      ** record th
10590 61 6e 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  an SetNumColumns
105a0 20 69 6e 64 69 63 61 74 65 64 20 74 68 65 72 65   indicated there
105b0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   are columns in 
105c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  the.        ** t
105d0 61 62 6c 65 2e 20 53 65 74 20 74 68 65 20 6f 66  able. Set the of
105e0 66 73 65 74 20 66 6f 72 20 61 6e 79 20 65 78 74  fset for any ext
105f0 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 70  ra columns not p
10600 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20 20 20  resent in.      
10610 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 20    ** the record 
10620 74 6f 20 30 2e 20 54 68 69 73 20 74 65 6c 6c 73  to 0. This tells
10630 20 63 6f 64 65 20 62 65 6c 6f 77 20 74 6f 20 73   code below to s
10640 74 6f 72 65 20 61 20 4e 55 4c 4c 0a 20 20 20 20  tore a NULL.    
10650 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f      ** instead o
10660 66 20 64 65 73 65 72 69 61 6c 69 7a 69 6e 67 20  f deserializing 
10670 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  a value from the
10680 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 20   record..       
10690 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 4f 66 66   */.        aOff
106a0 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  set[i] = 0;.    
106b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
106c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
106d0 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20  ase(&sMem);.    
106e0 73 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  sMem.flags = MEM
106f0 5f 4e 75 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49  _Null;..    /* I
10700 66 20 77 65 20 68 61 76 65 20 72 65 61 64 20 6d  f we have read m
10710 6f 72 65 20 68 65 61 64 65 72 20 64 61 74 61 20  ore header data 
10720 74 68 61 6e 20 77 61 73 20 63 6f 6e 74 61 69 6e  than was contain
10730 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
10740 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74  ,.    ** or if t
10750 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
10760 73 74 20 66 69 65 6c 64 20 61 70 70 65 61 72 73  st field appears
10770 20 74 6f 20 62 65 20 70 61 73 74 20 74 68 65 20   to be past the 
10780 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
10790 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 69 66 20  * record, or if 
107a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
107b0 61 73 74 20 66 69 65 6c 64 20 61 70 70 65 61 72  ast field appear
107c0 73 20 74 6f 20 62 65 20 62 65 66 6f 72 65 20 74  s to be before t
107d0 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
107e0 20 74 68 65 20 72 65 63 6f 72 64 20 28 77 68 65   the record (whe
107f0 6e 20 61 6c 6c 20 66 69 65 6c 64 73 20 70 72 65  n all fields pre
10800 73 65 6e 74 29 2c 20 74 68 65 6e 20 77 65 20 6d  sent), then we m
10810 75 73 74 20 62 65 20 64 65 61 6c 69 6e 67 20 0a  ust be dealing .
10820 20 20 20 20 2a 2a 20 77 69 74 68 20 61 20 63 6f      ** with a co
10830 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a  rrupt database..
10840 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
10850 49 64 78 3e 7a 45 6e 64 48 64 72 20 7c 7c 20 6f  Idx>zEndHdr || o
10860 66 66 73 65 74 3e 70 61 79 6c 6f 61 64 53 69 7a  ffset>payloadSiz
10870 65 20 0a 20 20 20 20 20 7c 7c 20 28 7a 49 64 78  e .     || (zIdx
10880 3d 3d 7a 45 6e 64 48 64 72 20 26 26 20 6f 66 66  ==zEndHdr && off
10890 73 65 74 21 3d 70 61 79 6c 6f 61 64 53 69 7a 65  set!=payloadSize
108a0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
108b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
108c0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
108d0 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
108e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47     }.  }..  /* G
108f0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  et the column in
10900 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61 4f  formation. If aO
10910 66 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f 6e  ffset[p2] is non
10920 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20 2a  -zero, then .  *
10930 2a 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * deserialize th
10940 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
10950 20 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66 66   record. If aOff
10960 73 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f 2c  set[p2] is zero,
10970 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
10980 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68 20   are not enough 
10990 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65  fields in the re
109a0 63 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79 20  cord to satisfy 
109b0 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
109c0 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  .  In this case,
109d0 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 4e   set the value N
109e0 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66 20  ULL or to P4 if 
109f0 50 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f 69  P4 is.  ** a poi
10a00 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f 62  nter to a Mem ob
10a10 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ject..  */.  if(
10a20 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b 0a   aOffset[p2] ){.
10a30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
10a40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
10a50 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20 20   if( zRec ){.   
10a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
10a70 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c  mReleaseExternal
10a80 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73  (pDest);.      s
10a90 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10aa0 47 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63 5b  Get((u8 *)&zRec[
10ab0 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61 54  aOffset[p2]], aT
10ac0 79 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b  ype[p2], pDest);
10ad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10ae0 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56    len = sqlite3V
10af0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
10b00 28 61 54 79 70 65 5b 70 32 5d 29 3b 0a 20 20 20  (aType[p2]);.   
10b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
10b20 6d 4d 6f 76 65 28 26 73 4d 65 6d 2c 20 70 44 65  mMove(&sMem, pDe
10b30 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  st);.      rc = 
10b40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
10b50 6f 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 61  omBtree(pCrsr, a
10b60 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c  Offset[p2], len,
10b70 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73   pC->isIndex, &s
10b80 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
10b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10ba0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
10bb0 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20  _column_out;.   
10bc0 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74 61     }.      zData
10bd0 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20   = sMem.z;.     
10be0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
10bf0 61 6c 47 65 74 28 28 75 38 2a 29 7a 44 61 74 61  alGet((u8*)zData
10c00 2c 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44 65  , aType[p2], pDe
10c10 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  st);.    }.    p
10c20 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  Dest->enc = enco
10c30 64 69 6e 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ding;.  }else{. 
10c40 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
10c50 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20  pe==P4_MEM ){.  
10c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
10c70 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44  emShallowCopy(pD
10c80 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  est, pOp->p4.pMe
10c90 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a  m, MEM_Static);.
10ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10cb0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
10cc0 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
10cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10ce0 2a 20 49 66 20 77 65 20 64 79 6e 61 6d 69 63 61  * If we dynamica
10cf0 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70  lly allocated sp
10d00 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
10d10 64 61 74 61 20 28 69 6e 20 74 68 65 0a 20 20 2a  data (in the.  *
10d20 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  * sqlite3VdbeMem
10d30 46 72 6f 6d 42 74 72 65 65 28 29 20 63 61 6c 6c  FromBtree() call
10d40 20 61 62 6f 76 65 29 20 74 68 65 6e 20 74 72 61   above) then tra
10d50 6e 73 66 65 72 20 63 6f 6e 74 72 6f 6c 20 6f 66  nsfer control of
10d60 20 74 68 61 74 0a 20 20 2a 2a 20 64 79 6e 61 6d   that.  ** dynam
10d70 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
10d80 20 73 70 61 63 65 20 6f 76 65 72 20 74 6f 20 74   space over to t
10d90 68 65 20 70 44 65 73 74 20 73 74 72 75 63 74 75  he pDest structu
10da0 72 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  re..  ** This pr
10db0 65 76 65 6e 74 73 20 61 20 6d 65 6d 6f 72 79 20  events a memory 
10dc0 63 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  copy..  */.  if(
10dd0 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 7b   sMem.zMalloc ){
10de0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 4d 65  .    assert( sMe
10df0 6d 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f  m.z==sMem.zMallo
10e00 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
10e10 20 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73 20   !(pDest->flags 
10e20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20  & MEM_Dyn) );.  
10e30 20 20 61 73 73 65 72 74 28 20 21 28 70 44 65 73    assert( !(pDes
10e40 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  t->flags & (MEM_
10e50 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 20 7c  Blob|MEM_Str)) |
10e60 7c 20 70 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65 6d  | pDest->z==sMem
10e70 2e 7a 20 29 3b 0a 20 20 20 20 70 44 65 73 74 2d  .z );.    pDest-
10e80 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
10e90 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63  Ephem|MEM_Static
10ea0 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  );.    pDest->fl
10eb0 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b  ags |= MEM_Term;
10ec0 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20  .    pDest->z = 
10ed0 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70 44 65 73  sMem.z;.    pDes
10ee0 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d 65  t->zMalloc = sMe
10ef0 6d 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a  m.zMalloc;.  }..
10f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10f10 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62  beMemMakeWriteab
10f20 6c 65 28 70 44 65 73 74 29 3b 0a 0a 6f 70 5f 63  le(pDest);..op_c
10f30 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44  olumn_out:.  UPD
10f40 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
10f50 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53  (pDest);.  REGIS
10f60 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
10f70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65  3, pDest);.  bre
10f80 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
10f90 3a 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32  : Affinity P1 P2
10fa0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41 70   * P4 *.**.** Ap
10fb0 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74  ply affinities t
10fc0 6f 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20  o a range of P2 
10fd0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
10fe0 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a  ng with P1..**.*
10ff0 2a 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67  * P4 is a string
11000 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
11010 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65  acters long. The
11020 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f   nth character o
11030 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20  f the.** string 
11040 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f  indicates the co
11050 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68  lumn affinity th
11060 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
11070 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a  d for the nth.**
11080 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
11090 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61  the range..*/.ca
110a0 73 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20  se OP_Affinity: 
110b0 7b 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  {.  char *zAffin
110c0 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ity = pOp->p4.z;
110d0 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 20 3d  .  Mem *pData0 =
110e0 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
110f0 31 5d 3b 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74  1];.  Mem *pLast
11100 20 3d 20 26 70 44 61 74 61 30 5b 70 4f 70 2d 3e   = &pData0[pOp->
11110 70 32 2d 31 5d 3b 0a 20 20 4d 65 6d 20 2a 70 52  p2-1];.  Mem *pR
11120 65 63 3b 0a 0a 20 20 66 6f 72 28 70 52 65 63 3d  ec;..  for(pRec=
11130 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c  pData0; pRec<=pL
11140 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20  ast; pRec++){.  
11150 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65    ExpandBlob(pRe
11160 63 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66  c);.    applyAff
11170 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66 66  inity(pRec, zAff
11180 69 6e 69 74 79 5b 70 52 65 63 2d 70 44 61 74 61  inity[pRec-pData
11190 30 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  0], encoding);. 
111a0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
111b0 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65  * Opcode: MakeRe
111c0 63 6f 72 64 20 50 31 20 50 32 20 50 33 20 50 34  cord P1 P2 P3 P4
111d0 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74   *.**.** Convert
111e0 20 50 32 20 72 65 67 69 73 74 65 72 73 20 62 65   P2 registers be
111f0 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 31 20  ginning with P1 
11200 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e  into a single en
11210 74 72 79 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  try.** suitable 
11220 66 6f 72 20 75 73 65 20 61 73 20 61 20 64 61 74  for use as a dat
11230 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61  a record in a da
11240 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
11250 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61  as a key.** in a
11260 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20 64 65  n index.  The de
11270 74 61 69 6c 73 20 6f 66 20 74 68 65 20 66 6f 72  tails of the for
11280 6d 61 74 20 61 72 65 20 69 72 72 65 6c 65 76 61  mat are irreleva
11290 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  nt as long as.**
112a0 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
112b0 70 63 6f 64 65 20 63 61 6e 20 64 65 63 6f 64 65  pcode can decode
112c0 20 74 68 65 20 72 65 63 6f 72 64 20 6c 61 74 65   the record late
112d0 72 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 73  r..** Refer to s
112e0 6f 75 72 63 65 20 63 6f 64 65 20 63 6f 6d 6d 65  ource code comme
112f0 6e 74 73 20 66 6f 72 20 74 68 65 20 64 65 74 61  nts for the deta
11300 69 6c 73 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ils of the recor
11310 64 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  d.** format..**.
11320 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73  ** P4 may be a s
11330 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
11340 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
11350 2e 20 20 54 68 65 20 6e 74 68 20 63 68 61 72 61  .  The nth chara
11360 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73  cter of the.** s
11370 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20  tring indicates 
11380 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
11390 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
113a0 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
113b0 6e 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  nth.** field of 
113c0 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a  the index key..*
113d0 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67  *.** The mapping
113e0 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20   from character 
113f0 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 67  to affinity is g
11400 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49  iven by the SQLI
11410 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f  TE_AFF_.** macro
11420 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
11430 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20  iteInt.h..**.** 
11440 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68  If P4 is NULL th
11450 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65  en all index fie
11460 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66 66  lds have the aff
11470 69 6e 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63  inity NONE..*/.c
11480 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  ase OP_MakeRecor
11490 64 3a 20 7b 0a 20 20 2f 2a 20 41 73 73 75 6d 69  d: {.  /* Assumi
114a0 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ng the record co
114b0 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c  ntains N fields,
114c0 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
114d0 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69  at looks.  ** li
114e0 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
114f0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
11500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  -----------.  **
11540 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74 79   | hdr-size | ty
11550 70 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c 20  pe 0 | type 1 | 
11560 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20 7c  ... | type N-1 |
11570 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20 64   data0 | ... | d
11580 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20  ata N-1 | .  ** 
11590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20  --------.  **.  
115e0 2a 2a 20 44 61 74 61 28 30 29 20 69 73 20 74 61  ** Data(0) is ta
115f0 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ken from registe
11600 72 20 50 31 2e 20 20 44 61 74 61 28 31 29 20 63  r P1.  Data(1) c
11610 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73 74  omes from regist
11620 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e 64  er P1+1.  ** and
11630 20 73 6f 20 66 72 6f 74 68 2e 0a 20 20 2a 2a 0a   so froth..  **.
11640 20 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20 66    ** Each type f
11650 69 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e 74  ield is a varint
11660 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
11670 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
11680 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72 65   the .  ** corre
11690 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65 6c  sponding data el
116a0 65 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69 74  ement (see sqlit
116b0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
116c0 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68 64  ()). The.  ** hd
116d0 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  r-size field is 
116e0 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77 68  also a varint wh
116f0 69 63 68 20 69 73 20 74 68 65 20 6f 66 66 73 65  ich is the offse
11700 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  t from the begin
11710 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ning.  ** of the
11720 20 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61 30   record to data0
11730 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 2a 7a 4e 65  ..  */.  u8 *zNe
11740 77 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  wRecord;        
11750 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
11760 6f 6c 64 20 74 68 65 20 64 61 74 61 20 66 6f 72  old the data for
11770 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
11780 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20  */.  Mem *pRec; 
11790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
117a0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
117b0 0a 20 20 75 36 34 20 6e 44 61 74 61 20 3d 20 30  .  u64 nData = 0
117c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
117d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
117e0 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20  data space */.  
117f0 69 6e 74 20 6e 48 64 72 20 3d 20 30 3b 20 20 20  int nHdr = 0;   
11800 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11810 20 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61   of bytes of hea
11820 64 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  der space */.  i
11830 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 20 20 20  64 nByte = 0;   
11840 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70        /* Data sp
11850 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
11860 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a   this record */.
11870 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b    int nZero = 0;
11880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11890 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73  er of zero bytes
118a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
118b0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
118c0 6e 74 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20  nt nVarint;     
118d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
118e0 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 76 61  of bytes in a va
118f0 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65  rint */.  u32 se
11900 72 69 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20  rial_type;      
11910 20 2f 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a   /* Type field *
11920 2f 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b  /.  Mem *pData0;
11930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11940 72 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  rst field to be 
11950 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68  combined into th
11960 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  e record */.  Me
11970 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20  m *pLast;       
11980 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65       /* Last fie
11990 6c 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ld of the record
119a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   */.  int nField
119b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
119c0 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
119d0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
119e0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e  /.  char *zAffin
119f0 69 74 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ity;       /* Th
11a00 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
11a10 67 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  g for the record
11a20 20 2a 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66   */.  int file_f
11a30 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20  ormat;       /* 
11a40 46 69 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75  File format to u
11a50 73 65 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20  se for encoding 
11a60 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11a80 70 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65  pace used in zNe
11a90 77 52 65 63 6f 72 64 5b 5d 20 2a 2f 0a 0a 20 20  wRecord[] */..  
11aa0 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31  nField = pOp->p1
11ab0 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20  ;.  zAffinity = 
11ac0 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73  pOp->p4.z;.  ass
11ad0 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26  ert( nField>0 &&
11ae0 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f   pOp->p2>0 && pO
11af0 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d  p->p2+nField<=p-
11b00 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 70 44 61  >nMem+1 );.  pDa
11b10 74 61 30 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e  ta0 = &p->aMem[n
11b20 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64  Field];.  nField
11b30 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c   = pOp->p2;.  pL
11b40 61 73 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46  ast = &pData0[nF
11b50 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f  ield-1];.  file_
11b60 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57  format = p->minW
11b70 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a  riteFileFormat;.
11b80 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11b90 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  gh the elements 
11ba0 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  that will make u
11bb0 70 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  p the record to 
11bc0 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20  figure.  ** out 
11bd0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
11be0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  s required for t
11bf0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20  he new record.. 
11c00 20 2a 2f 0a 20 20 66 6f 72 28 70 52 65 63 3d 70   */.  for(pRec=p
11c10 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61  Data0; pRec<=pLa
11c20 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  st; pRec++){.   
11c30 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 66   int len;.    if
11c40 28 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( zAffinity ){. 
11c50 20 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69       applyAffini
11c60 74 79 28 70 52 65 63 2c 20 7a 41 66 66 69 6e 69  ty(pRec, zAffini
11c70 74 79 5b 70 52 65 63 2d 70 44 61 74 61 30 5d 2c  ty[pRec-pData0],
11c80 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
11c90 7d 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e  }.    if( pRec->
11ca0 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 20 26  flags&MEM_Zero &
11cb0 26 20 70 52 65 63 2d 3e 6e 3e 30 20 29 7b 0a 20  & pRec->n>0 ){. 
11cc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11cd0 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52  MemExpandBlob(pR
11ce0 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ec);.    }.    s
11cf0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c  erial_type = sql
11d00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
11d10 70 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f  pe(pRec, file_fo
11d20 72 6d 61 74 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  rmat);.    len =
11d30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11d40 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
11d50 5f 74 79 70 65 29 3b 0a 20 20 20 20 6e 44 61 74  _type);.    nDat
11d60 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 6e 48  a += len;.    nH
11d70 64 72 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  dr += sqlite3Var
11d80 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
11d90 70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  pe);.    if( pRe
11da0 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  c->flags & MEM_Z
11db0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ero ){.      /* 
11dc0 4f 6e 6c 79 20 70 75 72 65 20 7a 65 72 6f 2d 66  Only pure zero-f
11dd0 69 6c 6c 65 64 20 42 4c 4f 42 73 20 63 61 6e 20  illed BLOBs can 
11de0 62 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  be input to this
11df0 20 4f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a   Opcode..      *
11e00 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  * We do not allo
11e10 77 20 62 6c 6f 62 73 20 77 69 74 68 20 61 20 70  w blobs with a p
11e20 72 65 66 69 78 20 61 6e 64 20 61 20 7a 65 72 6f  refix and a zero
11e30 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 2a 2f  -filled tail. */
11e40 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20  .      nZero += 
11e50 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRec->u.nZero;. 
11e60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e     }else if( len
11e70 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20   ){.      nZero 
11e80 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
11e90 20 20 2f 2a 20 41 64 64 20 74 68 65 20 69 6e 69    /* Add the ini
11ea0 74 69 61 6c 20 68 65 61 64 65 72 20 76 61 72 69  tial header vari
11eb0 6e 74 20 61 6e 64 20 74 6f 74 61 6c 20 74 68 65  nt and total the
11ec0 20 73 69 7a 65 20 2a 2f 0a 20 20 6e 48 64 72 20   size */.  nHdr 
11ed0 2b 3d 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c  += nVarint = sql
11ee0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48  ite3VarintLen(nH
11ef0 64 72 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 69  dr);.  if( nVari
11f00 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74  nt<sqlite3Varint
11f10 4c 65 6e 28 6e 48 64 72 29 20 29 7b 0a 20 20 20  Len(nHdr) ){.   
11f20 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e   nHdr++;.  }.  n
11f30 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74  Byte = nHdr+nDat
11f40 61 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e  a-nZero;.  if( n
11f50 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Byte>db->aLimit[
11f60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
11f70 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
11f80 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20   too_big;.  }.. 
11f90 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
11fa0 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65  e output registe
11fb0 72 20 68 61 73 20 61 20 62 75 66 66 65 72 20 6c  r has a buffer l
11fc0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73  arge enough to s
11fd0 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e  tore .  ** the n
11fe0 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f  ew record. The o
11ff0 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 28  utput register (
12000 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20  pOp->p3) is not 
12010 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20  allowed to.  ** 
12020 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
12030 70 75 74 20 72 65 67 69 73 74 65 72 73 20 28 62  put registers (b
12040 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f  ecause the follo
12050 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a  wing call to.  *
12060 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  * sqlite3VdbeMem
12070 47 72 6f 77 28 29 20 63 6f 75 6c 64 20 63 6c 6f  Grow() could clo
12080 62 62 65 72 20 74 68 65 20 76 61 6c 75 65 20 62  bber the value b
12090 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64  efore it is used
120a0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
120b0 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70  ( pOp->p3<pOp->p
120c0 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f  1 || pOp->p3>=pO
120d0 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b  p->p1+pOp->p2 );
120e0 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d  .  pOut = &p->aM
120f0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
12100 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
12110 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74  mGrow(pOut, (int
12120 29 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20  )nByte, 0) ){.  
12130 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
12140 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20   }.  zNewRecord 
12150 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b  = (u8 *)pOut->z;
12160 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
12170 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d   record */.  i =
12180 20 70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65   putVarint32(zNe
12190 77 52 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a  wRecord, nHdr);.
121a0 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61    for(pRec=pData
121b0 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20  0; pRec<=pLast; 
121c0 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 73 65 72  pRec++){.    ser
121d0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
121e0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
121f0 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pRec, file_form
12200 61 74 29 3b 0a 20 20 20 20 69 20 2b 3d 20 70 75  at);.    i += pu
12210 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52  tVarint32(&zNewR
12220 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c  ecord[i], serial
12230 5f 74 79 70 65 29 3b 20 20 20 20 20 20 2f 2a 20  _type);      /* 
12240 73 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20  serial type */. 
12250 20 7d 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44   }.  for(pRec=pD
12260 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73  ata0; pRec<=pLas
12270 74 3b 20 70 52 65 63 2b 2b 29 7b 20 20 2f 2a 20  t; pRec++){  /* 
12280 73 65 72 69 61 6c 20 64 61 74 61 20 2a 2f 0a 20  serial data */. 
12290 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 56     i += sqlite3V
122a0 64 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e  dbeSerialPut(&zN
122b0 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20 28 69 6e  ewRecord[i], (in
122c0 74 29 28 6e 42 79 74 65 2d 69 29 2c 20 70 52 65  t)(nByte-i), pRe
122d0 63 2c 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  c,file_format);.
122e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d    }.  assert( i=
122f0 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73  =nByte );..  ass
12300 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
12310 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
12320 65 6d 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  em );.  pOut->n 
12330 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20  = (int)nByte;.  
12340 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
12350 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e  M_Blob | MEM_Dyn
12360 3b 0a 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20 3d  ;.  pOut->xDel =
12370 20 30 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20   0;.  if( nZero 
12380 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e  ){.    pOut->u.n
12390 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20  Zero = nZero;.  
123a0 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
123b0 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20   MEM_Zero;.  }. 
123c0 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c   pOut->enc = SQL
123d0 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e  ITE_UTF8;  /* In
123e0 20 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69   case the blob i
123f0 73 20 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64  s ever converted
12400 20 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45   to text */.  RE
12410 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
12420 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55  ->p3, pOut);.  U
12430 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
12440 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
12450 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
12460 20 53 74 61 74 65 6d 65 6e 74 20 50 31 20 2a 20   Statement P1 * 
12470 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69  * * *.**.** Begi
12480 6e 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  n an individual 
12490 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
124a0 63 74 69 6f 6e 20 77 68 69 63 68 20 69 73 20 70  ction which is p
124b0 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 0a  art of a larger.
124c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
124d0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
124e0 73 6f 20 74 68 61 74 20 74 68 65 20 73 74 61 74  so that the stat
124f0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
12500 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
12510 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 6f  r an error witho
12520 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
12530 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65 6e  l back the.** en
12540 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
12550 2e 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  .  The statement
12560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
12570 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  l automatically.
12580 2a 2a 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 74  ** commit when t
12590 68 65 20 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a  he VDBE halts..*
125a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
125b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
125c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
125d0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  autocommit mode 
125e0 28 74 68 61 74 20 0a 2a 2a 20 69 73 20 74 6f 20  (that .** is to 
125f0 73 61 79 2c 20 69 66 20 69 74 20 69 73 20 69 6e  say, if it is in
12600 20 62 65 74 77 65 65 6e 20 42 45 47 49 4e 20 61   between BEGIN a
12610 6e 64 20 43 4f 4d 4d 49 54 29 0a 2a 2a 20 61 6e  nd COMMIT).** an
12620 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  d if there are n
12630 6f 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  o other active s
12640 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
12650 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
12660 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68  * connection, th
12670 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  en this operatio
12680 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 4e  n is a no-op.  N
12690 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
126a0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6e 65  saction.** is ne
126b0 65 64 65 64 20 73 69 6e 63 65 20 61 6e 79 20 65  eded since any e
126c0 72 72 6f 72 20 63 61 6e 20 75 73 65 20 74 68 65  rror can use the
126d0 20 6e 6f 72 6d 61 6c 20 52 4f 4c 4c 42 41 43 4b   normal ROLLBACK
126e0 20 70 72 6f 63 65 73 73 20 74 6f 0a 2a 2a 20 75   process to.** u
126f0 6e 64 6f 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 0a  ndo changes..**.
12700 2a 2a 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e  ** If a statemen
12710 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
12720 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 61   started, then a
12730 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
12740 61 6c 20 66 69 6c 65 0a 2a 2a 20 77 69 6c 6c 20  al file.** will 
12750 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  be allocated and
12760 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a   initialized..**
12770 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e  .** The statemen
12780 74 20 69 73 20 62 65 67 75 6e 20 6f 6e 20 74 68  t is begun on th
12790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
127a0 77 69 74 68 20 69 6e 64 65 78 20 50 31 2e 20 20  with index P1.  
127b0 54 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 61 74 61  The main.** data
127c0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
127d0 20 69 6e 64 65 78 20 6f 66 20 30 20 61 6e 64 20   index of 0 and 
127e0 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
127f0 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
12800 65 73 0a 2a 2a 20 68 61 73 20 61 6e 20 69 6e 64  es.** has an ind
12810 65 78 20 6f 66 20 31 2e 0a 2a 2f 0a 63 61 73 65  ex of 1..*/.case
12820 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 20 7b   OP_Statement: {
12830 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
12840 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
12850 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20  activeVdbeCnt>1 
12860 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
12870 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 42 74 72 65  Op->p1;.    Btre
12880 65 20 2a 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e *pBt;.    asse
12890 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 64 62  rt( i>=0 && i<db
128a0 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
128b0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert( db->aDb[i].
128c0 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 42  pBt!=0 );.    pB
128d0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
128e0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
128f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
12900 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20  Trans(pBt) );.  
12910 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
12920 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 69 29  reeMask & (1<<i)
12930 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )!=0 );.    if( 
12940 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  !sqlite3BtreeIsI
12950 6e 53 74 6d 74 28 70 42 74 29 20 29 7b 0a 20 20  nStmt(pBt) ){.  
12960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12970 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70  BtreeBeginStmt(p
12980 42 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70  Bt);.      p->op
12990 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20  enedStatement = 
129a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  1;.    }.  }.  b
129b0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
129c0 64 65 3a 20 53 61 76 65 70 6f 69 6e 74 20 50 31  de: Savepoint P1
129d0 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
129e0 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  Open, release or
129f0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 61   rollback the sa
12a00 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64 20 62 79  vepoint named by
12a10 20 70 61 72 61 6d 65 74 65 72 20 50 34 2c 20 64   parameter P4, d
12a20 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74  epending.** on t
12a30 68 65 20 76 61 6c 75 65 20 6f 66 20 50 31 2e 20  he value of P1. 
12a40 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 73 61  To open a new sa
12a50 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e 20  vepoint, P1==0. 
12a60 54 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  To release (comm
12a70 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69  it) an.** existi
12a80 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31  ng savepoint, P1
12a90 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c 62  ==1, or to rollb
12aa0 61 63 6b 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ack an existing 
12ab0 73 61 76 65 70 6f 69 6e 74 20 50 31 3d 3d 32 2e  savepoint P1==2.
12ac0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76 65  .*/.case OP_Save
12ad0 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 70  point: {.  int p
12ae0 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 63  1 = pOp->p1;.  c
12af0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 70  har *zName = pOp
12b00 2d 3e 70 34 2e 7a 3b 20 20 20 20 20 20 20 20 20  ->p4.z;         
12b10 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61 76 65 70  /* Name of savep
12b20 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73  oint */..  /* As
12b30 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70 31  sert that the p1
12b40 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76 61   parameter is va
12b50 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20 69  lid. Also that i
12b60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  f there is no op
12b70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  en.  ** transact
12b80 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ion, then there 
12b90 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73 61  cannot be any sa
12ba0 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f 0a  vepoints. .  */.
12bb0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53    assert( db->pS
12bc0 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 64  avepoint==0 || d
12bd0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
12be0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31   );.  assert( p1
12bf0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  ==SAVEPOINT_BEGI
12c00 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  N||p1==SAVEPOINT
12c10 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53 41  _RELEASE||p1==SA
12c20 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
12c40 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c 20  ->pSavepoint || 
12c50 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
12c60 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b  nSavepoint==0 );
12c70 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b  .  assert( check
12c80 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
12c90 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 31 3d  b) );..  if( p1=
12ca0 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  =SAVEPOINT_BEGIN
12cb0 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
12cc0 77 72 69 74 65 56 64 62 65 43 6e 74 3e 30 20 29  writeVdbeCnt>0 )
12cd0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77  {.      /* A new
12ce0 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f   savepoint canno
12cf0 74 20 62 65 20 63 72 65 61 74 65 64 20 69 66 20  t be created if 
12d00 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
12d10 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a   write .      **
12d20 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e 65   statements (i.e
12d30 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69 74  . open read/writ
12d40 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  e incremental bl
12d50 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20  ob handles)..   
12d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
12d70 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
12d80 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63  >zErrMsg, db, "c
12d90 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76 65 70  annot open savep
12da0 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20 20 20 20  oint - ".       
12db0 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73   "SQL statements
12dc0 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
12dd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12de0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
12df0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  e{.      int nNa
12e00 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12e10 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
12e20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e     Savepoint *pN
12e30 65 77 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ew;..      /* Cr
12e40 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65 70  eate a new savep
12e50 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  oint structure. 
12e60 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  */.      pNew = 
12e70 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
12e80 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 61  aw(db, sizeof(Sa
12e90 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31  vepoint)+nName+1
12ea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
12eb0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  w ){.        pNe
12ec0 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
12ed0 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20   *)&pNew[1];.   
12ee0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
12ef0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
12f00 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 0a 20  nName+1);.    . 
12f10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
12f20 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 74 72  re is no open tr
12f30 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
12f40 6d 61 72 6b 20 74 68 69 73 20 61 73 20 61 20 73  mark this as a s
12f50 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  pecial.        *
12f60 2a 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  * "transaction s
12f70 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20  avepoint". */.  
12f80 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75        if( db->au
12f90 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
12fa0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
12fb0 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
12fc0 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
12fd0 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
12fe0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
12ff0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
13000 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 09  >nSavepoint++;..
13010 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f  }.    .        /
13020 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73  * Link the new s
13030 61 76 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68  avepoint into th
13040 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
13050 65 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  e's list. */.   
13060 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74       pNew->pNext
13070 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
13080 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70  t;.        db->p
13090 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77  Savepoint = pNew
130a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
130b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 61 76    }else{.    Sav
130c0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
130d0 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 53 61 76  nt;.    int iSav
130e0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  epoint = 0;..   
130f0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   /* Find the nam
13100 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ed savepoint. If
13110 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
13120 68 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  h savepoint, the
13130 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65  n an.    ** an e
13140 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
13150 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a   to the user.  *
13160 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20  /.    for(.     
13170 20 70 53 61 76 65 70 6f 69 6e 74 3d 64 62 2d 3e   pSavepoint=db->
13180 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20 20  pSavepoint; .   
13190 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26     pSavepoint &&
131a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
131b0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61 6d  pSavepoint->zNam
131c0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
131d0 20 70 53 61 76 65 70 6f 69 6e 74 3d 70 53 61 76   pSavepoint=pSav
131e0 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 0a 20 20  epoint->pNext.  
131f0 20 20 29 7b 0a 20 20 20 20 20 20 69 53 61 76 65    ){.      iSave
13200 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  point++;.    }. 
13210 20 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69     if( !pSavepoi
13220 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
13230 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
13240 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 6e  >zErrMsg, db, "n
13250 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  o such savepoint
13260 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
13270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13280 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
13290 65 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 64  e if( .        d
132a0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3e  b->writeVdbeCnt>
132b0 30 20 7c 7c 20 28 70 31 3d 3d 53 41 56 45 50 4f  0 || (p1==SAVEPO
132c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
132d0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
132e0 74 3e 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  t>1) .    ){.   
132f0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
13300 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 6c 65  possible to rele
13310 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
13320 61 76 65 70 6f 69 6e 74 20 69 66 20 74 68 65 72  avepoint if ther
13330 65 20 61 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  e are .      ** 
13340 61 63 74 69 76 65 20 77 72 69 74 65 20 73 74 61  active write sta
13350 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6e  tements. It is n
13360 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ot possible to r
13370 6f 6c 6c 62 61 63 6b 20 61 20 73 61 76 65 70 6f  ollback a savepo
13380 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  int.      ** if 
13390 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61 63  there are any ac
133a0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
133b0 61 74 20 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  at all..      */
133c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
133d0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
133e0 4d 73 67 2c 20 64 62 2c 20 0a 20 20 20 20 20 20  Msg, db, .      
133f0 20 20 22 63 61 6e 6e 6f 74 20 25 73 20 73 61 76    "cannot %s sav
13400 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74 61  epoint - SQL sta
13410 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72  tements in progr
13420 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 28 70  ess",.        (p
13430 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  1==SAVEPOINT_ROL
13440 4c 42 41 43 4b 20 3f 20 22 72 6f 6c 6c 62 61 63  LBACK ? "rollbac
13450 6b 22 3a 20 22 72 65 6c 65 61 73 65 22 29 0a 20  k": "release"). 
13460 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 63       );.      rc
13470 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
13480 20 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20      }else{..    
13490 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77    /* Determine w
134a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
134b0 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  is is a transact
134c0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  ion savepoint. I
134d0 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61  f so,.      ** a
134e0 6e 64 20 74 68 69 73 20 69 73 20 61 20 52 45 4c  nd this is a REL
134f0 45 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68  EASE command, th
13500 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
13510 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
13520 20 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65    ** is committe
13530 64 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  d. .      */.   
13540 20 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63     int isTransac
13550 74 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e  tion = pSavepoin
13560 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64  t->pNext==0 && d
13570 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
13580 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20  Savepoint;.     
13590 20 69 66 28 20 69 73 54 72 61 6e 73 61 63 74 69   if( isTransacti
135a0 6f 6e 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f  on && p1==SAVEPO
135b0 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
135c0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
135d0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
135e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
135f0 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54  beHalt(p)==SQLIT
13600 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
13610 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a      p->pc = pc;.
13620 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
13630 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20  toCommit = 0;.  
13640 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
13650 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
13660 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
13670 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
13680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13690 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
136a0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
136b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e          rc = p->
136c0 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rc;.      }else{
136d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
136e0 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f  .        iSavepo
136f0 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70  int = db->nSavep
13700 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e  oint - iSavepoin
13710 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  t - 1;.        f
13720 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e  or(ii=0; ii<db->
13730 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
13740 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13750 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
13760 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
13770 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74  , p1, iSavepoint
13780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
137b0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
137c0 65 72 72 6f 72 3b 0a 09 20 20 7d 0a 20 20 20 20  error;..  }.    
137d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
137e0 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
137f0 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28 64 62 2d  ROLLBACK && (db-
13800 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
13810 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20  ternChanges)!=0 
13820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13830 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
13840 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
13850 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13860 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
13870 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
13880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13890 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67  .  .      /* Reg
138a0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
138b0 65 72 20 74 68 69 73 20 69 73 20 61 20 52 45 4c  er this is a REL
138c0 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EASE or ROLLBACK
138d0 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20  , destroy all . 
138e0 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e       ** savepoin
138f0 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65  ts nested inside
13900 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
13910 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
13920 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68   on. */.      wh
13930 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ile( db->pSavepo
13940 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20  int!=pSavepoint 
13950 29 7b 0a 20 20 20 20 20 20 20 20 53 61 76 65 70  ){.        Savep
13960 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d  oint *pTmp = db-
13970 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >pSavepoint;.   
13980 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f       db->pSavepo
13990 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
139a0 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
139b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
139c0 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  p);.        db->
139d0 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20  nSavepoint--;.  
139e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
139f0 49 66 20 69 74 20 69 73 20 61 20 52 45 4c 45 41  If it is a RELEA
13a00 53 45 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79  SE, then destroy
13a10 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62   the savepoint b
13a20 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e  eing operated on
13a30 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66   too */.      if
13a40 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( p1==SAVEPOINT_
13a50 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20  RELEASE ){.     
13a60 20 20 20 61 73 73 65 72 74 28 20 70 53 61 76 65     assert( pSave
13a70 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65  point==db->pSave
13a80 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  point );.       
13a90 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
13aa0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e  = pSavepoint->pN
13ab0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
13ac0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
13ad0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
13ae0 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73      if( !isTrans
13af0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
13b00 20 20 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69      db->nSavepoi
13b10 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt--;.        }.
13b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13b30 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  }..  break;.}../
13b40 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f  * Opcode: AutoCo
13b50 6d 6d 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  mmit P1 P2 * * *
13b60 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
13b70 61 74 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d  atabase auto-com
13b80 6d 69 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28  mit flag to P1 (
13b90 31 20 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69  1 or 0). If P2 i
13ba0 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20  s true, roll.** 
13bb0 62 61 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74  back any current
13bc0 6c 79 20 61 63 74 69 76 65 20 62 74 72 65 65 20  ly active btree 
13bd0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66  transactions. If
13be0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 61   there are any a
13bf0 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70  ctive.** VMs (ap
13c00 61 72 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e  art from this on
13c10 65 29 2c 20 74 68 65 6e 20 74 68 65 20 43 4f 4d  e), then the COM
13c20 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
13c30 73 74 61 74 65 6d 65 6e 74 20 66 61 69 6c 73 2e  statement fails.
13c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
13c50 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74  ruction causes t
13c60 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a  he VM to halt..*
13c70 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f  /.case OP_AutoCo
13c80 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65  mmit: {.  int de
13c90 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20  siredAutoCommit 
13ca0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74  = pOp->p1;.  int
13cb0 20 72 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f 70 2d   rollback = pOp-
13cc0 3e 70 32 3b 0a 20 20 69 6e 74 20 74 75 72 6e 4f  >p2;.  int turnO
13cd0 6e 41 43 20 3d 20 64 65 73 69 72 65 64 41 75 74  nAC = desiredAut
13ce0 6f 43 6f 6d 6d 69 74 20 26 26 20 21 64 62 2d 3e  oCommit && !db->
13cf0 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 0a 20 20 61  autoCommit;..  a
13d00 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
13d10 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64  toCommit==1 || d
13d20 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
13d30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
13d40 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
13d50 69 74 3d 3d 31 20 7c 7c 20 72 6f 6c 6c 62 61 63  it==1 || rollbac
13d60 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72  k==0 );..  asser
13d70 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
13d80 65 43 6e 74 3e 30 20 29 3b 20 20 2f 2a 20 41 74  eCnt>0 );  /* At
13d90 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e 65 20   least this one 
13da0 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a 2f 0a  VM is active */.
13db0 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20  .  if( turnOnAC 
13dc0 26 26 20 72 6f 6c 6c 62 61 63 6b 20 26 26 20 64  && rollback && d
13dd0 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
13de0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
13df0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
13e00 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52 4f   implements a RO
13e10 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74 68 65 72  LLBACK and other
13e20 20 56 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20   VMs are.    ** 
13e30 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20 61  still running, a
13e40 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  nd a transaction
13e50 20 69 73 20 61 63 74 69 76 65 2c 20 72 65 74 75   is active, retu
13e60 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69  rn an error indi
13e70 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  cating.    ** th
13e80 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73  at the other VMs
13e90 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66   must complete f
13ea0 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  irst. .    */.  
13eb0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
13ec0 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
13ed0 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c  db, "cannot roll
13ee0 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
13ef0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 22 53 51   - ".        "SQ
13f00 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
13f10 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20  progress");.    
13f20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
13f30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 75  ;.  }else if( tu
13f40 72 6e 4f 6e 41 43 20 26 26 20 21 72 6f 6c 6c 62  rnOnAC && !rollb
13f50 61 63 6b 20 26 26 20 64 62 2d 3e 77 72 69 74 65  ack && db->write
13f60 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
13f70 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74   /* If this inst
13f80 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  ruction implemen
13f90 74 73 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20  ts a COMMIT and 
13fa0 6f 74 68 65 72 20 56 4d 73 20 61 72 65 20 77 72  other VMs are wr
13fb0 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 74  iting.    ** ret
13fc0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64  urn an error ind
13fd0 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
13fe0 20 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20   other VMs must 
13ff0 63 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20  complete first. 
14000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
14010 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
14020 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63  >zErrMsg, db, "c
14030 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61  annot commit tra
14040 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20  nsaction - ".   
14050 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d       "SQL statem
14060 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
14070 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ");.    rc = SQL
14080 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
14090 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74  e if( desiredAut
140a0 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e 61 75 74  oCommit!=db->aut
140b0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 69  oCommit ){.    i
140c0 66 28 20 72 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  f( rollback ){. 
140d0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
140e0 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
140f0 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
14100 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
14110 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74  );.      db->aut
14120 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
14130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
14140 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
14150 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43 6f  u8)desiredAutoCo
14160 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  mmit;.      if( 
14170 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
14180 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  p)==SQLITE_BUSY 
14190 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 63  ){.        p->pc
141a0 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 20 20 64   = pc;.        d
141b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
141c0 28 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75  (u8)(1-desiredAu
141d0 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  toCommit);.     
141e0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20     p->rc = rc = 
141f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
14200 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
14210 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
14220 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14230 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
14240 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  db);.    if( p->
14250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14260 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14270 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c  TE_DONE;.    }el
14280 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
14290 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
142a0 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76 64 62 65   }.    goto vdbe
142b0 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65  _return;.  }else
142c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
142d0 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
142e0 73 67 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20  sg, db,.        
142f0 28 21 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  (!desiredAutoCom
14300 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74 61  mit)?"cannot sta
14310 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
14320 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
14330 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20 20  ction":(.       
14340 20 28 72 6f 6c 6c 62 61 63 6b 29 3f 22 63 61 6e   (rollback)?"can
14350 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e  not rollback - n
14360 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
14370 20 61 63 74 69 76 65 22 3a 0a 20 20 20 20 20 20   active":.      
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
14390 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f  nnot commit - no
143a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
143b0 61 63 74 69 76 65 22 29 29 3b 0a 20 20 20 20 20  active"));.     
143c0 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20 53 51      .    rc = SQ
143d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
143e0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
143f0 70 63 6f 64 65 3a 20 54 72 61 6e 73 61 63 74 69  pcode: Transacti
14400 6f 6e 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  on P1 P2 * * *.*
14410 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
14420 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 74  nsaction.  The t
14430 72 61 6e 73 61 63 74 69 6f 6e 20 65 6e 64 73 20  ransaction ends 
14440 77 68 65 6e 20 61 20 43 6f 6d 6d 69 74 20 6f 72  when a Commit or
14450 20 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 70 63   Rollback.** opc
14460 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
14470 65 64 2e 20 20 44 65 70 65 6e 64 69 6e 67 20 6f  ed.  Depending o
14480 6e 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  n the ON CONFLIC
14490 54 20 73 65 74 74 69 6e 67 2c 20 74 68 65 0a 2a  T setting, the.*
144a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 69  * transaction mi
144b0 67 68 74 20 61 6c 73 6f 20 62 65 20 72 6f 6c 6c  ght also be roll
144c0 65 64 20 62 61 63 6b 20 69 66 20 61 6e 20 65 72  ed back if an er
144d0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
144e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  ed..**.** P1 is 
144f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
14500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
14510 6e 20 77 68 69 63 68 20 74 68 65 20 74 72 61 6e  n which the tran
14520 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74  saction is.** st
14530 61 72 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20  arted.  Index 0 
14540 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
14550 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
14560 64 65 78 20 31 20 69 73 20 74 68 65 0a 2a 2a 20  dex 1 is the.** 
14570 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65  file used for te
14580 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
14590 20 49 6e 64 69 63 65 73 20 6f 66 20 32 20 6f 72   Indices of 2 or
145a0 20 6d 6f 72 65 20 61 72 65 20 75 73 65 64 20 66   more are used f
145b0 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  or.** attached d
145c0 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
145d0 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P2 is non-zer
145e0 6f 2c 20 74 68 65 6e 20 61 20 77 72 69 74 65 2d  o, then a write-
145f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
14600 74 61 72 74 65 64 2e 20 20 41 20 52 45 53 45 52  tarted.  A RESER
14610 56 45 44 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 6f  VED lock is.** o
14620 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64  btained on the d
14630 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
14640 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
14650 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
14660 2e 20 20 4e 6f 0a 2a 2a 20 6f 74 68 65 72 20 70  .  No.** other p
14670 72 6f 63 65 73 73 20 63 61 6e 20 73 74 61 72 74  rocess can start
14680 20 61 6e 6f 74 68 65 72 20 77 72 69 74 65 20 74   another write t
14690 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 69 6c 65  ransaction while
146a0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
146b0 6e 20 69 73 0a 2a 2a 20 75 6e 64 65 72 77 61 79  n is.** underway
146c0 2e 20 20 53 74 61 72 74 69 6e 67 20 61 20 77 72  .  Starting a wr
146d0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
146e0 61 6c 73 6f 20 63 72 65 61 74 65 73 20 61 20 72  also creates a r
146f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
14700 20 41 0a 2a 2a 20 77 72 69 74 65 20 74 72 61 6e   A.** write tran
14710 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
14720 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
14730 6e 79 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  ny changes can b
14740 65 20 6d 61 64 65 20 74 6f 20 74 68 65 0a 2a 2a  e made to the.**
14750 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 50   database.  If P
14760 32 20 69 73 20 32 20 6f 72 20 67 72 65 61 74 65  2 is 2 or greate
14770 72 20 74 68 65 6e 20 61 6e 20 45 58 43 4c 55 53  r then an EXCLUS
14780 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 73 6f  IVE lock is also
14790 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
147a0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
147b0 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74  If P2 is zero, t
147c0 68 65 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  hen a read-lock 
147d0 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
147e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
147f0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61  ..*/.case OP_Tra
14800 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e  nsaction: {.  in
14810 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
14820 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20   Btree *pBt;..  
14830 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
14840 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  i<db->nDb );.  a
14850 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
14860 4d 61 73 6b 20 26 20 28 31 3c 3c 69 29 29 21 3d  Mask & (1<<i))!=
14870 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d  0 );.  pBt = db-
14880 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 0a 20 20  >aDb[i].pBt;..  
14890 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72  if( pBt ){.    r
148a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
148b0 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
148c0 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69 66  pOp->p2);.    if
148d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
148e0 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63  Y ){.      p->pc
148f0 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e   = pc;.      p->
14900 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45  rc = rc = SQLITE
14910 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74  _BUSY;.      got
14920 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
14930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
14940 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
14950 21 3d 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  !=SQLITE_READONL
14960 59 20 2f 2a 20 26 26 20 72 63 21 3d 53 51 4c 49  Y /* && rc!=SQLI
14970 54 45 5f 42 55 53 59 20 2a 2f 20 29 7b 0a 20 20  TE_BUSY */ ){.  
14980 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
14990 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
149a0 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
149b0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
149c0 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50  adCookie P1 P2 P
149d0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64  3 * *.**.** Read
149e0 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
149f0 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  3 from database 
14a00 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  P1 and write it 
14a10 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
14a20 2e 0a 2a 2a 20 50 33 3d 3d 30 20 69 73 20 74 68  ..** P3==0 is th
14a30 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
14a40 2e 20 20 50 33 3d 3d 31 20 69 73 20 74 68 65 20  .  P3==1 is the 
14a50 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
14a60 0a 2a 2a 20 50 33 3d 3d 32 20 69 73 20 74 68 65  .** P3==2 is the
14a70 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
14a80 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61  er cache size, a
14a90 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31  nd so forth.  P1
14aa0 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61  ==0 is.** the ma
14ab0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
14ac0 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
14ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14ae0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
14af0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14b00 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69  s..**.** If P1 i
14b10 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
14b20 20 74 68 69 73 20 69 73 20 61 20 72 65 71 75 65   this is a reque
14b30 73 74 20 74 6f 20 72 65 61 64 20 74 68 65 20 73  st to read the s
14b40 69 7a 65 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  ize of a.** data
14b50 62 61 73 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  bases free-list.
14b60 20 50 33 20 6d 75 73 74 20 62 65 20 73 65 74 20   P3 must be set 
14b70 74 6f 20 31 20 69 6e 20 74 68 69 73 20 63 61 73  to 1 in this cas
14b80 65 2e 20 54 68 65 20 61 63 74 75 61 6c 0a 2a 2a  e. The actual.**
14b90 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
14ba0 65 64 20 69 73 20 28 28 50 31 2b 31 29 2a 2d 31  ed is ((P1+1)*-1
14bb0 29 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ). For example, 
14bc0 61 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 6f  a P1 parameter o
14bd0 66 20 2d 31 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  f -1.** correspo
14be0 6e 64 73 20 74 6f 20 64 61 74 61 62 61 73 65 20  nds to database 
14bf0 30 20 28 22 6d 61 69 6e 22 29 2c 20 61 20 50 31  0 ("main"), a P1
14c00 20 6f 66 20 2d 32 20 69 73 20 64 61 74 61 62 61   of -2 is databa
14c10 73 65 20 31 20 28 22 74 65 6d 70 22 29 2e 0a 2a  se 1 ("temp")..*
14c20 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
14c30 62 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  be a read-lock o
14c40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
14c50 65 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63  either a transac
14c60 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
14c70 73 74 61 72 74 65 64 20 6f 72 20 74 68 65 72 65  started or there
14c80 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
14c90 20 63 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a   cursor) before.
14ca0 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  ** executing thi
14cb0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
14cc0 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f  /.case OP_ReadCo
14cd0 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20  okie: {         
14ce0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
14cf0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e  erelease */.  in
14d00 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69  t iMeta;.  int i
14d10 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  Db = pOp->p1;.  
14d20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f  int iCookie = pO
14d30 70 2d 3e 70 33 3b 0a 0a 20 20 61 73 73 65 72 74  p->p3;..  assert
14d40 28 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45  ( pOp->p3<SQLITE
14d50 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
14d60 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
14d70 20 20 20 20 69 44 62 20 3d 20 28 2d 31 2a 28 69      iDb = (-1*(i
14d80 44 62 2b 31 29 29 3b 0a 20 20 20 20 69 43 6f 6f  Db+1));.    iCoo
14d90 6b 69 65 20 2a 3d 20 2d 31 3b 0a 20 20 7d 0a 20  kie *= -1;.  }. 
14da0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
14db0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
14dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
14dd0 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
14de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
14df0 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
14e00 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20 2f  <iDb))!=0 );.  /
14e10 2a 20 54 68 65 20 69 6e 64 65 78 69 6e 67 20 6f  * The indexing o
14e20 66 20 6d 65 74 61 20 76 61 6c 75 65 73 20 61 74  f meta values at
14e30 20 74 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   the schema laye
14e40 72 20 69 73 20 6f 66 66 20 62 79 20 6f 6e 65 20  r is off by one 
14e50 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 69 6e  from.  ** the in
14e60 64 65 78 69 6e 67 20 69 6e 20 74 68 65 20 62 74  dexing in the bt
14e70 72 65 65 20 6c 61 79 65 72 2e 20 20 54 68 65 20  ree layer.  The 
14e80 62 74 72 65 65 20 63 6f 6e 73 69 64 65 72 73 20  btree considers 
14e90 6d 65 74 61 5b 30 5d 20 74 6f 0a 20 20 2a 2a 20  meta[0] to.  ** 
14ea0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
14eb0 20 66 72 65 65 20 70 61 67 65 73 20 69 6e 20 74   free pages in t
14ec0 68 65 20 64 61 74 61 62 61 73 65 20 28 61 20 72  he database (a r
14ed0 65 61 64 2d 6f 6e 6c 79 20 76 61 6c 75 65 29 0a  ead-only value).
14ee0 20 20 2a 2a 20 61 6e 64 20 6d 65 74 61 5b 31 5d    ** and meta[1]
14ef0 20 74 6f 20 62 65 20 74 68 65 20 73 63 68 65 6d   to be the schem
14f00 61 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 20 73  a cookie.  The s
14f10 63 68 65 6d 61 20 6c 61 79 65 72 20 63 6f 6e 73  chema layer cons
14f20 69 64 65 72 73 0a 20 20 2a 2a 20 6d 65 74 61 5b  iders.  ** meta[
14f30 31 5d 20 74 6f 20 62 65 20 74 68 65 20 73 63 68  1] to be the sch
14f40 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 53 6f 20  ema cookie.  So 
14f50 77 65 20 68 61 76 65 20 74 6f 20 73 68 69 66 74  we have to shift
14f60 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
14f70 62 79 20 6f 6e 65 20 69 6e 20 74 68 65 20 66 6f  by one in the fo
14f80 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
14f90 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  t..  */.  rc = s
14fa0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
14fb0 74 61 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ta(db->aDb[iDb].
14fc0 70 42 74 2c 20 31 20 2b 20 69 43 6f 6f 6b 69 65  pBt, 1 + iCookie
14fd0 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61 29  , (u32 *)&iMeta)
14fe0 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
14ff0 69 4d 65 74 61 3b 0a 20 20 4d 65 6d 53 65 74 54  iMeta;.  MemSetT
15000 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
15010 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b  M_Int);.  break;
15020 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
15030 65 74 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50  etCookie P1 P2 P
15040 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  3 * *.**.** Writ
15050 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
15060 20 72 65 67 69 73 74 65 72 20 50 33 20 28 69 6e   register P3 (in
15070 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
15080 69 6e 74 65 67 65 72 29 0a 2a 2a 20 69 6e 74 6f  integer).** into
15090 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
150a0 32 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31  2 of database P1
150b0 2e 0a 2a 2a 20 50 32 3d 3d 30 20 69 73 20 74 68  ..** P2==0 is th
150c0 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
150d0 2e 20 20 50 32 3d 3d 31 20 69 73 20 74 68 65 20  .  P2==1 is the 
150e0 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
150f0 0a 2a 2a 20 50 32 3d 3d 32 20 69 73 20 74 68 65  .** P2==2 is the
15100 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
15110 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61  er cache size, a
15120 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31  nd so forth.  P1
15130 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61  ==0 is.** the ma
15140 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
15150 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
15160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15170 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
15180 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15190 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  s..**.** A trans
151a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
151b0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 65 78  tarted before ex
151c0 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f 70 63  ecuting this opc
151d0 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ode..*/.case OP_
151e0 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20  SetCookie: {    
151f0 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 44     /* in3 */.  D
15200 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74  b *pDb;.  assert
15210 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45  ( pOp->p2<SQLITE
15220 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b  _N_BTREE_META );
15230 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
15240 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
15250 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
15260 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
15270 61 73 6b 20 26 20 28 31 3c 3c 70 4f 70 2d 3e 70  ask & (1<<pOp->p
15280 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 44 62 20  1))!=0 );.  pDb 
15290 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  = &db->aDb[pOp->
152a0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
152b0 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db->pBt!=0 );.  
152c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
152d0 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b 0a  tegerify(pIn3);.
152e0 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61 62    /* See note ab
152f0 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74 69  out index shifti
15300 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f 6f  ng on OP_ReadCoo
15310 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  kie */.  rc = sq
15320 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
15330 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20 31  Meta(pDb->pBt, 1
15340 2b 70 4f 70 2d 3e 70 32 2c 20 28 69 6e 74 29 70  +pOp->p2, (int)p
15350 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 69 66 28  In3->u.i);.  if(
15360 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20   pOp->p2==0 ){. 
15370 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 73     /* When the s
15380 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61  chema cookie cha
15390 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74 68 65  nges, record the
153a0 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65   new cookie inte
153b0 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 70 44  rnally */.    pD
153c0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b->pSchema->sche
153d0 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28 69 6e 74  ma_cookie = (int
153e0 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20  )pIn3->u.i;.    
153f0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
15400 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
15410 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  s;.  }else if( p
15420 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
15430 20 2f 2a 20 52 65 63 6f 72 64 20 63 68 61 6e 67   /* Record chang
15440 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 66  es in the file f
15450 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 70 44 62  ormat */.    pDb
15460 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
15470 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 70 49 6e  format = (u8)pIn
15480 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 69 66  3->u.i;.  }.  if
15490 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a  ( pOp->p1==1 ){.
154a0 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74      /* Invalidat
154b0 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20 73  e all prepared s
154c0 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e 65 76  tatements whenev
154d0 65 72 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  er the TEMP data
154e0 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63 68 65  base.    ** sche
154f0 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20  ma is changed.  
15500 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a  Ticket #1644 */.
15510 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
15520 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
15530 6e 74 73 28 64 62 29 3b 0a 20 20 7d 0a 20 20 62  nts(db);.  }.  b
15540 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
15550 64 65 3a 20 56 65 72 69 66 79 43 6f 6f 6b 69 65  de: VerifyCookie
15560 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a 2a 20 43   P1 P2 *.**.** C
15570 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f  heck the value o
15580 66 20 67 6c 6f 62 61 6c 20 64 61 74 61 62 61 73  f global databas
15590 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75 6d 62  e parameter numb
155a0 65 72 20 30 20 28 74 68 65 0a 2a 2a 20 73 63 68  er 0 (the.** sch
155b0 65 6d 61 20 76 65 72 73 69 6f 6e 29 20 61 6e 64  ema version) and
155c0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
155d0 20 65 71 75 61 6c 20 74 6f 20 50 32 2e 20 20 0a   equal to P2.  .
155e0 2a 2a 20 50 31 20 69 73 20 74 68 65 20 64 61 74  ** P1 is the dat
155f0 61 62 61 73 65 20 6e 75 6d 62 65 72 20 77 68 69  abase number whi
15600 63 68 20 69 73 20 30 20 66 6f 72 20 74 68 65 20  ch is 0 for the 
15610 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
15620 6c 65 0a 2a 2a 20 61 6e 64 20 31 20 66 6f 72 20  le.** and 1 for 
15630 74 68 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  the file holding
15640 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15650 73 20 61 6e 64 20 73 6f 6d 65 20 68 69 67 68 65  s and some highe
15660 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 66 6f 72 20  r number.** for 
15670 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
15680 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ses..**.** The c
15690 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74  ookie changes it
156a0 73 20 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72  s value whenever
156b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
156c0 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a  hema changes..**
156d0 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
156e0 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 63  is used to detec
156f0 74 20 77 68 65 6e 20 74 68 61 74 20 74 68 65 20  t when that the 
15700 63 6f 6f 6b 69 65 20 68 61 73 20 63 68 61 6e 67  cookie has chang
15710 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74  ed.** and that t
15720 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
15730 73 73 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65  ss needs to rere
15740 61 64 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 2a  ad the schema..*
15750 2a 0a 2a 2a 20 45 69 74 68 65 72 20 61 20 74 72  *.** Either a tr
15760 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
15770 74 6f 20 68 61 76 65 20 62 65 65 6e 20 73 74 61  to have been sta
15780 72 74 65 64 20 6f 72 20 61 6e 20 4f 50 5f 4f 70  rted or an OP_Op
15790 65 6e 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  en needs.** to b
157a0 65 20 65 78 65 63 75 74 65 64 20 28 74 6f 20 65  e executed (to e
157b0 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 20  stablish a read 
157c0 6c 6f 63 6b 29 20 62 65 66 6f 72 65 20 74 68 69  lock) before thi
157d0 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a 2a 20 69  s opcode is.** i
157e0 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  nvoked..*/.case 
157f0 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 3a  OP_VerifyCookie:
15800 20 7b 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a   {.  int iMeta;.
15810 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
15820 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
15830 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
15840 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
15850 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
15860 20 26 20 28 31 3c 3c 70 4f 70 2d 3e 70 31 29 29   & (1<<pOp->p1))
15870 21 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64  !=0 );.  pBt = d
15880 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
15890 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 20 29  pBt;.  if( pBt )
158a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
158b0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
158c0 42 74 2c 20 31 2c 20 28 75 33 32 20 2a 29 26 69  Bt, 1, (u32 *)&i
158d0 4d 65 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Meta);.  }else{.
158e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
158f0 4f 4b 3b 0a 20 20 20 20 69 4d 65 74 61 20 3d 20  OK;.    iMeta = 
15900 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  0;.  }.  if( rc=
15910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4d  =SQLITE_OK && iM
15920 65 74 61 21 3d 70 4f 70 2d 3e 70 32 20 29 7b 0a  eta!=pOp->p2 ){.
15930 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15940 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15950 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15960 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
15970 44 75 70 28 64 62 2c 20 22 64 61 74 61 62 61 73  Dup(db, "databas
15980 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
15990 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a 20 49  nged");.    /* I
159a0 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f  f the schema-coo
159b0 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  kie from the dat
159c0 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74 63 68  abase file match
159d0 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20  es the cookie . 
159e0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77 69 74     ** stored wit
159f0 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
15a00 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
15a10 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20 64 6f  f the schema, do
15a20 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f  .    ** not relo
15a30 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 66 72  ad the schema fr
15a40 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
15a50 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
15a60 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c 2d 74   ** If virtual-t
15a70 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75 73 65  ables are in use
15a80 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 6a 75  , this is not ju
15a90 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  st an optimizati
15aa0 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e  on..    ** Often
15ab0 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f 72 65  , v-tables store
15ac0 20 74 68 65 69 72 20 64 61 74 61 20 69 6e 20 6f   their data in o
15ad0 74 68 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c  ther SQLite tabl
15ae0 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20 2a 2a  es, which.    **
15af0 20 61 72 65 20 71 75 65 72 69 65 64 20 66 72 6f   are queried fro
15b00 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74 28 29  m within xNext()
15b10 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74 61 62   and other v-tab
15b20 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69 6e 67  le methods using
15b30 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72 65 64  .    ** prepared
15b40 20 71 75 65 72 69 65 73 2e 20 49 66 20 73 75 63   queries. If suc
15b50 68 20 61 20 71 75 65 72 79 20 69 73 20 6f 75 74  h a query is out
15b60 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64 6f 20  -of-date, we do 
15b70 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20 20 20  not want to.    
15b80 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64  ** discard the d
15b90 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2c 20  atabase schema, 
15ba0 61 73 20 74 68 65 20 75 73 65 72 20 63 6f 64 65  as the user code
15bb0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
15bc0 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65  e.    ** v-table
15bd0 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62   would have to b
15be0 65 20 72 65 61 64 79 20 66 6f 72 20 74 68 65 20  e ready for the 
15bf0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
15c00 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a 20 20  ucture itself.  
15c10 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
15c20 69 64 61 74 65 64 20 77 68 65 6e 65 76 65 72 20  idated whenever 
15c30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69  sqlite3_step() i
15c40 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  s called from wi
15c50 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76  thin .    ** a v
15c60 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20  -table method.. 
15c70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
15c80 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
15c90 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
15ca0 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a  ookie!=iMeta ){.
15cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
15cc0 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
15cd0 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  (db, pOp->p1);. 
15ce0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
15cf0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
15d00 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
15d10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 53     rc = SQLITE_S
15d20 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65  CHEMA;.  }.  bre
15d30 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
15d40 3a 20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32  : OpenRead P1 P2
15d50 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
15d60 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
15d70 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
15d80 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 77  database table w
15d90 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69  hose root page i
15da0 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20 64 61 74  s.** P2 in a dat
15db0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
15dc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
15dd0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
15de0 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65  P3. .** P3==0 me
15df0 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
15e00 61 62 61 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61  abase, P3==1 mea
15e10 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
15e20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d  used for .** tem
15e30 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2c 20 61  porary tables, a
15e40 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73 20 75 73  nd P3>1 means us
15e50 65 64 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ed the correspon
15e60 64 69 6e 67 20 61 74 74 61 63 68 65 64 0a 2a 2a  ding attached.**
15e70 20 64 61 74 61 62 61 73 65 2e 20 20 47 69 76 65   database.  Give
15e80 20 74 68 65 20 6e 65 77 20 63 75 72 73 6f 72 20   the new cursor 
15e90 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 66  an identifier of
15ea0 20 50 31 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20   P1.  The P1.** 
15eb0 76 61 6c 75 65 73 20 6e 65 65 64 20 6e 6f 74 20  values need not 
15ec0 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 75  be contiguous bu
15ed0 74 20 61 6c 6c 20 50 31 20 76 61 6c 75 65 73 20  t all P1 values 
15ee0 73 68 6f 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20  should be small 
15ef0 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20  integers..** It 
15f00 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
15f10 50 31 20 74 6f 20 62 65 20 6e 65 67 61 74 69 76  P1 to be negativ
15f20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d  e..**.** If P5!=
15f30 30 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 63  0 then use the c
15f40 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
15f50 65 72 20 50 32 20 61 73 20 74 68 65 20 72 6f 6f  er P2 as the roo
15f60 74 20 70 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74  t page, not.** t
15f70 68 65 20 76 61 6c 75 65 20 6f 66 20 50 32 20 69  he value of P2 i
15f80 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tself..**.** The
15f90 72 65 20 77 69 6c 6c 20 62 65 20 61 20 72 65 61  re will be a rea
15fa0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
15fb0 74 61 62 61 73 65 20 77 68 65 6e 65 76 65 72 20  tabase whenever 
15fc0 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f  there is an.** o
15fd0 70 65 6e 20 63 75 72 73 6f 72 2e 20 20 49 66 20  pen cursor.  If 
15fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
15ff0 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20   unlocked prior 
16000 74 6f 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  to this instruct
16010 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65  ion.** then a re
16020 61 64 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69  ad lock is acqui
16030 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
16040 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  his instruction.
16050 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b    A read.** lock
16060 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72 20 70 72   allows other pr
16070 6f 63 65 73 73 65 73 20 74 6f 20 72 65 61 64 20  ocesses to read 
16080 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
16090 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e   prohibits.** an
160a0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  y other process 
160b0 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74  from modifying t
160c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
160d0 65 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a  e read lock is.*
160e0 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65 6e 20  * released when 
160f0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
16100 63 6c 6f 73 65 64 2e 20 20 49 66 20 74 68 69 73  closed.  If this
16110 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 74   instruction att
16120 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20  empts.** to get 
16130 61 20 72 65 61 64 20 6c 6f 63 6b 20 62 75 74 20  a read lock but 
16140 66 61 69 6c 73 2c 20 74 68 65 20 73 63 72 69 70  fails, the scrip
16150 74 20 74 65 72 6d 69 6e 61 74 65 73 20 77 69 74  t terminates wit
16160 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  h an.** SQLITE_B
16170 55 53 59 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  USY error code..
16180 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
16190 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
161a0 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
161b0 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
161c0 6e 65 73 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  nes the.** conte
161d0 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  nt and collating
161e0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 69 6e 64   sequence of ind
161f0 69 63 65 73 2e 20 20 50 34 20 69 73 20 4e 55 4c  ices.  P4 is NUL
16200 4c 20 66 6f 72 20 63 75 72 73 6f 72 73 0a 2a 2a  L for cursors.**
16210 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 6f   that are not po
16220 69 6e 74 69 6e 67 20 74 6f 20 69 6e 64 69 63 65  inting to indice
16230 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
16240 6f 20 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a  o OpenWrite..*/.
16250 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57  /* Opcode: OpenW
16260 72 69 74 65 20 50 31 20 50 32 20 50 33 20 50 34  rite P1 P2 P3 P4
16270 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61   P5.**.** Open a
16280 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   read/write curs
16290 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74  or named P1 on t
162a0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
162b0 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20  x whose root.** 
162c0 70 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20  page is P2.  Or 
162d0 69 66 20 50 35 21 3d 30 20 75 73 65 20 74 68 65  if P5!=0 use the
162e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
162f0 73 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20  ster P2 to find 
16300 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
16310 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76  ..**.** The P4 v
16320 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
16330 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
16340 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
16350 66 69 6e 65 73 20 74 68 65 0a 2a 2a 20 63 6f 6e  fines the.** con
16360 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69  tent and collati
16370 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 69  ng sequence of i
16380 6e 64 69 63 65 73 2e 20 20 50 34 20 69 73 20 4e  ndices.  P4 is N
16390 55 4c 4c 20 66 6f 72 20 63 75 72 73 6f 72 73 0a  ULL for cursors.
163a0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
163b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e 64 69  pointing to indi
163c0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ces..**.** This 
163d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b  instruction work
163e0 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e  s just like Open
163f0 52 65 61 64 20 65 78 63 65 70 74 20 74 68 61 74  Read except that
16400 20 69 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75   it opens the cu
16410 72 73 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f  rsor.** in read/
16420 77 72 69 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72  write mode.  For
16430 20 61 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20   a given table, 
16440 74 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 65  there can be one
16450 20 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e   or more read-on
16460 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72  ly.** cursors or
16470 20 61 20 73 69 6e 67 6c 65 20 72 65 61 64 2f 77   a single read/w
16480 72 69 74 65 20 63 75 72 73 6f 72 20 62 75 74 20  rite cursor but 
16490 6e 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20  not both..**.** 
164a0 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61  See also OpenRea
164b0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70  d..*/.case OP_Op
164c0 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f  enRead:.case OP_
164d0 4f 70 65 6e 57 72 69 74 65 3a 20 7b 0a 20 20 69  OpenWrite: {.  i
164e0 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
164f0 20 20 69 6e 74 20 70 32 20 3d 20 70 4f 70 2d 3e    int p2 = pOp->
16500 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  p2;.  int iDb = 
16510 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 6e 74 20 77  pOp->p3;.  int w
16520 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20 2a  rFlag;.  Btree *
16530 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  pX;.  VdbeCursor
16540 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70 44   *pCur;.  Db *pD
16550 62 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  b;.  .  assert( 
16560 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
16570 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
16580 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
16590 20 26 20 28 31 3c 3c 69 44 62 29 29 21 3d 30 20   & (1<<iDb))!=0 
165a0 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
165b0 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d  aDb[iDb];.  pX =
165c0 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73   pDb->pBt;.  ass
165d0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
165e0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
165f0 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b  =OP_OpenWrite ){
16600 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 31 3b  .    wrFlag = 1;
16610 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53  .    if( pDb->pS
16620 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
16630 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65  at < p->minWrite
16640 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20  FileFormat ){.  
16650 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46      p->minWriteF
16660 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d  ileFormat = pDb-
16670 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
16680 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ormat;.    }.  }
16690 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61 67  else{.    wrFlag
166a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
166b0 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 61  pOp->p5 ){.    a
166c0 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b 0a 20  ssert( p2>0 );. 
166d0 20 20 20 61 73 73 65 72 74 28 20 70 32 3c 3d 70     assert( p2<=p
166e0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 70 49  ->nMem );.    pI
166f0 6e 32 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 32  n2 = &p->aMem[p2
16700 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
16710 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
16720 70 49 6e 32 29 3b 0a 20 20 20 20 70 32 20 3d 20  pIn2);.    p2 = 
16730 28 69 6e 74 29 70 49 6e 32 2d 3e 75 2e 69 3b 0a  (int)pIn2->u.i;.
16740 20 20 20 20 69 66 28 20 70 32 3c 32 20 29 20 7b      if( p2<2 ) {
16750 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16760 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16770 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
16780 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
16790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
167a0 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 70 43  rt( i>=0 );.  pC
167b0 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
167c0 73 6f 72 28 70 2c 20 69 2c 20 26 70 4f 70 5b 2d  sor(p, i, &pOp[-
167d0 31 5d 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 69  1], iDb, 1);.  i
167e0 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67 6f 74  f( pCur==0 ) got
167f0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 75 72  o no_mem;.  pCur
16800 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
16810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16820 65 65 43 75 72 73 6f 72 28 70 58 2c 20 70 32 2c  eeCursor(pX, p2,
16830 20 77 72 46 6c 61 67 2c 20 70 4f 70 2d 3e 70 34   wrFlag, pOp->p4
16840 2e 70 2c 20 70 43 75 72 2d 3e 70 43 75 72 73 6f  .p, pCur->pCurso
16850 72 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  r);.  if( pOp->p
16860 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
16870 4f 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  O ){.    pCur->p
16880 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
16890 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
168a0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
168b0 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29  enc = ENC(p->db)
168c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
168d0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
168e0 30 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  0;.  }.  switch(
168f0 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
16900 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 7b 0a 20  SQLITE_BUSY: {. 
16910 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b       p->pc = pc;
16920 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
16930 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16940 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65  .      goto vdbe
16950 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20  _return;.    }. 
16960 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
16970 4b 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  K: {.      int f
16980 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 42 74  lags = sqlite3Bt
16990 72 65 65 46 6c 61 67 73 28 70 43 75 72 2d 3e 70  reeFlags(pCur->p
169a0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 2f  Cursor);.      /
169b0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
169c0 67 2e 20 20 4f 6e 6c 79 20 74 68 65 20 6c 6f 77  g.  Only the low
169d0 65 72 20 66 6f 75 72 20 62 69 74 73 20 6f 66 20  er four bits of 
169e0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 73  the flags byte s
169f0 68 6f 75 6c 64 0a 20 20 20 20 20 20 2a 2a 20 62  hould.      ** b
16a00 65 20 75 73 65 64 2e 20 20 42 69 74 20 33 20 28  e used.  Bit 3 (
16a10 6d 61 73 6b 20 30 78 30 38 29 20 69 73 20 75 6e  mask 0x08) is un
16a20 70 72 65 64 69 63 74 61 62 6c 65 2e 20 20 54 68  predictable.  Th
16a30 65 20 6c 6f 77 65 72 20 33 20 62 69 74 73 0a 20  e lower 3 bits. 
16a40 20 20 20 20 20 2a 2a 20 28 6d 61 73 6b 20 30 78       ** (mask 0x
16a50 30 37 29 20 73 68 6f 75 6c 64 20 62 65 20 65 69  07) should be ei
16a60 74 68 65 72 20 35 20 28 69 6e 74 6b 65 79 2b 6c  ther 5 (intkey+l
16a70 65 61 66 64 61 74 61 20 66 6f 72 20 74 61 62 6c  eafdata for tabl
16a80 65 73 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  es) or.      ** 
16a90 32 20 28 7a 65 72 6f 64 61 74 61 20 66 6f 72 20  2 (zerodata for 
16aa0 69 6e 64 69 63 65 73 29 2e 20 20 49 66 20 74 68  indices).  If th
16ab0 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ese conditions a
16ac0 72 65 20 6e 6f 74 20 6d 65 74 20 69 74 20 63 61  re not met it ca
16ad0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  n.      ** only 
16ae0 6d 65 61 6e 20 74 68 61 74 20 77 65 20 61 72 65  mean that we are
16af0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
16b00 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
16b10 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20   file.      */. 
16b20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20       if( (flags 
16b30 26 20 30 78 66 30 29 21 3d 30 20 7c 7c 20 28 28  & 0xf0)!=0 || ((
16b40 66 6c 61 67 73 20 26 20 30 78 30 37 29 21 3d 35  flags & 0x07)!=5
16b50 20 26 26 20 28 66 6c 61 67 73 20 26 20 30 78 30   && (flags & 0x0
16b60 37 29 21 3d 32 29 20 29 7b 0a 20 20 20 20 20 20  7)!=2) ){.      
16b70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
16b80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
16b90 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
16ba0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
16bb0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
16bc0 3e 69 73 54 61 62 6c 65 20 3d 20 28 66 6c 61 67  >isTable = (flag
16bd0 73 20 26 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  s & BTREE_INTKEY
16be0 29 21 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 20  )!=0 ?1:0;.     
16bf0 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78 20 3d   pCur->isIndex =
16c00 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
16c10 5a 45 52 4f 44 41 54 41 29 21 3d 30 20 3f 31 3a  ZERODATA)!=0 ?1:
16c20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 50  0;.      /* If P
16c30 34 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  4==0 it means we
16c40 20 61 72 65 20 65 78 70 65 63 74 65 64 20 74 6f   are expected to
16c50 20 6f 70 65 6e 20 61 20 74 61 62 6c 65 2e 20 20   open a table.  
16c60 49 66 20 50 34 21 3d 30 20 74 68 65 6e 0a 20 20  If P4!=0 then.  
16c70 20 20 20 20 2a 2a 20 77 65 20 65 78 70 65 63 74      ** we expect
16c80 20 74 6f 20 62 65 20 6f 70 65 6e 69 6e 67 20 61   to be opening a
16c90 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 69  n index.  If thi
16ca0 73 20 69 73 20 6e 6f 74 20 77 68 61 74 20 68 61  s is not what ha
16cb0 70 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  ppened,.      **
16cc0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
16cd0 73 65 20 69 73 20 63 6f 72 72 75 70 74 0a 20 20  se is corrupt.  
16ce0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16cf0 20 28 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 20   (pCur->isTable 
16d00 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  && pOp->p4type==
16d10 50 34 5f 4b 45 59 49 4e 46 4f 29 0a 20 20 20 20  P4_KEYINFO).    
16d20 20 20 20 7c 7c 20 28 70 43 75 72 2d 3e 69 73 49     || (pCur->isI
16d30 6e 64 65 78 20 26 26 20 70 4f 70 2d 3e 70 34 74  ndex && pOp->p4t
16d40 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 29  ype!=P4_KEYINFO)
16d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16d60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16d70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
16d80 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
16d90 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
16da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16db0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
16dc0 45 5f 45 4d 50 54 59 3a 20 7b 0a 20 20 20 20 20  E_EMPTY: {.     
16dd0 20 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 20 3d   pCur->isTable =
16de0 20 70 4f 70 2d 3e 70 34 74 79 70 65 21 3d 50 34   pOp->p4type!=P4
16df0 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 20 20  _KEYINFO;.      
16e00 70 43 75 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20  pCur->isIndex = 
16e10 21 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a  !pCur->isTable;.
16e20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 43 75 72        pCur->pCur
16e30 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  sor = 0;.      r
16e40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16e50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16e60 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
16e70 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
16e80 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
16e90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
16ea0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
16eb0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 50   OpenEphemeral P
16ec0 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
16ed0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72  * Open a new cur
16ee0 73 6f 72 20 50 31 20 74 6f 20 61 20 74 72 61 6e  sor P1 to a tran
16ef0 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 20  sient table..** 
16f00 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  The cursor is al
16f10 77 61 79 73 20 6f 70 65 6e 65 64 20 72 65 61 64  ways opened read
16f20 2f 77 72 69 74 65 20 65 76 65 6e 20 69 66 20 0a  /write even if .
16f30 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
16f40 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
16f50 79 2e 20 20 54 68 65 20 74 72 61 6e 73 69 65 6e  y.  The transien
16f60 74 20 6f 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20  t or virtual.** 
16f70 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64  table is deleted
16f80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
16f90 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
16fa0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
16fb0 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  P2 is the number
16fc0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
16fd0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
16fe0 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  ..** The cursor 
16ff0 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72 65  points to a BTre
17000 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d 30  e table if P4==0
17010 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65 20   and to a BTree 
17020 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20 69  index.** if P4 i
17030 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34 20  s not 0.  If P4 
17040 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
17050 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49  points to a KeyI
17060 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  nfo structure.**
17070 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
17080 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73  e format of keys
17090 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
170a0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
170b0 20 77 61 73 20 6f 6e 63 65 20 63 61 6c 6c 65 64   was once called
170c0 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42 75 74 20   OpenTemp.  But 
170d0 74 68 61 74 20 63 72 65 61 74 65 64 0a 2a 2a 20  that created.** 
170e0 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63 61 75 73  confusion becaus
170f0 65 20 74 68 65 20 74 65 72 6d 20 22 74 65 6d 70  e the term "temp
17100 20 74 61 62 6c 65 22 2c 20 6d 69 67 68 74 20 72   table", might r
17110 65 66 65 72 20 65 69 74 68 65 72 0a 2a 2a 20 74  efer either.** t
17120 6f 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 61  o a TEMP table a
17130 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c  t the SQL level,
17140 20 6f 72 20 74 6f 20 61 20 74 61 62 6c 65 20 6f   or to a table o
17150 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  pened by.** this
17160 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 6e 20 74   opcode.  Then t
17170 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73 20 63  his opcode was c
17180 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75 61 6c 2e  all OpenVirtual.
17190 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 63 72    But.** that cr
171a0 65 61 74 65 64 20 63 6f 6e 66 75 73 69 6f 6e 20  eated confusion 
171b0 77 69 74 68 20 74 68 65 20 77 68 6f 6c 65 20 76  with the whole v
171c0 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 69 64 65  irtual-table ide
171d0 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70  a..*/.case OP_Op
171e0 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20  enEphemeral: {. 
171f0 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
17200 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
17210 70 43 78 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  pCx;.  static co
17220 6e 73 74 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  nst int openFlag
17230 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49 54  s = .      SQLIT
17240 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17250 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f   |.      SQLITE_
17260 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
17270 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17280 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
17290 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
172a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
172b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
172c0 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 0a 20  TRANSIENT_DB;.. 
172d0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
172e0 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74  .  pCx = allocat
172f0 65 43 75 72 73 6f 72 28 70 2c 20 69 2c 20 70 4f  eCursor(p, i, pO
17300 70 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 69 66 28  p, -1, 1);.  if(
17310 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
17320 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75  o_mem;.  pCx->nu
17330 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 63 20  llRow = 1;.  rc 
17340 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
17350 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 31 2c 20  ctory(db, 0, 1, 
17360 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 54  SQLITE_DEFAULT_T
17370 45 4d 50 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  EMP_CACHE_SIZE, 
17380 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20  openFlags,.     
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 26 70 43 78 2d 3e 70 42 74 29        &pCx->pBt)
173b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
173c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
173d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
173e0 67 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42  ginTrans(pCx->pB
173f0 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  t, 1);.  }.  if(
17400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17410 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72  {.    /* If a tr
17420 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69 73  ansient index is
17430 20 72 65 71 75 69 72 65 64 2c 20 63 72 65 61 74   required, creat
17440 65 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a  e it by calling.
17450 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
17460 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
17470 20 77 69 74 68 20 74 68 65 20 42 54 52 45 45 5f   with the BTREE_
17480 5a 45 52 4f 44 41 54 41 20 66 6c 61 67 20 62 65  ZERODATA flag be
17490 66 6f 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  fore.    ** open
174a0 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74 72 61  ing it. If a tra
174b0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20  nsient table is 
174c0 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75  required, just u
174d0 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75  se the.    ** au
174e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
174f0 74 65 64 20 74 61 62 6c 65 20 77 69 74 68 20 72  ted table with r
17500 6f 6f 74 2d 70 61 67 65 20 31 20 28 61 6e 20 49  oot-page 1 (an I
17510 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20  NTKEY table)..  
17520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70    */.    if( pOp
17530 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 29 7b  ->p4.pKeyInfo ){
17540 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
17550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17560 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b  Op->p4type==P4_K
17570 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  EYINFO );.      
17580 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17590 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 78  eCreateTable(pCx
175a0 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 42 54  ->pBt, &pgno, BT
175b0 52 45 45 5f 5a 45 52 4f 44 41 54 41 29 3b 20 0a  REE_ZERODATA); .
175c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
175d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
175e0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
175f0 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29  =MASTER_ROOT+1 )
17600 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17610 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17620 72 28 70 43 78 2d 3e 70 42 74 2c 20 70 67 6e 6f  r(pCx->pBt, pgno
17630 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 1, .          
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 20 20 20 20 20 20 28 4b 65 79 49 6e 66 6f 2a 29        (KeyInfo*)
17660 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 43 78 2d 3e  pOp->p4.z, pCx->
17670 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
17680 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
17690 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
176a0 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 43 78 2d  fo;.        pCx-
176b0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d  >pKeyInfo->enc =
176c0 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a 20 20 20   ENC(p->db);.   
176d0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 78 2d 3e     }.      pCx->
176e0 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  isTable = 0;.   
176f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
17700 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
17710 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 2c 20  ursor(pCx->pBt, 
17720 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
17730 30 2c 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  0, pCx->pCursor)
17740 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54  ;.      pCx->isT
17750 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
17760 20 20 7d 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64    }.  pCx->isInd
17770 65 78 20 3d 20 21 70 43 78 2d 3e 69 73 54 61 62  ex = !pCx->isTab
17780 6c 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  le;.  break;.}..
17790 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50  /* Opcode: OpenP
177a0 73 65 75 64 6f 20 50 31 20 50 32 20 2a 20 2a 20  seudo P1 P2 * * 
177b0 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  *.**.** Open a n
177c0 65 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70  ew cursor that p
177d0 6f 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20  oints to a fake 
177e0 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
177f0 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  ins a single.** 
17800 72 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 41 6e  row of data.  An
17810 79 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  y attempt to wri
17820 74 65 20 61 20 73 65 63 6f 6e 64 20 72 6f 77 20  te a second row 
17830 6f 66 20 64 61 74 61 20 63 61 75 73 65 73 20 74  of data causes t
17840 68 65 0a 2a 2a 20 66 69 72 73 74 20 72 6f 77 20  he.** first row 
17850 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  to be deleted.  
17860 41 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  All data is dele
17870 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
17880 73 6f 72 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  sor is.** closed
17890 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f  ..**.** A pseudo
178a0 2d 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 62  -table created b
178b0 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  y this opcode is
178c0 20 75 73 65 66 75 6c 20 66 6f 72 20 68 6f 6c 64   useful for hold
178d0 69 6e 67 20 74 68 65 0a 2a 2a 20 4e 45 57 20 6f  ing the.** NEW o
178e0 72 20 4f 4c 44 20 74 61 62 6c 65 73 20 69 6e 20  r OLD tables in 
178f0 61 20 74 72 69 67 67 65 72 2e 20 20 41 6c 73 6f  a trigger.  Also
17900 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
17910 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f  e a single.** ro
17920 77 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68  w output from th
17930 65 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74  e sorter so that
17940 20 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20   the row can be 
17950 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a  decomposed into.
17960 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f  ** individual co
17970 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20  lumns using the 
17980 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
17990 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 4f 50 5f  ..**.** When OP_
179a0 49 6e 73 65 72 74 20 69 73 20 65 78 65 63 75 74  Insert is execut
179b0 65 64 20 74 6f 20 69 6e 73 65 72 74 20 61 20 72  ed to insert a r
179c0 6f 77 20 69 6e 20 74 6f 20 74 68 65 20 70 73 65  ow in to the pse
179d0 75 64 6f 20 74 61 62 6c 65 2c 0a 2a 2a 20 74 68  udo table,.** th
179e0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  e pseudo-table c
179f0 75 72 73 6f 72 20 6d 61 79 20 6f 72 20 6d 61 79  ursor may or may
17a00 20 6e 6f 74 20 6d 61 6b 65 20 69 74 27 73 20 6f   not make it's o
17a10 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a  wn copy of the.*
17a20 2a 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 20 64  * original row d
17a30 61 74 61 2e 20 49 66 20 50 32 20 69 73 20 30 2c  ata. If P2 is 0,
17a40 20 74 68 65 6e 20 74 68 65 20 70 73 65 75 64 6f   then the pseudo
17a50 2d 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 70 79  -table will copy
17a60 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
17a70 20 72 6f 77 20 64 61 74 61 2e 20 4f 74 68 65 72   row data. Other
17a80 77 69 73 65 2c 20 61 20 70 6f 69 6e 74 65 72 20  wise, a pointer 
17a90 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
17aa0 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 2a 2a 20 69  memory cell.** i
17ab0 73 20 73 74 6f 72 65 64 2e 20 49 6e 20 74 68 69  s stored. In thi
17ac0 73 20 63 61 73 65 2c 20 74 68 65 20 76 64 62 65  s case, the vdbe
17ad0 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 65 6e   program must en
17ae0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a 2a  sure that the .*
17af0 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f  * memory cell co
17b00 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77  ntaining the row
17b10 20 64 61 74 61 20 69 73 20 6e 6f 74 20 6f 76 65   data is not ove
17b20 72 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 74  rwritten until t
17b30 68 65 0a 2a 2a 20 70 73 65 75 64 6f 20 74 61 62  he.** pseudo tab
17b40 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 28 6f 72  le is closed (or
17b50 20 61 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e   a new row is in
17b60 73 65 72 74 65 64 20 69 6e 74 6f 20 69 74 29 2e  serted into it).
17b70 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  .*/.case OP_Open
17b80 50 73 65 75 64 6f 3a 20 7b 0a 20 20 69 6e 74 20  Pseudo: {.  int 
17b90 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56  i = pOp->p1;.  V
17ba0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
17bb0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
17bc0 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61  ;.  pCx = alloca
17bd0 74 65 43 75 72 73 6f 72 28 70 2c 20 69 2c 20 26  teCursor(p, i, &
17be0 70 4f 70 5b 2d 31 5d 2c 20 2d 31 2c 20 30 29 3b  pOp[-1], -1, 0);
17bf0 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20  .  if( pCx==0 ) 
17c00 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
17c10 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  Cx->nullRow = 1;
17c20 0a 20 20 70 43 78 2d 3e 70 73 65 75 64 6f 54 61  .  pCx->pseudoTa
17c30 62 6c 65 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  ble = 1;.  pCx->
17c40 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62 6c 65  ephemPseudoTable
17c50 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a   = (u8)pOp->p2;.
17c60 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d    pCx->isTable =
17c70 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64   1;.  pCx->isInd
17c80 65 78 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  ex = 0;.  break;
17c90 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
17ca0 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  lose P1 * * * *.
17cb0 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  **.** Close a cu
17cc0 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79 20  rsor previously 
17cd0 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20 49  opened as P1.  I
17ce0 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  f P1 is not.** c
17cf0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74  urrently open, t
17d00 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
17d10 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63  is a no-op..*/.c
17d20 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a  ase OP_Close: {.
17d30 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
17d40 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  1;.  assert( i>=
17d50 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
17d60 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r );.  sqlite3Vd
17d70 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
17d80 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  p->apCsr[i]);.  
17d90 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
17da0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
17db0 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 65 20 50  Opcode: SeekGe P
17dc0 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
17dd0 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
17de0 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
17df0 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
17e00 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
17e10 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
17e20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
17e30 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20  ister P3 as the 
17e40 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20  key.  If cursor 
17e50 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
17e60 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
17e70 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
17e80 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
17e90 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
17ea0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
17eb0 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
17ec0 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
17ed0 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
17ee0 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
17ef0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
17f00 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79  e smallest entry
17f10 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65   that .** is gre
17f20 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
17f30 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61  al to the key va
17f40 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
17f50 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a  e no records .**
17f60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
17f70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
17f80 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20  y and P2 is not 
17f90 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20  zero, then jump 
17fa0 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  to P2..**.** See
17fb0 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
17fc0 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63 74  tFound, Distinct
17fd0 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74  , SeekLt, SeekGt
17fe0 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
17ff0 70 63 6f 64 65 3a 20 53 65 65 6b 47 74 20 50 31  pcode: SeekGt P1
18000 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
18010 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
18020 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
18030 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
18040 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
18050 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
18060 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
18070 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79  ster P3 as a key
18080 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  . If cursor P1 r
18090 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20  efers .** to an 
180a0 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  SQL index, then 
180b0 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20  P3 is the first 
180c0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50  in an array of P
180d0 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20  4 registers .** 
180e0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
180f0 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64   an unpacked ind
18100 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52  ex key. .**.** R
18110 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72  eposition cursor
18120 20 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20   P1 so that  it 
18130 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
18140 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61  allest entry tha
18150 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  t .** is greater
18160 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
18170 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
18180 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65  e no records gre
18190 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68  ater than .** th
181a0 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
181b0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
181c0 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
181d0 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
181e0 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74  , NotFound, Dist
181f0 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65  inct, SeekLt, Se
18200 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
18210 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
18220 74 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20  t P1 P2 P3 P4 * 
18230 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
18240 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
18250 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
18260 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
18270 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
18280 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
18290 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
182a0 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
182b0 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
182c0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
182d0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
182e0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
182f0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
18300 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
18310 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
18320 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
18330 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
18340 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
18350 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
18360 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
18370 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73   that .** is les
18380 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  s than the key v
18390 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
183a0 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65  re no records le
183b0 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20  ss than .** the 
183c0 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
183d0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
183e0 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  p to P2..**.** S
183f0 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
18400 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e  NotFound, Distin
18410 63 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b  ct, SeekGt, Seek
18420 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
18430 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 65 20   Opcode: SeekLe 
18440 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
18450 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
18460 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
18470 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
18480 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
18490 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
184a0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
184b0 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
184c0 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
184d0 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
184e0 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
184f0 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
18500 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
18510 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
18520 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
18530 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
18540 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
18550 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
18560 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
18570 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
18580 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61  argest entry tha
18590 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  t .** is less th
185a0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
185b0 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
185c0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
185d0 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74  cords .** less t
185e0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
185f0 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
18600 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
18610 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
18620 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
18630 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
18640 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20  stinct, SeekGt, 
18650 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a  SeekGe, SeekLt.*
18660 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 74  /.case OP_SeekLt
18670 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
18680 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
18690 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20 20 20 20  P_SeekLe:       
186a0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
186b0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 65  /.case OP_SeekGe
186c0 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  :         /* jum
186d0 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  p, in3 */.case O
186e0 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20 20 20 20  P_SeekGt: {     
186f0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
18700 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  /.  int i = pOp-
18710 3e 70 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  >p1;.  VdbeCurso
18720 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74  r *pC;..  assert
18730 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
18740 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
18750 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  rt( pOp->p2!=0 )
18760 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
18770 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r[i];.  assert( 
18780 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  pC!=0 );.  if( p
18790 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 7b  C->pCursor!=0 ){
187a0 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 6f 63  .    int res, oc
187b0 3b 0a 20 20 20 20 6f 63 20 3d 20 70 4f 70 2d 3e  ;.    oc = pOp->
187c0 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 43 2d 3e  opcode;.    pC->
187d0 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
187e0 20 69 66 28 20 70 43 2d 3e 69 73 54 61 62 6c 65   if( pC->isTable
187f0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 4b   ){.      i64 iK
18800 65 79 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey;      /* The 
18810 72 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f 20  rowid we are to 
18820 73 65 65 6b 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  seek to */..    
18830 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76    /* The input v
18840 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74  alue in P3 might
18850 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a   be of any type:
18860 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20   integer, real, 
18870 73 74 72 69 6e 67 2c 0a 20 20 20 20 20 20 2a 2a  string,.      **
18880 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20   blob, or NULL. 
18890 20 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f   But it needs to
188a0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62   be an integer b
188b0 65 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a  efore we can do.
188c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65        ** the see
188d0 6b 2c 20 73 6f 20 63 6f 76 65 72 74 20 69 74 2e  k, so covert it.
188e0 20 2a 2f 0a 20 20 20 20 20 20 61 70 70 6c 79 4e   */.      applyN
188f0 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70  umericAffinity(p
18900 49 6e 33 29 3b 0a 20 20 20 20 20 20 69 4b 65 79  In3);.      iKey
18910 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
18920 74 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 20 20  tValue(pIn3);.  
18930 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
18940 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  alid = 0;..     
18950 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61   /* If the P3 va
18960 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  lue could not be
18970 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
18980 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74 68 6f  an integer witho
18990 75 74 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 73 73  ut.      ** loss
189a0 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c   of information,
189b0 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72   then special pr
189c0 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
189d0 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  ired... */.     
189e0 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
189f0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20  s & MEM_Int)==0 
18a00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
18a10 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
18a20 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Real)==0 ){.  
18a30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
18a40 65 20 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f  e P3 value canno
18a50 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
18a60 6e 74 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  nto any kind of 
18a70 61 20 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20  a number,.      
18a80 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
18a90 73 65 65 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73  seek is not poss
18aa0 69 62 6c 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f  ible, so jump to
18ab0 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P2 */.         
18ac0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
18ad0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
18ae0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
18af0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
18b00 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
18b10 20 74 68 65 6e 20 74 68 65 20 50 33 20 76 61 6c   then the P3 val
18b20 75 65 20 6d 75 73 74 20 62 65 20 61 20 66 6c 6f  ue must be a flo
18b30 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ating.        **
18b40 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
18b50 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
18b60 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
18b70 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 3b   MEM_Real)!=0 );
18b80 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4b  ..        if( iK
18b90 65 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  ey==SMALLEST_INT
18ba0 36 34 20 26 26 20 28 70 49 6e 33 2d 3e 72 3c 28  64 && (pIn3->r<(
18bb0 64 6f 75 62 6c 65 29 69 4b 65 79 20 7c 7c 20 70  double)iKey || p
18bc0 49 6e 33 2d 3e 72 3e 30 29 20 29 7b 0a 20 20 20  In3->r>0) ){.   
18bd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
18be0 20 76 61 6c 75 65 20 69 73 20 74 6f 20 6c 61 72   value is to lar
18bf0 67 65 20 69 6e 20 6d 61 67 6e 69 74 75 64 65 20  ge in magnitude 
18c00 74 6f 20 62 65 20 65 78 70 72 65 73 73 65 64 20  to be expressed 
18c10 61 73 20 61 6e 0a 20 20 20 20 20 20 20 20 20 20  as an.          
18c20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
18c30 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31           res = 1
18c40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18c50 70 49 6e 33 2d 3e 72 3c 30 20 29 7b 0a 20 20 20  pIn3->r<0 ){.   
18c60 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 3d           if( oc=
18c70 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20 6f 63  =OP_SeekGt || oc
18c80 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 0a 20  ==OP_SeekGe ){. 
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
18ca0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  = sqlite3BtreeFi
18cb0 72 73 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  rst(pC->pCursor,
18cc0 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
18cd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18ce0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
18cf0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
18d00 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  r;.            }
18d10 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
18d20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
18d30 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( oc==OP_SeekLt 
18d40 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  || oc==OP_SeekLe
18d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18d70 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72  reeLast(pC->pCur
18d80 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
18d90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
18da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18db0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
18dc0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
18dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
18de0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18df0 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
18e00 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
18e10 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
18e20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
18e30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
18e40 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74  f( oc==OP_SeekLt
18e50 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
18e60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
18e70 2a 20 55 73 65 20 74 68 65 20 63 65 69 6c 69 6e  * Use the ceilin
18e80 67 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  g() function to 
18e90 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e  convert real->in
18ea0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
18eb0 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20 28 64 6f  f( pIn3->r > (do
18ec0 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79  uble)iKey ) iKey
18ed0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
18ee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
18ef0 55 73 65 20 74 68 65 20 66 6c 6f 6f 72 28 29 20  Use the floor() 
18f00 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e 76  function to conv
18f10 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f  ert real->int */
18f20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18f30 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65  t( oc==OP_SeekLe
18f40 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47   || oc==OP_SeekG
18f50 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t );.          i
18f60 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20 28 64 6f  f( pIn3->r < (do
18f70 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65 79  uble)iKey ) iKey
18f80 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
18f90 20 20 20 20 7d 20 0a 20 20 20 20 20 20 72 63 20      } .      rc 
18fa0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
18fb0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
18fc0 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  >pCursor, 0, (u6
18fd0 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  4)iKey, 0, &res)
18fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19000 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
19010 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
19020 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19030 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
19040 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
19050 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
19060 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  pC->lastRowid = 
19070 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iKey;.      }.  
19080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 55    }else{.      U
19090 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b  npackedRecord r;
190a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  .      int nFiel
190b0 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  d = pOp->p4.i;. 
190c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
190d0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
190e0 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  32 );.      asse
190f0 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  rt( nField>0 );.
19100 20 20 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f        r.pKeyInfo
19110 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
19120 0a 20 20 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  .      r.nField 
19130 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b 0a 20  = (u16)nField;. 
19140 20 20 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f       if( oc==OP_
19150 53 65 65 6b 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGt || oc==OP
19160 5f 53 65 65 6b 4c 65 20 29 7b 0a 20 20 20 20 20  _SeekLe ){.     
19170 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50     r.flags = UNP
19180 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 3b 0a 20  ACKED_INCRKEY;. 
19190 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
191a0 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b      r.flags = 0;
191b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
191c0 2e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  .aMem = &p->aMem
191d0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
191e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
191f0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
19200 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  (pC->pCursor, &r
19210 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
19220 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19240 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
19250 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
19260 20 7d 0a 20 20 20 20 20 20 70 43 2d 3e 72 6f 77   }.      pC->row
19270 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
19280 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66     }.    pC->def
19290 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
192a0 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
192b0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
192c0 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LE;.#ifdef SQLIT
192d0 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
192e0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
192f0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  +;.#endif.    if
19300 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( oc==OP_SeekGe 
19310 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74  || oc==OP_SeekGt
19320 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 65   ){.      if( re
19330 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26  s<0 || (res==0 &
19340 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 29  & oc==OP_SeekGt)
19350 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19360 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
19370 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  t(pC->pCursor, &
19380 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
19390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
193a0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
193b0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
193c0 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
193d0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  lid = 0;.      }
193e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
193f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
19400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19410 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
19420 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekLt || oc==OP_
19430 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 20 20  SeekLe );.      
19440 69 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65  if( res>0 || (re
19450 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53  s==0 && oc==OP_S
19460 65 65 6b 4c 74 29 20 29 7b 0a 20 20 20 20 20 20  eekLt) ){.      
19470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
19480 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 2d 3e  reePrevious(pC->
19490 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
194a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
194b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
194c0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
194d0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  ror;.        pC-
194e0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
194f0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
19500 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d          /* res m
19510 69 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65  ight be negative
19520 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
19530 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68  le is empty.  Ch
19540 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  eck to.        *
19550 2a 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  * see if this is
19560 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20   the case..     
19570 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
19580 73 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  s = sqlite3Btree
19590 45 6f 66 28 70 43 2d 3e 70 43 75 72 73 6f 72 29  Eof(pC->pCursor)
195a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
195b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
195c0 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 69 66 28  >p2>0 );.    if(
195d0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70 63   res ){.      pc
195e0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
195f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
19600 28 20 21 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  ( !pC->pseudoTab
19610 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
19620 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
19630 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65  ttempting to ope
19640 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61  n the sqlite3_ma
19650 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a  ster table.    *
19660 2a 20 66 6f 72 20 72 65 61 64 20 61 63 63 65 73  * for read acces
19670 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
19680 5f 45 4d 50 54 59 2e 20 49 6e 20 74 68 69 73 20  _EMPTY. In this 
19690 63 61 73 65 20 61 6c 77 61 79 73 0a 20 20 20 20  case always.    
196a0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
196b0 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 61 72   (since there ar
196c0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 69 6e 20  e no records in 
196d0 74 68 65 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  the table)..    
196e0 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  */.    pc = pOp-
196f0 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
19700 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
19710 64 65 3a 20 53 65 65 6b 20 50 31 20 50 32 20 2a  de: Seek P1 P2 *
19720 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73   * *.**.** P1 is
19730 20 61 6e 20 6f 70 65 6e 20 74 61 62 6c 65 20 63   an open table c
19740 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20  ursor and P2 is 
19750 61 20 72 6f 77 69 64 20 69 6e 74 65 67 65 72 2e  a rowid integer.
19760 20 20 41 72 72 61 6e 67 65 0a 2a 2a 20 66 6f 72    Arrange.** for
19770 20 50 31 20 74 6f 20 6d 6f 76 65 20 73 6f 20 74   P1 to move so t
19780 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
19790 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e   the rowid given
197a0 20 62 79 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   by P2..**.** Th
197b0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
197c0 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20   deferred seek. 
197d0 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c   Nothing actuall
197e0 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a  y happens until.
197f0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
19800 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
19810 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61  record.  That wa
19820 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a  y, if no reads.*
19830 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65  * occur, no unne
19840 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70  cessary I/O happ
19850 65 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ens..*/.case OP_
19860 53 65 65 6b 3a 20 7b 20 20 20 20 2f 2a 20 69 6e  Seek: {    /* in
19870 32 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  2 */.  int i = p
19880 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43 75  Op->p1;.  VdbeCu
19890 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73  rsor *pC;..  ass
198a0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
198b0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
198c0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
198d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
198e0 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70 43   );.  if( pC->pC
198f0 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20  ursor!=0 ){.    
19900 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
19910 62 6c 65 20 29 3b 0a 20 20 20 20 70 43 2d 3e 6e  ble );.    pC->n
19920 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ullRow = 0;.    
19930 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
19940 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
19950 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20  tValue(pIn2);.  
19960 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
19970 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  id = 0;.    pC->
19980 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
19990 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
199a0 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f 64 65  .}.  ../* Opcode
199b0 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33  : Found P1 P2 P3
199c0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73   * *.**.** Regis
199d0 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
199e0 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
199f0 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
19a00 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2e 0a  P1 is an index..
19a10 2a 2a 20 49 66 20 61 6e 20 65 6e 74 72 79 20 74  ** If an entry t
19a20 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
19a30 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
19a40 72 20 70 33 20 65 78 69 73 74 73 20 69 6e 20 50  r p3 exists in P
19a50 31 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74  1 then.** jump t
19a60 6f 20 50 32 2e 20 20 49 66 20 74 68 65 20 50 33  o P2.  If the P3
19a70 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
19a80 6d 61 74 63 68 20 61 6e 79 20 65 6e 74 72 79 20  match any entry 
19a90 69 6e 20 50 31 0a 2a 2a 20 74 68 65 6e 20 66 61  in P1.** then fa
19aa0 6c 6c 20 74 68 72 75 2e 20 20 54 68 65 20 50 31  ll thru.  The P1
19ab0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
19ac0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
19ad0 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 0a 2a  matching entry.*
19ae0 2a 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a  * if it exists..
19af0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
19b00 75 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  uction is used t
19b10 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
19b20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 68 65 72  IN operator wher
19b30 65 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 68 61  e the.** left-ha
19b40 6e 64 20 73 69 64 65 20 69 73 20 61 20 53 45 4c  nd side is a SEL
19b50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
19b60 50 31 20 6d 61 79 20 62 65 20 61 20 74 72 75 65  P1 may be a true
19b70 20 69 6e 64 65 78 2c 20 6f 72 20 69 74 0a 2a 2a   index, or it.**
19b80 20 6d 61 79 20 62 65 20 61 20 74 65 6d 70 6f 72   may be a tempor
19b90 61 72 79 20 69 6e 64 65 78 20 74 68 61 74 20 68  ary index that h
19ba0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 73  olds the results
19bb0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   of the SELECT.*
19bc0 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 20 54  * statement.   T
19bd0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
19be0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  is also used to 
19bf0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
19c00 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
19c10 64 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  d in SELECT stat
19c20 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
19c30 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
19c40 68 65 63 6b 73 20 69 66 20 69 6e 64 65 78 20 50  hecks if index P
19c50 31 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 63  1 contains a rec
19c60 6f 72 64 20 66 6f 72 20 77 68 69 63 68 20 0a 2a  ord for which .*
19c70 2a 20 74 68 65 20 66 69 72 73 74 20 4e 20 73 65  * the first N se
19c80 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  rialized values 
19c90 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68  exactly match th
19ca0 65 20 4e 20 73 65 72 69 61 6c 69 7a 65 64 20 76  e N serialized v
19cb0 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  alues.** in the 
19cc0 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
19cd0 65 72 20 50 33 2c 20 77 68 65 72 65 20 4e 20 69  er P3, where N i
19ce0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
19cf0 65 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 0a  er of values in.
19d00 2a 2a 20 74 68 65 20 50 33 20 72 65 63 6f 72 64  ** the P3 record
19d10 20 28 74 68 65 20 50 33 20 72 65 63 6f 72 64 20   (the P3 record 
19d20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
19d30 68 65 20 50 31 20 72 65 63 6f 72 64 29 2e 20 0a  he P1 record). .
19d40 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
19d50 4e 6f 74 46 6f 75 6e 64 2c 20 49 73 55 6e 69 71  NotFound, IsUniq
19d60 75 65 2c 20 4e 6f 74 45 78 69 73 74 73 0a 2a 2f  ue, NotExists.*/
19d70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46  ./* Opcode: NotF
19d80 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20  ound P1 P2 P3 * 
19d90 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  *.**.** Register
19da0 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62   P3 holds a blob
19db0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
19dc0 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 50 31 20  MakeRecord.  P1 
19dd0 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 2e 20  is.** an index. 
19de0 20 49 66 20 6e 6f 20 65 6e 74 72 79 20 65 78 69   If no entry exi
19df0 73 74 73 20 69 6e 20 50 31 20 74 68 61 74 20 6d  sts in P1 that m
19e00 61 74 63 68 65 73 20 74 68 65 20 62 6c 6f 62 20  atches the blob 
19e10 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20  then jump.** to 
19e20 50 32 2e 20 20 49 66 20 61 6e 20 65 6e 74 72 79  P2.  If an entry
19e30 20 64 6f 65 73 20 65 78 69 73 74 69 6e 67 2c 20   does existing, 
19e40 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 54  fall through.  T
19e50 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
19e60 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t.** pointing to
19e70 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
19e80 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  matches..**.** S
19e90 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
19ea0 4e 6f 74 45 78 69 73 74 73 2c 20 49 73 55 6e 69  NotExists, IsUni
19eb0 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  que.*/.case OP_N
19ec0 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20 20 20 2f  otFound:       /
19ed0 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
19ee0 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b 20  ase OP_Found: { 
19ef0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
19f00 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  in3 */.  int i =
19f10 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 6e 74 20   pOp->p1;.  int 
19f20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20  alreadyExists = 
19f30 30 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  0;.  VdbeCursor 
19f40 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20 69  *pC;.  assert( i
19f50 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72  >=0 && i<p->nCur
19f60 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
19f70 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21 3d 30 20   p->apCsr[i]!=0 
19f80 29 3b 0a 20 20 69 66 28 20 28 70 43 20 3d 20 70  );.  if( (pC = p
19f90 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e 70 43 75  ->apCsr[i])->pCu
19fa0 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20 69  rsor!=0 ){.    i
19fb0 6e 74 20 72 65 73 3b 0a 20 20 20 20 55 6e 70 61  nt res;.    Unpa
19fc0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
19fd0 4b 65 79 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  Key;..    assert
19fe0 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  ( pC->isTable==0
19ff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a000 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1a010 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 70 49  M_Blob );.    pI
1a020 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
1a030 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1a040 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 49  pC->pKeyInfo, pI
1a050 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 0a  n3->n, pIn3->z,.
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 20 20 20 61 54 65 6d 70 52 65 63 2c 20        aTempRec, 
1a090 73 69 7a 65 6f 66 28 61 54 65 6d 70 52 65 63 29  sizeof(aTempRec)
1a0a0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
1a0b0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ey==0 ){.      g
1a0c0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
1a0d0 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  }.    if( pOp->o
1a0e0 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20  pcode==OP_Found 
1a0f0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 4b 65 79  ){.      pIdxKey
1a100 2d 3e 66 6c 61 67 73 20 7c 3d 20 55 4e 50 41 43  ->flags |= UNPAC
1a110 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
1a120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1a130 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1a140 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
1a150 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79  pCursor, pIdxKey
1a160 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
1a170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
1a180 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
1a190 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  rd(pIdxKey);.   
1a1a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a1b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  OK ){.      brea
1a1c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 72  k;.    }.    alr
1a1d0 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72 65  eadyExists = (re
1a1e0 73 3d 3d 30 29 3b 0a 20 20 20 20 70 43 2d 3e 64  s==0);.    pC->d
1a1f0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1a200 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1a210 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1a220 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TALE;.  }.  if( 
1a230 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1a240 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 69 66 28  Found ){.    if(
1a250 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29   alreadyExists )
1a260 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
1a270 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1a280 69 66 28 20 21 61 6c 72 65 61 64 79 45 78 69 73  if( !alreadyExis
1a290 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70  ts ) pc = pOp->p
1a2a0 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
1a2b0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1a2c0 3a 20 49 73 55 6e 69 71 75 65 20 50 31 20 50 32  : IsUnique P1 P2
1a2d0 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54   P3 P4 *.**.** T
1a2e0 68 65 20 50 33 20 72 65 67 69 73 74 65 72 20 63  he P3 register c
1a2f0 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67  ontains an integ
1a300 65 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  er record number
1a310 2e 20 20 43 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  .  Call this.** 
1a320 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 52 2e  record number R.
1a330 20 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65    The P4 registe
1a340 72 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  r contains an in
1a350 64 65 78 20 6b 65 79 20 63 72 65 61 74 65 64 0a  dex key created.
1a360 2a 2a 20 75 73 69 6e 67 20 4d 61 6b 65 52 65 63  ** using MakeRec
1a370 6f 72 64 2e 20 20 43 61 6c 6c 20 69 74 20 4b 2e  ord.  Call it K.
1a380 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20  .**.** P1 is an 
1a390 69 6e 64 65 78 2e 20 20 53 6f 20 69 74 20 68 61  index.  So it ha
1a3a0 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 69 74  s no data and it
1a3b0 73 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f  s key consists o
1a3c0 66 20 61 0a 2a 2a 20 72 65 63 6f 72 64 20 67 65  f a.** record ge
1a3d0 6e 65 72 61 74 65 64 20 62 79 20 4f 50 5f 4d 61  nerated by OP_Ma
1a3e0 6b 65 52 65 63 6f 72 64 20 77 68 65 72 65 20 74  keRecord where t
1a3f0 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 73  he last field is
1a400 20 74 68 65 20 0a 2a 2a 20 72 6f 77 69 64 20 6f   the .** rowid o
1a410 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
1a420 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72   the index refer
1a430 73 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  s to..** .** Thi
1a440 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 73  s instruction as
1a450 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
1a460 6e 20 65 6e 74 72 79 20 69 6e 20 50 31 20 77 68  n entry in P1 wh
1a470 65 72 65 20 74 68 65 0a 2a 2a 20 66 69 65 6c 64  ere the.** field
1a480 73 20 6d 61 74 63 68 65 73 20 4b 20 62 75 74 20  s matches K but 
1a490 74 68 65 20 72 6f 77 69 64 20 69 73 20 64 69 66  the rowid is dif
1a4a0 66 65 72 65 6e 74 20 66 72 6f 6d 20 52 2e 0a 2a  ferent from R..*
1a4b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
1a4c0 20 73 75 63 68 20 65 6e 74 72 79 2c 20 74 68 65   such entry, the
1a4d0 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6d  n there is an im
1a4e0 6d 65 64 69 61 74 65 0a 2a 2a 20 6a 75 6d 70 20  mediate.** jump 
1a4f0 74 6f 20 50 32 2e 20 20 49 66 20 61 6e 79 20 65  to P2.  If any e
1a500 6e 74 72 79 20 64 6f 65 73 20 65 78 69 73 74 20  ntry does exist 
1a510 77 68 65 72 65 20 74 68 65 20 69 6e 64 65 78 20  where the index 
1a520 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 74 63 68 65  string.** matche
1a530 73 20 4b 20 62 75 74 20 74 68 65 20 72 65 63 6f  s K but the reco
1a540 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  rd number is not
1a550 20 52 2c 20 74 68 65 6e 20 74 68 65 20 72 65 63   R, then the rec
1a560 6f 72 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  ord.** number fo
1a570 72 20 74 68 61 74 20 65 6e 74 72 79 20 69 73 20  r that entry is 
1a580 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 50 33 20  written into P3 
1a590 61 6e 64 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 66  and control.** f
1a5a0 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74 6f 20  alls through to 
1a5b0 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
1a5c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
1a5d0 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20  also: NotFound, 
1a5e0 4e 6f 74 45 78 69 73 74 73 2c 20 46 6f 75 6e 64  NotExists, Found
1a5f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 55 6e  .*/.case OP_IsUn
1a600 69 71 75 65 3a 20 7b 20 20 20 20 20 20 20 20 2f  ique: {        /
1a610 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20  * jump, in3 */. 
1a620 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
1a630 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
1a640 70 43 78 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pCx;.  BtCursor 
1a650 2a 70 43 72 73 72 3b 0a 20 20 4d 65 6d 20 2a 70  *pCrsr;.  Mem *p
1a660 4b 3b 0a 20 20 69 36 34 20 52 3b 0a 0a 20 20 2f  K;.  i64 R;..  /
1a670 2a 20 50 6f 70 20 74 68 65 20 76 61 6c 75 65 20  * Pop the value 
1a680 52 20 6f 66 66 20 74 68 65 20 74 6f 70 20 6f 66  R off the top of
1a690 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a   the stack.  */.
1a6a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1a6b0 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
1a6c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1a6d0 2d 3e 70 34 2e 69 3e 30 20 26 26 20 70 4f 70 2d  ->p4.i>0 && pOp-
1a6e0 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  >p4.i<=p->nMem )
1a6f0 3b 0a 20 20 70 4b 20 3d 20 26 70 2d 3e 61 4d 65  ;.  pK = &p->aMe
1a700 6d 5b 70 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20 20  m[pOp->p4.i];.  
1a710 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1a720 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b 0a  tegerify(pIn3);.
1a730 20 20 52 20 3d 20 70 49 6e 33 2d 3e 75 2e 69 3b    R = pIn3->u.i;
1a740 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
1a750 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  && i<p->nCursor 
1a760 29 3b 0a 20 20 70 43 78 20 3d 20 70 2d 3e 61 70  );.  pCx = p->ap
1a770 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74  Csr[i];.  assert
1a780 28 20 70 43 78 21 3d 30 20 29 3b 0a 20 20 70 43  ( pCx!=0 );.  pC
1a790 72 73 72 20 3d 20 70 43 78 2d 3e 70 43 75 72 73  rsr = pCx->pCurs
1a7a0 6f 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72 21  or;.  if( pCrsr!
1a7b0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  =0 ){.    int re
1a7c0 73 3b 0a 20 20 20 20 69 36 34 20 76 3b 20 20 20  s;.    i64 v;   
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1a7f0 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 74 63  number that matc
1a800 68 65 73 20 4b 20 2a 2f 0a 20 20 20 20 55 6e 70  hes K */.    Unp
1a810 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
1a820 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
1a830 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 50  ked version of P
1a840 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  4 */..    /* Mak
1a850 65 20 73 75 72 65 20 4b 20 69 73 20 61 20 73 74  e sure K is a st
1a860 72 69 6e 67 20 61 6e 64 20 6d 61 6b 65 20 7a 4b  ring and make zK
1a870 65 79 20 70 6f 69 6e 74 20 74 6f 20 4b 0a 20 20  ey point to K.  
1a880 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1a890 20 70 4b 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d   pK->flags & MEM
1a8a0 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 70 49 64  _Blob );.    pId
1a8b0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
1a8c0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1a8d0 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 4b  Cx->pKeyInfo, pK
1a8e0 2d 3e 6e 2c 20 70 4b 2d 3e 7a 2c 0a 20 20 20 20  ->n, pK->z,.    
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 61 54 65 6d 70 52 65 63 2c 20 73 69 7a 65    aTempRec, size
1a920 6f 66 28 61 54 65 6d 70 52 65 63 29 29 3b 0a 20  of(aTempRec));. 
1a930 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
1a940 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
1a950 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
1a960 20 20 70 49 64 78 4b 65 79 2d 3e 66 6c 61 67 73    pIdxKey->flags
1a970 20 7c 3d 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e   |= UNPACKED_IGN
1a980 4f 52 45 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  ORE_ROWID;..    
1a990 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
1a9a0 20 65 6e 74 72 79 20 69 6e 20 50 31 20 77 68 65   entry in P1 whe
1a9b0 72 65 20 61 6c 6c 20 62 75 74 20 74 68 65 20 6c  re all but the l
1a9c0 61 73 74 20 72 6f 77 69 64 20 6d 61 74 63 68 20  ast rowid match 
1a9d0 4b 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  K.    ** If ther
1a9e0 65 20 69 73 20 6e 6f 20 73 75 63 68 20 65 6e 74  e is no such ent
1a9f0 72 79 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ry, jump immedia
1aa00 74 65 6c 79 20 74 6f 20 50 32 2e 0a 20 20 20 20  tely to P2..    
1aa10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1aa20 43 78 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  Cx->deferredMove
1aa30 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 78  to==0 );.    pCx
1aa40 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
1aa50 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
1aa60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1aa70 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1aa80 28 70 43 72 73 72 2c 20 70 49 64 78 4b 65 79 2c  (pCrsr, pIdxKey,
1aa90 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
1aaa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1aab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1aac0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1aad0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
1aae0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 67 6f 74  xKey);.      got
1aaf0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1ab00 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
1ab10 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
1ab20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1ab30 74 72 65 65 4e 65 78 74 28 70 43 72 73 72 2c 20  treeNext(pCrsr, 
1ab40 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
1ab50 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
1ab60 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
1ab70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ab80 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
1ab90 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65  kedRecord(pIdxKe
1aba0 79 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  y);.        brea
1abb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1abc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1abd0 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
1abe0 72 65 28 70 43 78 2c 20 70 49 64 78 4b 65 79 2c  re(pCx, pIdxKey,
1abf0 20 26 72 65 73 29 3b 20 0a 20 20 20 20 73 71 6c   &res); .    sql
1ac00 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1ac10 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
1ac20 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  xKey);.    if( r
1ac30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1ac40 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1ac50 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  _error;.    if( 
1ac60 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  res>0 ){.      p
1ac70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1ac80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ac90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
1aca0 68 69 73 20 70 6f 69 6e 74 2c 20 70 43 72 73 72  his point, pCrsr
1acb0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1acc0 61 6e 20 65 6e 74 72 79 20 69 6e 20 50 31 20 77  an entry in P1 w
1acd0 68 65 72 65 20 61 6c 6c 20 62 75 74 0a 20 20 20  here all but.   
1ace0 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 65 6e   ** the final en
1acf0 74 72 79 20 28 74 68 65 20 72 6f 77 69 64 29 20  try (the rowid) 
1ad00 6d 61 74 63 68 65 73 20 4b 2e 20 20 43 68 65 63  matches K.  Chec
1ad10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 0a  k to see if the.
1ad20 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 72 6f 77      ** final row
1ad30 69 64 20 63 6f 6c 75 6d 6e 20 69 73 20 64 69 66  id column is dif
1ad40 66 65 72 65 6e 74 20 66 72 6f 6d 20 52 2e 20 20  ferent from R.  
1ad50 49 66 20 69 74 20 65 71 75 61 6c 73 20 52 20 74  If it equals R t
1ad60 68 65 6e 20 6a 75 6d 70 0a 20 20 20 20 2a 2a 20  hen jump.    ** 
1ad70 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
1ad80 32 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  2..    */.    rc
1ad90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
1ada0 78 52 6f 77 69 64 28 70 43 72 73 72 2c 20 26 76  xRowid(pCrsr, &v
1adb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1adc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1add0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
1ade0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
1adf0 0a 20 20 20 20 69 66 28 20 76 3d 3d 52 20 29 7b  .    if( v==R ){
1ae00 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
1ae10 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62  >p2 - 1;.      b
1ae20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ae30 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 76 61   /* The final va
1ae40 72 69 6e 74 20 6f 66 20 74 68 65 20 6b 65 79 20  rint of the key 
1ae50 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
1ae60 6d 20 52 2e 20 20 53 74 6f 72 65 20 69 74 20 62  m R.  Store it b
1ae70 61 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ack.    ** into 
1ae80 72 65 67 69 73 74 65 72 20 52 33 2e 20 20 28 54  register R3.  (T
1ae90 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
1aea0 20 6f 66 20 61 6e 20 65 6e 74 72 79 20 74 68 61   of an entry tha
1aeb0 74 20 76 69 6f 6c 61 74 65 73 0a 20 20 20 20 2a  t violates.    *
1aec0 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  * a UNIQUE const
1aed0 72 61 69 6e 74 2e 29 0a 20 20 20 20 2a 2f 0a 20  raint.).    */. 
1aee0 20 20 20 70 49 6e 33 2d 3e 75 2e 69 20 3d 20 76     pIn3->u.i = v
1aef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1af00 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  n3->flags&MEM_In
1af10 74 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  t );.  }.  break
1af20 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1af30 4e 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20  NotExists P1 P2 
1af40 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  P3 * *.**.** Use
1af50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1af60 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61  register P3 as a
1af70 20 69 6e 74 65 67 65 72 20 6b 65 79 2e 20 20 49   integer key.  I
1af80 66 20 61 20 72 65 63 6f 72 64 20 0a 2a 2a 20 77  f a record .** w
1af90 69 74 68 20 74 68 61 74 20 6b 65 79 20 64 6f 65  ith that key doe
1afa0 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74  s not exist in t
1afb0 61 62 6c 65 20 6f 66 20 50 31 2c 20 74 68 65 6e  able of P1, then
1afc0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a   jump to P2. .**
1afd0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 64   If the record d
1afe0 6f 65 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20  oes exist, then 
1aff0 66 61 6c 6c 20 74 68 72 75 2e 20 20 54 68 65 20  fall thru.  The 
1b000 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 0a  cursor is left .
1b010 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
1b020 68 65 20 72 65 63 6f 72 64 20 69 66 20 69 74 20  he record if it 
1b030 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
1b040 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1b050 77 65 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74  ween this operat
1b060 69 6f 6e 20 61 6e 64 20 4e 6f 74 46 6f 75 6e 64  ion and NotFound
1b070 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
1b080 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 73 75 6d   operation assum
1b090 65 73 20 74 68 65 20 6b 65 79 20 69 73 20 61 6e  es the key is an
1b0a0 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68 61   integer and tha
1b0b0 74 20 50 31 20 69 73 20 61 20 74 61 62 6c 65 20  t P1 is a table 
1b0c0 77 68 65 72 65 61 73 0a 2a 2a 20 4e 6f 74 46 6f  whereas.** NotFo
1b0d0 75 6e 64 20 61 73 73 75 6d 65 73 20 6b 65 79 20  und assumes key 
1b0e0 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72  is a blob constr
1b0f0 75 63 74 65 64 20 66 72 6f 6d 20 4d 61 6b 65 52  ucted from MakeR
1b100 65 63 6f 72 64 20 61 6e 64 0a 2a 2a 20 50 31 20  ecord and.** P1 
1b110 69 73 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a 0a  is an index..**.
1b120 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1b130 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 49 73  nd, NotFound, Is
1b140 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f  Unique.*/.case O
1b150 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20 7b 20 20  P_NotExists: {  
1b160 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
1b170 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  n3 */.  int i = 
1b180 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43  pOp->p1;.  VdbeC
1b190 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
1b1a0 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
1b1b0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
1b1c0 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  i<p->nCursor );.
1b1d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
1b1e0 73 72 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 69 66  sr[i]!=0 );.  if
1b1f0 28 20 28 70 43 72 73 72 20 3d 20 28 70 43 20 3d  ( (pCrsr = (pC =
1b200 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e 70   p->apCsr[i])->p
1b210 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20  Cursor)!=0 ){.  
1b220 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
1b230 20 20 20 75 36 34 20 69 4b 65 79 3b 0a 20 20 20     u64 iKey;.   
1b240 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
1b250 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1b260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1b270 3e 61 70 43 73 72 5b 69 5d 2d 3e 69 73 54 61 62  >apCsr[i]->isTab
1b280 6c 65 20 29 3b 0a 20 20 20 20 69 4b 65 79 20 3d  le );.    iKey =
1b290 20 69 6e 74 54 6f 4b 65 79 28 70 49 6e 33 2d 3e   intToKey(pIn3->
1b2a0 75 2e 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  u.i);.    rc = s
1b2b0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1b2c0 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c  oUnpacked(pCrsr,
1b2d0 20 30 2c 20 69 4b 65 79 2c 20 30 2c 26 72 65 73   0, iKey, 0,&res
1b2e0 29 3b 0a 20 20 20 20 70 43 2d 3e 6c 61 73 74 52  );.    pC->lastR
1b2f0 6f 77 69 64 20 3d 20 70 49 6e 33 2d 3e 75 2e 69  owid = pIn3->u.i
1b300 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49  ;.    pC->rowidI
1b310 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 20  sValid = res==0 
1b320 3f 31 3a 30 3b 0a 20 20 20 20 70 43 2d 3e 6e 75  ?1:0;.    pC->nu
1b330 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70  llRow = 0;.    p
1b340 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
1b350 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
1b360 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a    if( res!=0 ){.
1b370 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e        pc = pOp->
1b380 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  p2 - 1;.      as
1b390 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49  sert( pC->rowidI
1b3a0 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20  sValid==0 );.   
1b3b0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
1b3c0 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20  pC->pseudoTable 
1b3d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
1b3e0 61 70 70 65 6e 73 20 77 68 65 6e 20 61 6e 20 61  appens when an a
1b3f0 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
1b400 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20   read cursor on 
1b410 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69  the .    ** sqli
1b420 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
1b430 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
1b440 4d 50 54 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  MPTY..    */.   
1b450 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
1b460 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 63 20 3d  able );.    pc =
1b470 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
1b480 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f    assert( pC->ro
1b490 77 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b  widIsValid==0 );
1b4a0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
1b4b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75  ./* Opcode: Sequ
1b4c0 65 6e 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a  ence P1 P2 * * *
1b4d0 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  .**.** Find the 
1b4e0 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73  next available s
1b4f0 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 66  equence number f
1b500 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a  or cursor P1..**
1b510 20 57 72 69 74 65 20 74 68 65 20 73 65 71 75 65   Write the seque
1b520 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  nce number into 
1b530 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20  register P2..** 
1b540 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  The sequence num
1b550 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  ber on the curso
1b560 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  r is incremented
1b570 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20 69   after this.** i
1b580 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
1b590 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63  .case OP_Sequenc
1b5a0 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  e: {           /
1b5b0 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
1b5c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  e */.  int i = p
1b5d0 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74  Op->p1;.  assert
1b5e0 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
1b5f0 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
1b600 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21  rt( p->apCsr[i]!
1b610 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  =0 );.  pOut->u.
1b620 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 2d  i = p->apCsr[i]-
1b630 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20 20 4d  >seqCount++;.  M
1b640 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
1b650 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  ut, MEM_Int);.  
1b660 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70  break;.}.../* Op
1b670 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69 64 20 50  code: NewRowid P
1b680 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
1b690 2a 20 47 65 74 20 61 20 6e 65 77 20 69 6e 74 65  * Get a new inte
1b6a0 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  ger record numbe
1b6b0 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77 69 64 22  r (a.k.a "rowid"
1b6c0 29 20 75 73 65 64 20 61 73 20 74 68 65 20 6b 65  ) used as the ke
1b6d0 79 20 74 6f 20 61 20 74 61 62 6c 65 2e 0a 2a 2a  y to a table..**
1b6e0 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
1b6f0 65 72 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f  er is not previo
1b700 75 73 6c 79 20 75 73 65 64 20 61 73 20 61 20 6b  usly used as a k
1b710 65 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ey in the databa
1b720 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74  se.** table that
1b730 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74   cursor P1 point
1b740 73 20 74 6f 2e 20 20 54 68 65 20 6e 65 77 20 72  s to.  The new r
1b750 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20  ecord number is 
1b760 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72 69 74 74  written.** writt
1b770 65 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 50  en to register P
1b780 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 3e 30  2..**.** If P3>0
1b790 20 74 68 65 6e 20 50 33 20 69 73 20 61 20 72 65   then P3 is a re
1b7a0 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
1b7b0 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  s the largest pr
1b7c0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 67 65 6e 65  eviously.** gene
1b7d0 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75 6d  rated record num
1b7e0 62 65 72 2e 20 20 4e 6f 20 6e 65 77 20 72 65 63  ber.  No new rec
1b7f0 6f 72 64 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ord numbers are 
1b800 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 65  allowed to be le
1b810 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 69 73 20  ss.** than this 
1b820 76 61 6c 75 65 2e 20 20 57 68 65 6e 20 74 68 69  value.  When thi
1b830 73 20 76 61 6c 75 65 20 72 65 61 63 68 65 73 20  s value reaches 
1b840 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20 61 20 53  its maximum, a S
1b850 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 65 72  QLITE_FULL.** er
1b860 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64  ror is generated
1b870 2e 20 20 54 68 65 20 50 33 20 72 65 67 69 73 74  .  The P3 regist
1b880 65 72 20 69 73 20 75 70 64 61 74 65 64 20 77 69  er is updated wi
1b890 74 68 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  th the generated
1b8a0 0a 2a 2a 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  .** record numbe
1b8b0 72 2e 20 20 54 68 69 73 20 50 33 20 6d 65 63 68  r.  This P3 mech
1b8c0 61 6e 69 73 6d 20 69 73 20 75 73 65 64 20 74 6f  anism is used to
1b8d0 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e 74 20   help implement 
1b8e0 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e 43 52 45  the.** AUTOINCRE
1b8f0 4d 45 4e 54 20 66 65 61 74 75 72 65 2e 0a 2a 2f  MENT feature..*/
1b900 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69  .case OP_NewRowi
1b910 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  d: {           /
1b920 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
1b930 65 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  e */.  int i = p
1b940 4f 70 2d 3e 70 31 3b 0a 20 20 69 36 34 20 76 20  Op->p1;.  i64 v 
1b950 3d 20 30 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  = 0;.  VdbeCurso
1b960 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28  r *pC;.  assert(
1b970 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43   i>=0 && i<p->nC
1b980 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
1b990 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21 3d  t( p->apCsr[i]!=
1b9a0 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 20 3d  0 );.  if( (pC =
1b9b0 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e 70   p->apCsr[i])->p
1b9c0 43 75 72 73 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  Cursor==0 ){.   
1b9d0 20 2f 2a 20 54 68 65 20 7a 65 72 6f 20 69 6e 69   /* The zero ini
1b9e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 62 6f 76  tialization abov
1b9f0 65 20 69 73 20 61 6c 6c 20 74 68 61 74 20 69 73  e is all that is
1ba00 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 7d 65 6c   needed */.  }el
1ba10 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  se{.    /* The n
1ba20 65 78 74 20 72 6f 77 69 64 20 6f 72 20 72 65 63  ext rowid or rec
1ba30 6f 72 64 20 6e 75 6d 62 65 72 20 28 64 69 66 66  ord number (diff
1ba40 65 72 65 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  erent terms for 
1ba50 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1ba60 74 68 69 6e 67 29 20 69 73 20 6f 62 74 61 69 6e  thing) is obtain
1ba70 65 64 20 69 6e 20 61 20 74 77 6f 2d 73 74 65 70  ed in a two-step
1ba80 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20   algorithm..    
1ba90 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
1baa0 77 65 20 61 74 74 65 6d 70 74 20 74 6f 20 66 69  we attempt to fi
1bab0 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  nd the largest e
1bac0 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20 61 6e  xisting rowid an
1bad0 64 20 61 64 64 20 6f 6e 65 0a 20 20 20 20 2a 2a  d add one.    **
1bae0 20 74 6f 20 74 68 61 74 2e 20 20 42 75 74 20 69   to that.  But i
1baf0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
1bb00 69 73 74 69 6e 67 20 72 6f 77 69 64 20 69 73 20  isting rowid is 
1bb10 61 6c 72 65 61 64 79 20 74 68 65 20 6d 61 78 69  already the maxi
1bb20 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74  mum.    ** posit
1bb30 69 76 65 20 69 6e 74 65 67 65 72 2c 20 77 65 20  ive integer, we 
1bb40 68 61 76 65 20 74 6f 20 66 61 6c 6c 20 74 68 72  have to fall thr
1bb50 6f 75 67 68 20 74 6f 20 74 68 65 20 73 65 63 6f  ough to the seco
1bb60 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  nd.    ** probab
1bb70 69 6c 69 73 74 69 63 20 61 6c 67 6f 72 69 74 68  ilistic algorith
1bb80 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  m.    **.    ** 
1bb90 54 68 65 20 73 65 63 6f 6e 64 20 61 6c 67 6f 72  The second algor
1bba0 69 74 68 6d 20 69 73 20 74 6f 20 73 65 6c 65 63  ithm is to selec
1bbb0 74 20 61 20 72 6f 77 69 64 20 61 74 20 72 61 6e  t a rowid at ran
1bbc0 64 6f 6d 20 61 6e 64 20 73 65 65 20 69 66 0a 20  dom and see if. 
1bbd0 20 20 20 2a 2a 20 69 74 20 61 6c 72 65 61 64 79     ** it already
1bbe0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 74   exists in the t
1bbf0 61 62 6c 65 2e 20 20 49 66 20 69 74 20 64 6f 65  able.  If it doe
1bc00 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77 65 20  s not exist, we 
1bc10 68 61 76 65 0a 20 20 20 20 2a 2a 20 73 75 63 63  have.    ** succ
1bc20 65 65 64 65 64 2e 20 20 49 66 20 74 68 65 20 72  eeded.  If the r
1bc30 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64 6f 65 73  andom rowid does
1bc40 20 65 78 69 73 74 2c 20 77 65 20 73 65 6c 65 63   exist, we selec
1bc50 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20 20 20 20  t a new one.    
1bc60 2a 2a 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ** and try again
1bc70 2c 20 75 70 20 74 6f 20 31 30 30 30 20 74 69 6d  , up to 1000 tim
1bc80 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1bc90 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1bca0 74 68 20 6c 65 73 73 20 74 68 61 6e 20 32 20 62  th less than 2 b
1bcb0 69 6c 6c 69 6f 6e 20 65 6e 74 72 69 65 73 2c 20  illion entries, 
1bcc0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 0a  the probability.
1bcd0 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 20 66 69      ** of not fi
1bce0 6e 64 69 6e 67 20 61 20 75 6e 75 73 65 64 20 72  nding a unused r
1bcf0 6f 77 69 64 20 69 73 20 61 62 6f 75 74 20 31 2e  owid is about 1.
1bd00 30 65 2d 33 30 30 2e 20 20 54 68 69 73 20 69 73  0e-300.  This is
1bd10 20 61 20 0a 20 20 20 20 2a 2a 20 6e 6f 6e 2d 7a   a .    ** non-z
1bd20 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 2c  ero probability,
1bd30 20 62 75 74 20 69 74 20 69 73 20 73 74 69 6c 6c   but it is still
1bd40 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1bd50 6c 6c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ll and should.  
1bd60 20 20 2a 2a 20 6e 65 76 65 72 20 63 61 75 73 65    ** never cause
1bd70 20 61 20 70 72 6f 62 6c 65 6d 2e 20 20 59 6f 75   a problem.  You
1bd80 20 61 72 65 20 6d 75 63 68 2c 20 6d 75 63 68 20   are much, much 
1bd90 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 68  more likely to h
1bda0 61 76 65 20 61 0a 20 20 20 20 2a 2a 20 68 61 72  ave a.    ** har
1bdb0 64 77 61 72 65 20 66 61 69 6c 75 72 65 20 74 68  dware failure th
1bdc0 61 6e 20 66 6f 72 20 74 68 69 73 20 61 6c 67 6f  an for this algo
1bdd0 72 69 74 68 6d 20 74 6f 20 66 61 69 6c 2e 0a 20  rithm to fail.. 
1bde0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1bdf0 20 61 6e 61 6c 79 73 69 73 20 69 6e 20 74 68 65   analysis in the
1be00 20 70 72 65 76 69 6f 75 73 20 70 61 72 61 67 72   previous paragr
1be10 61 70 68 20 61 73 73 75 6d 65 73 20 74 68 61 74  aph assumes that
1be20 20 79 6f 75 20 68 61 76 65 20 61 20 67 6f 6f 64   you have a good
1be30 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 20 6f  .    ** source o
1be40 66 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 73  f random numbers
1be50 2e 20 20 49 73 20 61 20 6c 69 62 72 61 72 79 20  .  Is a library 
1be60 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 6c 72  function like lr
1be70 61 6e 64 34 38 28 29 0a 20 20 20 20 2a 2a 20 67  and48().    ** g
1be80 6f 6f 64 20 65 6e 6f 75 67 68 3f 20 20 4d 61 79  ood enough?  May
1be90 62 65 2e 20 4d 61 79 62 65 20 6e 6f 74 2e 20 49  be. Maybe not. I
1bea0 74 27 73 20 68 61 72 64 20 74 6f 20 6b 6e 6f 77  t's hard to know
1beb0 20 77 68 65 74 68 65 72 20 74 68 65 72 65 0a 20   whether there. 
1bec0 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1bed0 75 62 74 6c 65 20 62 75 67 73 20 69 73 20 73 6f  ubtle bugs is so
1bee0 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  me implementatio
1bef0 6e 73 20 6f 66 20 6c 72 61 6e 64 34 38 28 29 20  ns of lrand48() 
1bf00 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 75 6c  that.    ** coul
1bf10 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
1bf20 2e 20 54 6f 20 61 76 6f 69 64 20 75 6e 63 65 72  . To avoid uncer
1bf30 74 61 69 6e 74 79 2c 20 53 51 4c 69 74 65 20 75  tainty, SQLite u
1bf40 73 65 73 20 69 74 73 20 6f 77 6e 20 0a 20 20 20  ses its own .   
1bf50 20 2a 2a 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65   ** random numbe
1bf60 72 20 67 65 6e 65 72 61 74 6f 72 20 62 61 73 65  r generator base
1bf70 64 20 6f 6e 20 74 68 65 20 52 43 34 20 61 6c 67  d on the RC4 alg
1bf80 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20  orithm..    **. 
1bf90 20 20 20 2a 2a 20 54 6f 20 70 72 6f 6d 6f 74 65     ** To promote
1bfa0 20 6c 6f 63 61 6c 69 74 79 20 6f 66 20 72 65 66   locality of ref
1bfb0 65 72 65 6e 63 65 20 66 6f 72 20 72 65 70 65 74  erence for repet
1bfc0 69 74 69 76 65 20 69 6e 73 65 72 74 73 2c 20 74  itive inserts, t
1bfd0 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
1bfe0 66 65 77 20 61 74 74 65 6d 70 74 73 20 61 74 20  few attempts at 
1bff0 63 68 6f 6f 73 69 6e 67 20 61 20 72 61 6e 64 6f  choosing a rando
1c000 6d 20 72 6f 77 69 64 20 70 69 63 6b 20 76 61 6c  m rowid pick val
1c010 75 65 73 20 6a 75 73 74 20 61 20 6c 69 74 74 6c  ues just a littl
1c020 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 20  e.    ** larger 
1c030 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
1c040 73 20 72 6f 77 69 64 2e 20 20 54 68 69 73 20 68  s rowid.  This h
1c050 61 73 20 62 65 65 6e 20 73 68 6f 77 6e 20 65 78  as been shown ex
1c060 70 65 72 69 6d 65 6e 74 61 6c 6c 79 0a 20 20 20  perimentally.   
1c070 20 2a 2a 20 74 6f 20 64 6f 75 62 6c 65 20 74 68   ** to double th
1c080 65 20 73 70 65 65 64 20 6f 66 20 74 68 65 20 43  e speed of the C
1c090 4f 50 59 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  OPY operation.. 
1c0a0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65     */.    int re
1c0b0 73 3d 30 2c 20 72 78 3d 53 51 4c 49 54 45 5f 4f  s=0, rx=SQLITE_O
1c0c0 4b 2c 20 63 6e 74 3b 0a 20 20 20 20 69 36 34 20  K, cnt;.    i64 
1c0d0 78 3b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  x;.    cnt = 0;.
1c0e0 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
1c0f0 42 74 72 65 65 46 6c 61 67 73 28 70 43 2d 3e 70  BtreeFlags(pC->p
1c100 43 75 72 73 6f 72 29 26 28 42 54 52 45 45 5f 49  Cursor)&(BTREE_I
1c110 4e 54 4b 45 59 7c 42 54 52 45 45 5f 5a 45 52 4f  NTKEY|BTREE_ZERO
1c120 44 41 54 41 29 29 20 21 3d 0a 20 20 20 20 20 20  DATA)) !=.      
1c130 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
1c140 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c160 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  PT;.      goto a
1c170 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1c180 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
1c190 65 72 74 28 20 28 73 71 6c 69 74 65 33 42 74 72  ert( (sqlite3Btr
1c1a0 65 65 46 6c 61 67 73 28 70 43 2d 3e 70 43 75 72  eeFlags(pC->pCur
1c1b0 73 6f 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54  sor) & BTREE_INT
1c1c0 4b 45 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  KEY)!=0 );.    a
1c1d0 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 42  ssert( (sqlite3B
1c1e0 74 72 65 65 46 6c 61 67 73 28 70 43 2d 3e 70 43  treeFlags(pC->pC
1c1f0 75 72 73 6f 72 29 20 26 20 42 54 52 45 45 5f 5a  ursor) & BTREE_Z
1c200 45 52 4f 44 41 54 41 29 3d 3d 30 20 29 3b 0a 0a  ERODATA)==0 );..
1c210 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33 32  #ifdef SQLITE_32
1c220 42 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64 65  BIT_ROWID.#   de
1c230 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 30  fine MAX_ROWID 0
1c240 78 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65 0a  x7fffffff.#else.
1c250 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70      /* Some comp
1c260 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61  ilers complain a
1c270 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f  bout constants o
1c280 66 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66 66  f the form 0x7ff
1c290 66 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a 20  fffffffffffff.. 
1c2a0 20 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d     ** Others com
1c2b0 70 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37 66  plain about 0x7f
1c2c0 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 4c  fffffffffffffffL
1c2d0 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  L.  The followin
1c2e0 67 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20 20  g macro seems.  
1c2f0 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65 20    ** to provide 
1c300 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  the constant whi
1c310 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f  le making all co
1c320 6d 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a 20  mpilers happy.. 
1c330 20 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65     */.#   define
1c340 20 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36 34   MAX_ROWID  (i64
1c350 29 28 20 28 28 28 75 36 34 29 30 78 37 66 66 66  )( (((u64)0x7fff
1c360 66 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75 36  ffff)<<32) | (u6
1c370 34 29 30 78 66 66 66 66 66 66 66 66 20 29 0a 23  4)0xffffffff ).#
1c380 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 21  endif..    if( !
1c390 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
1c3a0 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  id ){.      if( 
1c3b0 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 56 61 6c  pC->nextRowidVal
1c3c0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  id ){.        v 
1c3d0 3d 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 3b  = pC->nextRowid;
1c3e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c3f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c400 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e  e3BtreeLast(pC->
1c410 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
1c420 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1c430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c440 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
1c450 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1c460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c470 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
1c480 20 20 20 20 20 20 20 76 20 3d 20 31 3b 0a 20 20         v = 1;.  
1c490 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1c4b0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70  reeKeySize(pC->p
1c4c0 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20  Cursor, &v);.   
1c4d0 20 20 20 20 20 20 20 76 20 3d 20 6b 65 79 54 6f         v = keyTo
1c4e0 49 6e 74 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Int(v);.        
1c4f0 20 20 69 66 28 20 76 3d 3d 4d 41 58 5f 52 4f 57    if( v==MAX_ROW
1c500 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
1c510 20 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52    pC->useRandomR
1c520 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
1c530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c540 20 20 20 20 20 20 20 76 2b 2b 3b 0a 20 20 20 20         v++;.    
1c550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c560 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 6e 64  }.      }..#ifnd
1c570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c580 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
1c590 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29     if( pOp->p3 )
1c5a0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70  {.        Mem *p
1c5b0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Mem;.        ass
1c5c0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
1c5d0 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
1c5e0 65 6d 20 29 3b 20 2f 2a 20 50 33 20 69 73 20 61  em ); /* P3 is a
1c5f0 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65   valid memory ce
1c600 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  ll */.        pM
1c610 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  em = &p->aMem[pO
1c620 70 2d 3e 70 33 5d 3b 0a 09 52 45 47 49 53 54 45  p->p3];..REGISTE
1c630 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
1c640 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
1c650 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c660 74 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a  tegerify(pMem);.
1c670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c680 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1c690 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 20 20 2f  EM_Int)!=0 );  /
1c6a0 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c 64 73 20  * mem(P3) holds 
1c6b0 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1c6c0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
1c6d0 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49 44 20 7c  u.i==MAX_ROWID |
1c6e0 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  | pC->useRandomR
1c6f0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
1c700 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1c710 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LL;.          go
1c720 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1c730 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d  error;.        }
1c740 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 70  .        if( v<p
1c750 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20  Mem->u.i+1 ){.  
1c760 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d          v = pMem
1c770 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20  ->u.i + 1;.     
1c780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65     }.        pMe
1c790 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20  m->u.i = v;.    
1c7a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1c7b0 20 20 69 66 28 20 76 3c 4d 41 58 5f 52 4f 57 49    if( v<MAX_ROWI
1c7c0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 2d  D ){.        pC-
1c7d0 3e 6e 65 78 74 52 6f 77 69 64 56 61 6c 69 64 20  >nextRowidValid 
1c7e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  = 1;.        pC-
1c7f0 3e 6e 65 78 74 52 6f 77 69 64 20 3d 20 76 2b 31  >nextRowid = v+1
1c800 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c810 20 20 20 20 20 20 20 70 43 2d 3e 6e 65 78 74 52         pC->nextR
1c820 6f 77 69 64 56 61 6c 69 64 20 3d 20 30 3b 0a 20  owidValid = 0;. 
1c830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c840 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64   if( pC->useRand
1c850 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  omRowid ){.     
1c860 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
1c870 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 51 4c 49 54  ==0 );  /* SQLIT
1c880 45 5f 46 55 4c 4c 20 6d 75 73 74 20 68 61 76 65  E_FULL must have
1c890 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
1c8a0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 20 20 20  to this */.     
1c8b0 20 76 20 3d 20 64 62 2d 3e 70 72 69 6f 72 4e 65   v = db->priorNe
1c8c0 77 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6e  wRowid;.      cn
1c8d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 7b  t = 0;.      do{
1c8e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74  .        if( cnt
1c8f0 3d 3d 30 20 26 26 20 28 76 26 30 78 66 66 66 66  ==0 && (v&0xffff
1c900 66 66 29 3d 3d 76 20 29 7b 0a 20 20 20 20 20 20  ff)==v ){.      
1c910 20 20 20 20 76 2b 2b 3b 0a 20 20 20 20 20 20 20      v++;.       
1c920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c930 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
1c940 6e 65 73 73 28 73 69 7a 65 6f 66 28 76 29 2c 20  ness(sizeof(v), 
1c950 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  &v);.          i
1c960 66 28 20 63 6e 74 3c 35 20 29 20 76 20 26 3d 20  f( cnt<5 ) v &= 
1c970 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20 20 20  0xffffff;.      
1c980 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1c990 76 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  v==0 ) continue;
1c9a0 0a 20 20 20 20 20 20 20 20 78 20 3d 20 69 6e 74  .        x = int
1c9b0 54 6f 4b 65 79 28 76 29 3b 0a 20 20 20 20 20 20  ToKey(v);.      
1c9c0 20 20 72 78 20 3d 20 73 71 6c 69 74 65 33 42 74    rx = sqlite3Bt
1c9d0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1c9e0 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  d(pC->pCursor, 0
1c9f0 2c 20 28 75 36 34 29 78 2c 20 30 2c 20 26 72 65  , (u64)x, 0, &re
1ca00 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b  s);.        cnt+
1ca10 2b 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  +;.      }while(
1ca20 20 63 6e 74 3c 31 30 30 20 26 26 20 72 78 3d 3d   cnt<100 && rx==
1ca30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
1ca40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62 2d  ==0 );.      db-
1ca50 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d  >priorNewRowid =
1ca60 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 72 78   v;.      if( rx
1ca70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
1ca80 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1ca90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1caa0 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
1cab0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1cac0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  or;.      }.    
1cad0 7d 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49  }.    pC->rowidI
1cae0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  sValid = 0;.    
1caf0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
1cb00 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e  to = 0;.    pC->
1cb10 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
1cb20 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20  CHE_STALE;.  }. 
1cb30 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
1cb40 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
1cb50 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b    pOut->u.i = v;
1cb60 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1cb70 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 20 50  Opcode: Insert P
1cb80 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
1cb90 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
1cba0 72 79 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ry into the tabl
1cbb0 65 20 6f 66 20 63 75 72 73 6f 72 20 50 31 2e 20  e of cursor P1. 
1cbc0 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 0a   A new entry is.
1cbd0 2a 2a 20 63 72 65 61 74 65 64 20 69 66 20 69 74  ** created if it
1cbe0 20 64 6f 65 73 6e 27 74 20 61 6c 72 65 61 64 79   doesn't already
1cbf0 20 65 78 69 73 74 20 6f 72 20 74 68 65 20 64 61   exist or the da
1cc00 74 61 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ta for an existi
1cc10 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20 6f  ng.** entry is o
1cc20 76 65 72 77 72 69 74 74 65 6e 2e 20 20 54 68 65  verwritten.  The
1cc30 20 64 61 74 61 20 69 73 20 74 68 65 20 76 61 6c   data is the val
1cc40 75 65 20 73 74 6f 72 65 64 20 72 65 67 69 73 74  ue stored regist
1cc50 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32 2e  er.** number P2.
1cc60 20 54 68 65 20 6b 65 79 20 69 73 20 73 74 6f 72   The key is stor
1cc70 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
1cc80 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73 74 0a  3. The key must.
1cc90 2a 2a 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ** be an integer
1cca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
1ccb0 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c  PFLAG_NCHANGE fl
1ccc0 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
1ccd0 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68   then the row ch
1cce0 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a  ange count is.**
1ccf0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74   incremented (ot
1cd00 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20 49  herwise not).  I
1cd10 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41 53  f the OPFLAG_LAS
1cd20 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20 50  TROWID flag of P
1cd30 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  5 is set,.** the
1cd40 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72 65  n rowid is store
1cd50 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  d for subsequent
1cd60 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a 2a   return by the.*
1cd70 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  * sqlite3_last_i
1cd80 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75  nsert_rowid() fu
1cd90 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69 73  nction (otherwis
1cda0 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66 69  e it is unmodifi
1cdb0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ed)..**.** Param
1cdc0 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e  eter P4 may poin
1cdd0 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  t to a string co
1cde0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1cdf0 6c 65 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20 6d  le-name, or.** m
1ce00 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  ay be NULL. If i
1ce10 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
1ce20 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68  hen the update-h
1ce30 6f 6f 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 65 33  ook .** (sqlite3
1ce40 2e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  .xUpdateCallback
1ce50 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f 6c  ) is invoked fol
1ce60 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73  lowing a success
1ce70 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a  ful insert..**.*
1ce80 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a  * (WARNING/TODO:
1ce90 20 49 66 20 50 31 20 69 73 20 61 20 70 73 65 75   If P1 is a pseu
1cea0 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32  do-cursor and P2
1ceb0 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
1cec0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68  ** allocated, th
1ced0 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  en ownership of 
1cee0 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 72 65  P2 is transferre
1cef0 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d  d to the pseudo-
1cf00 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65  cursor.** and re
1cf10 67 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65  gister P2 become
1cf20 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66  s ephemeral.  If
1cf30 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63   the cursor is c
1cf40 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76  hanged, the.** v
1cf50 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
1cf60 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68   P2 will then ch
1cf70 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ange.  Make sure
1cf80 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a   this does not.*
1cf90 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  * cause any prob
1cfa0 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  lems.).**.** Thi
1cfb0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
1cfc0 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c  ly works on tabl
1cfd0 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c  es.  The equival
1cfe0 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ent instruction.
1cff0 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69  ** for indices i
1d000 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a  s OP_IdxInsert..
1d010 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  */.case OP_Inser
1d020 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61 74  t: {.  Mem *pDat
1d030 61 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  a = &p->aMem[pOp
1d040 2d 3e 70 32 5d 3b 0a 20 20 4d 65 6d 20 2a 70 4b  ->p2];.  Mem *pK
1d050 65 79 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  ey = &p->aMem[pO
1d060 70 2d 3e 70 33 5d 3b 0a 0a 20 20 69 36 34 20 69  p->p3];..  i64 i
1d070 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  Key;   /* The in
1d080 74 65 67 65 72 20 52 4f 57 49 44 20 6f 72 20 6b  teger ROWID or k
1d090 65 79 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ey for the recor
1d0a0 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  d to be inserted
1d0b0 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f   */.  int i = pO
1d0c0 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43 75 72  p->p1;.  VdbeCur
1d0d0 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72  sor *pC;.  asser
1d0e0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
1d0f0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
1d100 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
1d110 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
1d120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1d130 70 43 75 72 73 6f 72 21 3d 30 20 7c 7c 20 70 43  pCursor!=0 || pC
1d140 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29 3b  ->pseudoTable );
1d150 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 2d  .  assert( pKey-
1d160 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1d170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d180 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 52  ->isTable );.  R
1d190 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
1d1a0 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a 20  p->p2, pData);. 
1d1b0 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
1d1c0 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a  pOp->p3, pKey);.
1d1d0 0a 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f 4b  .  iKey = intToK
1d1e0 65 79 28 70 4b 65 79 2d 3e 75 2e 69 29 3b 0a 20  ey(pKey->u.i);. 
1d1f0 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f   if( pOp->p5 & O
1d200 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20  PFLAG_NCHANGE ) 
1d210 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
1d220 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
1d230 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 29  FLAG_LASTROWID )
1d240 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   db->lastRowid =
1d250 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 69 66   pKey->u.i;.  if
1d260 28 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 56  ( pC->nextRowidV
1d270 61 6c 69 64 20 26 26 20 70 4b 65 79 2d 3e 75 2e  alid && pKey->u.
1d280 69 3e 3d 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64  i>=pC->nextRowid
1d290 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 65 78 74   ){.    pC->next
1d2a0 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 30 3b 0a  RowidValid = 0;.
1d2b0 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 2d    }.  if( pData-
1d2c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
1d2d0 6c 20 29 7b 0a 20 20 20 20 70 44 61 74 61 2d 3e  l ){.    pData->
1d2e0 7a 20 3d 20 30 3b 0a 20 20 20 20 70 44 61 74 61  z = 0;.    pData
1d2f0 2d 3e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ->n = 0;.  }else
1d300 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
1d310 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  ata->flags & (ME
1d320 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20  M_Blob|MEM_Str) 
1d330 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 2d  );.  }.  if( pC-
1d340 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a  >pseudoTable ){.
1d350 20 20 20 20 69 66 28 20 21 70 43 2d 3e 65 70 68      if( !pC->eph
1d360 65 6d 50 73 65 75 64 6f 54 61 62 6c 65 20 29 7b  emPseudoTable ){
1d370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1d380 46 72 65 65 28 64 62 2c 20 70 43 2d 3e 70 44 61  Free(db, pC->pDa
1d390 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ta);.    }.    p
1d3a0 43 2d 3e 69 4b 65 79 20 3d 20 69 4b 65 79 3b 0a  C->iKey = iKey;.
1d3b0 20 20 20 20 70 43 2d 3e 6e 44 61 74 61 20 3d 20      pC->nData = 
1d3c0 70 44 61 74 61 2d 3e 6e 3b 0a 20 20 20 20 69 66  pData->n;.    if
1d3d0 28 20 70 44 61 74 61 2d 3e 7a 3d 3d 70 44 61 74  ( pData->z==pDat
1d3e0 61 2d 3e 7a 4d 61 6c 6c 6f 63 20 7c 7c 20 70 43  a->zMalloc || pC
1d3f0 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62  ->ephemPseudoTab
1d400 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d 3e  le ){.      pC->
1d410 70 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e 7a  pData = pData->z
1d420 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 2d  ;.      if( !pC-
1d430 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62 6c  >ephemPseudoTabl
1d440 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 61  e ){.        pDa
1d450 74 61 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45  ta->flags &= ~ME
1d460 4d 5f 44 79 6e 3b 0a 20 20 20 20 20 20 20 20 70  M_Dyn;.        p
1d470 44 61 74 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  Data->flags |= M
1d480 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
1d490 20 20 70 44 61 74 61 2d 3e 7a 4d 61 6c 6c 6f 63    pData->zMalloc
1d4a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d4c0 43 2d 3e 70 44 61 74 61 20 3d 20 73 71 6c 69 74  C->pData = sqlit
1d4d0 65 33 4d 61 6c 6c 6f 63 28 20 70 43 2d 3e 6e 44  e3Malloc( pC->nD
1d4e0 61 74 61 2b 32 20 29 3b 0a 20 20 20 20 20 20 69  ata+2 );.      i
1d4f0 66 28 20 21 70 43 2d 3e 70 44 61 74 61 20 29 20  f( !pC->pData ) 
1d500 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
1d510 20 20 20 6d 65 6d 63 70 79 28 70 43 2d 3e 70 44     memcpy(pC->pD
1d520 61 74 61 2c 20 70 44 61 74 61 2d 3e 7a 2c 20 70  ata, pData->z, p
1d530 43 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  C->nData);.     
1d540 20 70 43 2d 3e 70 44 61 74 61 5b 70 43 2d 3e 6e   pC->pData[pC->n
1d550 44 61 74 61 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Data] = 0;.     
1d560 20 70 43 2d 3e 70 44 61 74 61 5b 70 43 2d 3e 6e   pC->pData[pC->n
1d570 44 61 74 61 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  Data+1] = 0;.   
1d580 20 7d 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52   }.    pC->nullR
1d590 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
1d5a0 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 0a  .    int nZero;.
1d5b0 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66      if( pData->f
1d5c0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1d5d0 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 3d  ){.      nZero =
1d5e0 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b   pData->u.nZero;
1d5f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d600 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20    nZero = 0;.   
1d610 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1d620 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
1d630 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 69  C->pCursor, 0, i
1d640 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 70 44 61 74 61 2d 3e 7a 2c 20 70 44 61 74 61   pData->z, pData
1d670 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c 0a 20 20 20 20  ->n, nZero,.    
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 35 20          pOp->p5 
1d6a0 26 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  & OPFLAG_APPEND)
1d6b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 43 2d 3e 72  ;.  }.  .  pC->r
1d6c0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b  owidIsValid = 0;
1d6d0 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  .  pC->deferredM
1d6e0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d  oveto = 0;.  pC-
1d6f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
1d700 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f  ACHE_STALE;..  /
1d710 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64  * Invoke the upd
1d720 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75  ate-hook if requ
1d730 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ired. */.  if( r
1d740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d750 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
1d760 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ack && pOp->p4.z
1d770 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1d780 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1d790 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  b[pC->iDb].zName
1d7a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1d7b0 20 2a 7a 54 62 6c 20 3d 20 70 4f 70 2d 3e 70 34   *zTbl = pOp->p4
1d7c0 2e 7a 3b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  .z;.    int op =
1d7d0 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46   ((pOp->p5 & OPF
1d7e0 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f 20  LAG_ISUPDATE) ? 
1d7f0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a 20  SQLITE_UPDATE : 
1d800 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b 0a  SQLITE_INSERT);.
1d810 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
1d820 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 64  isTable );.    d
1d830 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
1d840 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72  ck(db->pUpdateAr
1d850 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c  g, op, zDb, zTbl
1d860 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73  , iKey);.    ass
1d870 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
1d880 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
1d890 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
1d8a0 6c 65 74 65 20 50 31 20 50 32 20 2a 20 50 34 20  lete P1 P2 * P4 
1d8b0 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  *.**.** Delete t
1d8c0 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69  he record at whi
1d8d0 63 68 20 74 68 65 20 50 31 20 63 75 72 73 6f 72  ch the P1 cursor
1d8e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1d8f0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
1d900 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  e cursor will be
1d910 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1d920 74 20 65 69 74 68 65 72 20 74 68 65 20 6e 65 78  t either the nex
1d930 74 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75  t or the previou
1d940 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20 74  s.** record in t
1d950 68 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  he table. If it 
1d960 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1d970 20 61 74 20 74 68 65 20 6e 65 78 74 20 72 65 63   at the next rec
1d980 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ord, then.** the
1d990 20 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74 72   next Next instr
1d9a0 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  uction will be a
1d9b0 20 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20 69   no-op.  Hence i
1d9c0 74 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65 74  t is OK to delet
1d9d0 65 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66 72  e.** a record fr
1d9e0 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65 78  om within an Nex
1d9f0 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  t loop..**.** If
1da00 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
1da10 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20 69  NGE flag of P2 i
1da20 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
1da30 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
1da40 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   is.** increment
1da50 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f  ed (otherwise no
1da60 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73  t)..**.** P1 mus
1da70 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d  t not be pseudo-
1da80 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74  table.  It has t
1da90 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c  o be a real tabl
1daa0 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70  e with.** multip
1dab0 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49  le rows..**.** I
1dac0 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f P4 is not NULL
1dad0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1dae0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1daf0 6c 65 20 74 68 61 74 20 50 31 20 69 73 0a 2a 2a  le that P1 is.**
1db00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
1db10 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 77  he update hook w
1db20 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20  ill be invoked, 
1db30 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a  if it exists..**
1db40 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55   If P4 is not NU
1db50 4c 4c 20 74 68 65 6e 20 74 68 65 20 50 31 20 63  LL then the P1 c
1db60 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1db70 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 0a  been positioned.
1db80 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46  ** using OP_NotF
1db90 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e  ound prior to in
1dba0 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f  voking this opco
1dbb0 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  de..*/.case OP_D
1dbc0 65 6c 65 74 65 3a 20 7b 0a 20 20 69 6e 74 20 69  elete: {.  int i
1dbd0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 36   = pOp->p1;.  i6
1dbe0 34 20 69 4b 65 79 20 3d 20 30 3b 0a 20 20 56 64  4 iKey = 0;.  Vd
1dbf0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20  beCursor *pC;.. 
1dc00 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
1dc10 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b   i<p->nCursor );
1dc20 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1dc30 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [i];.  assert( p
1dc40 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
1dc50 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30  ( pC->pCursor!=0
1dc60 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 76 61 6c   );  /* Only val
1dc70 69 64 20 66 6f 72 20 72 65 61 6c 20 74 61 62 6c  id for real tabl
1dc80 65 73 2c 20 6e 6f 20 70 73 65 75 64 6f 74 61 62  es, no pseudotab
1dc90 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  les */..  /* If 
1dca0 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
1dcb0 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c  will be invoked,
1dcc0 20 73 65 74 20 69 4b 65 79 20 74 6f 20 74 68 65   set iKey to the
1dcd0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 0a 20 20   rowid of the.  
1dce0 2a 2a 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c  ** row being del
1dcf0 65 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eted..  */.  if(
1dd00 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
1dd10 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e  back && pOp->p4.
1dd20 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
1dd30 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
1dd40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
1dd50 72 6f 77 69 64 49 73 56 61 6c 69 64 20 29 3b 20  rowidIsValid ); 
1dd60 20 2f 2a 20 6c 61 73 74 52 6f 77 69 64 20 73 65   /* lastRowid se
1dd70 74 20 62 79 20 70 72 65 76 69 6f 75 73 20 4f 50  t by previous OP
1dd80 5f 4e 6f 74 46 6f 75 6e 64 20 2a 2f 0a 20 20 20  _NotFound */.   
1dd90 20 69 4b 65 79 20 3d 20 70 43 2d 3e 6c 61 73 74   iKey = pC->last
1dda0 52 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 72 63  Rowid;.  }..  rc
1ddb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1ddc0 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a  rsorMoveto(pC);.
1ddd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1dde0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1ddf0 6f 72 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  or;.  rc = sqlit
1de00 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
1de10 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43  ->pCursor);.  pC
1de20 2d 3e 6e 65 78 74 52 6f 77 69 64 56 61 6c 69 64  ->nextRowidValid
1de30 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68   = 0;.  pC->cach
1de40 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
1de50 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76  STALE;..  /* Inv
1de60 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68  oke the update-h
1de70 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e  ook if required.
1de80 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1de90 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78  LITE_OK && db->x
1dea0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
1deb0 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  & pOp->p4.z ){. 
1dec0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1ded0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d  Db = db->aDb[pC-
1dee0 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
1def0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
1df00 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  l = pOp->p4.z;. 
1df10 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61     db->xUpdateCa
1df20 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61  llback(db->pUpda
1df30 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44 45  teArg, SQLITE_DE
1df40 4c 45 54 45 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  LETE, zDb, zTbl,
1df50 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73 73 65   iKey);.    asse
1df60 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
1df70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1df80 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  >p2 & OPFLAG_NCH
1df90 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67  ANGE ) p->nChang
1dfa0 65 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  e++;.  break;.}.
1dfb0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65  ./* Opcode: Rese
1dfc0 74 43 6f 75 6e 74 20 50 31 20 2a 20 2a 0a 2a 2a  tCount P1 * *.**
1dfd0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1dfe0 72 65 73 65 74 73 20 74 68 65 20 56 4d 73 20 69  resets the VMs i
1dff0 6e 74 65 72 6e 61 6c 20 63 68 61 6e 67 65 20 63  nternal change c
1e000 6f 75 6e 74 65 72 20 74 6f 20 30 2e 20 49 66 20  ounter to 0. If 
1e010 50 31 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  P1 is true,.** t
1e020 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1e030 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1e040 74 65 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f  ter is copied to
1e050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1e060 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63  ndle.** change c
1e070 6f 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64  ounter (returned
1e080 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
1e090 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
1e0a0 63 68 61 6e 67 65 73 28 29 29 0a 2a 2a 20 62 65  changes()).** be
1e0b0 66 6f 72 65 20 69 74 20 69 73 20 72 65 73 65 74  fore it is reset
1e0c0 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
1e0d0 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
1e0e0 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ms..*/.case OP_R
1e0f0 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 69  esetCount: {.  i
1e100 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  f( pOp->p1 ){.  
1e110 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
1e120 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
1e130 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 70  Change);.  }.  p
1e140 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
1e150 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1e160 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20 50 31  code: RowData P1
1e170 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
1e180 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
1e190 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d 70 6c  ter P2 the compl
1e1a0 65 74 65 20 72 6f 77 20 64 61 74 61 20 66 6f 72  ete row data for
1e1b0 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54   cursor P1..** T
1e1c0 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72  here is no inter
1e1d0 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  pretation of the
1e1e0 20 64 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69   data.  .** It i
1e1f0 73 20 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e  s just copied on
1e200 74 6f 20 74 68 65 20 50 32 20 72 65 67 69 73 74  to the P2 regist
1e210 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a  er exactly as .*
1e220 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e  * it is found in
1e230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e240 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
1e250 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P1 cursor must 
1e260 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  be pointing to a
1e270 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20   valid row (not 
1e280 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f  a NULL row).** o
1e290 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20  f a real table, 
1e2a0 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62  not a pseudo-tab
1e2b0 6c 65 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  le..*/./* Opcode
1e2c0 3a 20 52 6f 77 4b 65 79 20 50 31 20 50 32 20 2a  : RowKey P1 P2 *
1e2d0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
1e2e0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
1e2f0 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  2 the complete r
1e300 6f 77 20 6b 65 79 20 66 6f 72 20 63 75 72 73 6f  ow key for curso
1e310 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69  r P1..** There i
1e320 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74  s no interpretat
1e330 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e  ion of the data.
1e340 20 20 0a 2a 2a 20 54 68 65 20 6b 65 79 20 69 73    .** The key is
1e350 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65   copied onto the
1e360 20 50 33 20 72 65 67 69 73 74 65 72 20 65 78 61   P3 register exa
1e370 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69  ctly as .** it i
1e380 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
1e390 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1e3a0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75  .** If the P1 cu
1e3b0 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69  rsor must be poi
1e3c0 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
1e3d0 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c   row (not a NULL
1e3e0 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65   row).** of a re
1e3f0 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
1e400 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f  pseudo-table..*/
1e410 0a 63 61 73 65 20 4f 50 5f 52 6f 77 4b 65 79 3a  .case OP_RowKey:
1e420 0a 63 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61  .case OP_RowData
1e430 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f  : {.  int i = pO
1e440 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43 75 72  p->p1;.  VdbeCur
1e450 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
1e460 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75 33  sor *pCrsr;.  u3
1e470 32 20 6e 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26  2 n;..  pOut = &
1e480 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  p->aMem[pOp->p2]
1e490 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
1e4a0 74 20 52 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77  t RowKey and Row
1e4b0 44 61 74 61 20 61 72 65 20 72 65 61 6c 6c 79 20  Data are really 
1e4c0 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
1e4d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
1e4e0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
1e4f0 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  & i<p->nCursor )
1e500 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1e510 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r[i];.  assert( 
1e520 70 43 2d 3e 69 73 54 61 62 6c 65 20 7c 7c 20 70  pC->isTable || p
1e530 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
1e540 6f 77 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  owKey );.  asser
1e550 74 28 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 7c  t( pC->isIndex |
1e560 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
1e570 50 5f 52 6f 77 44 61 74 61 20 29 3b 0a 20 20 61  P_RowData );.  a
1e580 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
1e590 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75    assert( pC->nu
1e5a0 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  llRow==0 );.  as
1e5b0 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64 6f  sert( pC->pseudo
1e5c0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73  Table==0 );.  as
1e5d0 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f  sert( pC->pCurso
1e5e0 72 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20  r!=0 );.  pCrsr 
1e5f0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
1e600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1e610 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43  eCursorMoveto(pC
1e620 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
1e630 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1e640 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 43 2d  error;.  if( pC-
1e650 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  >isIndex ){.    
1e660 69 36 34 20 6e 36 34 3b 0a 20 20 20 20 61 73 73  i64 n64;.    ass
1e670 65 72 74 28 20 21 70 43 2d 3e 69 73 54 61 62 6c  ert( !pC->isTabl
1e680 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
1e690 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 72  BtreeKeySize(pCr
1e6a0 73 72 2c 20 26 6e 36 34 29 3b 0a 20 20 20 20 69  sr, &n64);.    i
1e6b0 66 28 20 6e 36 34 3e 64 62 2d 3e 61 4c 69 6d 69  f( n64>db->aLimi
1e6c0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
1e6d0 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20 20  ENGTH] ){.      
1e6e0 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
1e6f0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74    }.    n = (int
1e700 29 6e 36 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )n64;.  }else{. 
1e710 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
1e720 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26  ataSize(pCrsr, &
1e730 6e 29 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  n);.    if( (int
1e740 29 6e 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  )n>db->aLimit[SQ
1e750 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
1e760 48 5d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  H] ){.      goto
1e770 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a   too_big;.    }.
1e780 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1e790 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
1e7a0 74 2c 20 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20  t, n, 0) ){.    
1e7b0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
1e7c0 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 6e 3b 0a  .  pOut->n = n;.
1e7d0 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
1e7e0 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c 6f 62 29  (pOut, MEM_Blob)
1e7f0 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e  ;.  if( pC->isIn
1e800 64 65 78 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dex ){.    rc = 
1e810 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
1e820 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75  pCrsr, 0, n, pOu
1e830 74 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t->z);.  }else{.
1e840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e850 42 74 72 65 65 44 61 74 61 28 70 43 72 73 72 2c  BtreeData(pCrsr,
1e860 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b   0, n, pOut->z);
1e870 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63  .  }.  pOut->enc
1e880 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 20   = SQLITE_UTF8; 
1e890 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65 20   /* In case the 
1e8a0 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63 61 73  blob is ever cas
1e8b0 74 20 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 55  t to text */.  U
1e8c0 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
1e8d0 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
1e8e0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1e8f0 20 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a   Rowid P1 P2 * *
1e900 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69   *.**.** Store i
1e910 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  n register P2 an
1e920 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1e930 73 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  s the key of the
1e940 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74 68 61   table entry tha
1e950 74 0a 2a 2a 20 50 31 20 69 73 20 63 75 72 72 65  t.** P1 is curre
1e960 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a  ntly point to..*
1e970 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a  /.case OP_Rowid:
1e980 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1e990 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
1e9a0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lease */.  int i
1e9b0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64   = pOp->p1;.  Vd
1e9c0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
1e9d0 69 36 34 20 76 3b 0a 0a 20 20 61 73 73 65 72 74  i64 v;..  assert
1e9e0 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
1e9f0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
1ea00 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
1ea10 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
1ea20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
1ea30 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
1ea40 70 43 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  pC);.  if( rc ) 
1ea50 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1ea60 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  o_error;.  if( p
1ea70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1ea80 29 7b 0a 20 20 20 20 76 20 3d 20 70 43 2d 3e 6c  ){.    v = pC->l
1ea90 61 73 74 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73  astRowid;.  }els
1eaa0 65 20 69 66 28 20 70 43 2d 3e 70 73 65 75 64 6f  e if( pC->pseudo
1eab0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 76 20 3d  Table ){.    v =
1eac0 20 6b 65 79 54 6f 49 6e 74 28 70 43 2d 3e 69 4b   keyToInt(pC->iK
1ead0 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ey);.  }else if(
1eae0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
1eaf0 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 74 68 65      /* Leave the
1eb00 20 72 6f 77 69 64 20 73 65 74 20 74 6f 20 61 20   rowid set to a 
1eb10 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 62 72 65 61  NULL */.    brea
1eb20 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1eb30 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
1eb40 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  sor!=0 );.    sq
1eb50 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1eb60 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  e(pC->pCursor, &
1eb70 76 29 3b 0a 20 20 20 20 76 20 3d 20 6b 65 79 54  v);.    v = keyT
1eb80 6f 49 6e 74 28 76 29 3b 0a 20 20 7d 0a 20 20 70  oInt(v);.  }.  p
1eb90 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Out->u.i = v;.  
1eba0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
1ebb0 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
1ebc0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1ebd0 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31  code: NullRow P1
1ebe0 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d   * * * *.**.** M
1ebf0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 50  ove the cursor P
1ec00 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e  1 to a null row.
1ec10 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20    Any OP_Column 
1ec20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68  operations.** th
1ec30 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74  at occur while t
1ec40 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20  he cursor is on 
1ec50 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c  the null row wil
1ec60 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74  l always.** writ
1ec70 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  e a NULL..*/.cas
1ec80 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a  e OP_NullRow: {.
1ec90 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
1eca0 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  1;.  VdbeCursor 
1ecb0 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *pC;..  assert( 
1ecc0 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75  i>=0 && i<p->nCu
1ecd0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
1ece0 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73  ->apCsr[i];.  as
1ecf0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
1ed00 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
1ed10 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56  ;.  pC->rowidIsV
1ed20 61 6c 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  alid = 0;.  if( 
1ed30 70 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  pC->pCursor ){. 
1ed40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1ed50 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 70  learCursor(pC->p
1ed60 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62  Cursor);.  }.  b
1ed70 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1ed80 64 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a  de: Last P1 P2 *
1ed90 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   * *.**.** The n
1eda0 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52  ext use of the R
1edb0 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f  owid or Column o
1edc0 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  r Next instructi
1edd0 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69  on for P1 .** wi
1ede0 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ll refer to the 
1edf0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1ee00 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
1ee10 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66   or index..** If
1ee20 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1ee30 64 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64  dex is empty and
1ee40 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70   P2>0, then jump
1ee50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
1ee60 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  P2..** If P2 is 
1ee70 30 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  0 or if the tabl
1ee80 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f  e or index is no
1ee90 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68  t empty, fall th
1eea0 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
1eeb0 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75  following instru
1eec0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ction..*/.case O
1eed0 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Last: {       
1eee0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e   /* jump */.  in
1eef0 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  t i = pOp->p1;. 
1ef00 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1ef10 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
1ef20 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  sr;.  int res;..
1ef30 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
1ef40 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  & i<p->nCursor )
1ef50 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1ef60 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  r[i];.  assert( 
1ef70 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72  pC!=0 );.  pCrsr
1ef80 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
1ef90 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72 21    assert( pCrsr!
1efa0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
1efb0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43  ite3BtreeLast(pC
1efc0 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 70 43  rsr, &res);.  pC
1efd0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29  ->nullRow = (u8)
1efe0 72 65 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  res;.  pC->defer
1eff0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
1f000 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1f010 64 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63  d = 0;.  pC->cac
1f020 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
1f030 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 72 65  _STALE;.  if( re
1f040 73 20 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20 29  s && pOp->p2>0 )
1f050 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
1f060 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
1f070 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f  eak;.}.../* Opco
1f080 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a  de: Sort P1 P2 *
1f090 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   * *.**.** This 
1f0a0 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63  opcode does exac
1f0b0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74 68 69  tly the same thi
1f0c0 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20  ng as OP_Rewind 
1f0d0 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69  except that.** i
1f0e0 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20  t increments an 
1f0f0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f  undocumented glo
1f100 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65  bal variable use
1f110 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
1f120 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20  *.** Sorting is 
1f130 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20  accomplished by 
1f140 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20  writing records 
1f150 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
1f160 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ndex,.** then re
1f170 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64  winding that ind
1f180 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69  ex and playing i
1f190 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69  t back from begi
1f1a0 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e  nning to.** end.
1f1b0 20 20 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f    We use the OP_
1f1c0 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74  Sort opcode inst
1f1d0 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64  ead of OP_Rewind
1f1e0 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65   to do the.** re
1f1f0 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20  winding so that 
1f200 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1f210 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72  ble will be incr
1f220 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72  emented and.** r
1f230 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
1f240 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68  can determine wh
1f250 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1f260 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a   optimizer is.**
1f270 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d   correctly optim
1f280 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e  izing out sorts.
1f290 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
1f2a0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
1f2b0 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  mp */.#ifdef SQL
1f2c0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
1f2d0 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b  e3_sort_count++;
1f2e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
1f2f0 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69  h_count--;.#endi
1f300 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  f.  p->aCounter[
1f310 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1f320 53 5f 53 4f 52 54 2d 31 5d 2b 2b 3b 0a 20 20 2f  S_SORT-1]++;.  /
1f330 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
1f340 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f  nto OP_Rewind */
1f350 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  .}./* Opcode: Re
1f360 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  wind P1 P2 * * *
1f370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
1f380 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
1f390 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65   or Column or Ne
1f3a0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  xt instruction f
1f3b0 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
1f3c0 65 66 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  efer to the firs
1f3d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1f3e0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
1f3f0 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68   index..** If th
1f400 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1f410 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32   is empty and P2
1f420 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d  >0, then jump im
1f430 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
1f440 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f  .** If P2 is 0 o
1f450 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  r if the table o
1f460 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65  r index is not e
1f470 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75  mpty, fall throu
1f480 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
1f490 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
1f4a0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  on..*/.case OP_R
1f4b0 65 77 69 6e 64 3a 20 7b 20 20 20 20 20 20 20 20  ewind: {        
1f4c0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74  /* jump */.  int
1f4d0 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
1f4e0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1f4f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
1f500 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  r;.  int res;.. 
1f510 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
1f520 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b   i<p->nCursor );
1f530 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1f540 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [i];.  assert( p
1f550 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  C!=0 );.  if( (p
1f560 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
1f570 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  or)!=0 ){.    rc
1f580 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
1f590 69 72 73 74 28 70 43 72 73 72 2c 20 26 72 65 73  irst(pCrsr, &res
1f5a0 29 3b 0a 20 20 20 20 70 43 2d 3e 61 74 46 69 72  );.    pC->atFir
1f5b0 73 74 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30  st = res==0 ?1:0
1f5c0 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  ;.    pC->deferr
1f5d0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
1f5e0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1f5f0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1f600 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  .    pC->rowidIs
1f610 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Valid = 0;.  }el
1f620 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b  se{.    res = 1;
1f630 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  .  }.  pC->nullR
1f640 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20  ow = (u8)res;.  
1f650 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
1f660 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e  0 && pOp->p2<p->
1f670 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 72 65 73  nOp );.  if( res
1f680 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
1f690 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
1f6a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1f6b0 6f 64 65 3a 20 4e 65 78 74 20 50 31 20 50 32 20  ode: Next P1 P2 
1f6c0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61  * * *.**.** Adva
1f6d0 6e 63 65 20 63 75 72 73 6f 72 20 50 31 20 73 6f  nce cursor P1 so
1f6e0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1f6f0 74 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79 2f  to the next key/
1f700 64 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73  data pair in its
1f710 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
1f720 65 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ex.  If there ar
1f730 65 20 6e 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61  e no more key/va
1f740 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e 20 66  lue pairs then f
1f750 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  all through.** t
1f760 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
1f770 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75  instruction.  Bu
1f780 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
1f790 61 64 76 61 6e 63 65 20 77 61 73 20 73 75 63 63  advance was succ
1f7a0 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20  essful,.** jump 
1f7b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
1f7c0 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20  2..**.** The P1 
1f7d0 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66  cursor must be f
1f7e0 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  or a real table,
1f7f0 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
1f800 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ble..**.** See a
1f810 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a 20  lso: Prev.*/./* 
1f820 4f 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20  Opcode: Prev P1 
1f830 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42  P2 * * *.**.** B
1f840 61 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31  ack up cursor P1
1f850 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1f860 74 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ts to the previo
1f870 75 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72  us key/data pair
1f880 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65   in its.** table
1f890 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74   or index.  If t
1f8a0 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69  here is no previ
1f8b0 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61  ous key/value pa
1f8c0 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68  irs then fall th
1f8d0 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
1f8e0 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75  following instru
1f8f0 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74  ction.  But if t
1f900 68 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70  he cursor backup
1f910 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
1f920 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  .** jump immedia
1f930 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  tely to P2..**.*
1f940 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20  * The P1 cursor 
1f950 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20 72 65  must be for a re
1f960 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
1f970 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f  pseudo-table..*/
1f980 0a 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20  .case OP_Prev:  
1f990 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
1f9a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a  */.case OP_Next:
1f9b0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
1f9c0 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
1f9d0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
1f9e0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
1f9f0 72 65 73 3b 0a 0a 20 20 43 48 45 43 4b 5f 46 4f  res;..  CHECK_FO
1fa00 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 61  R_INTERRUPT;.  a
1fa10 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1fa20 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1fa30 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
1fa40 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1fa50 70 31 5d 3b 0a 20 20 69 66 28 20 70 43 3d 3d 30  p1];.  if( pC==0
1fa60 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 20 20   ){.    break;  
1fa70 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 23 32  /* See ticket #2
1fa80 32 37 33 20 2a 2f 0a 20 20 7d 0a 20 20 70 43 72  273 */.  }.  pCr
1fa90 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
1faa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73  ;.  assert( pCrs
1fab0 72 20 29 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a  r );.  res = 1;.
1fac0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
1fad0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
1fae0 29 3b 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e 6f  );.  rc = pOp->o
1faf0 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 3f  pcode==OP_Next ?
1fb00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1fb10 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 20 3a  t(pCrsr, &res) :
1fb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1fb40 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1fb50 6f 75 73 28 70 43 72 73 72 2c 20 26 72 65 73 29  ous(pCrsr, &res)
1fb60 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
1fb70 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d  = (u8)res;.  pC-
1fb80 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
1fb90 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
1fba0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1fbb0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
1fbc0 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
1fbd0 35 20 29 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b  5 ) p->aCounter[
1fbe0 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b 3b 0a 23 69  pOp->p5-1]++;.#i
1fbf0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1fc00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
1fc10 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
1fc20 64 69 66 0a 20 20 7d 0a 20 20 70 43 2d 3e 72 6f  dif.  }.  pC->ro
1fc30 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
1fc40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1fc50 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72 74  pcode: IdxInsert
1fc60 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1fc70 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32 20  .** Register P2 
1fc80 68 6f 6c 64 73 20 61 20 53 51 4c 20 69 6e 64 65  holds a SQL inde
1fc90 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67  x key made using
1fca0 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f   the.** MakeReco
1fcb0 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  rd instructions.
1fcc0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72    This opcode wr
1fcd0 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a  ites that key.**
1fce0 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20   into the index 
1fcf0 50 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68  P1.  Data for th
1fd00 65 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a  e entry is nil..
1fd10 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 61 20 66 6c  **.** P3 is a fl
1fd20 61 67 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  ag that provides
1fd30 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62   a hint to the b
1fd40 2d 74 72 65 65 20 6c 61 79 65 72 20 74 68 61 74  -tree layer that
1fd50 20 74 68 69 73 0a 2a 2a 20 69 6e 73 65 72 74 20   this.** insert 
1fd60 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20  is likely to be 
1fd70 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a  an append..**.**
1fd80 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
1fd90 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  n only works for
1fda0 20 69 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65   indices.  The e
1fdb0 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75  quivalent instru
1fdc0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62  ction.** for tab
1fdd0 6c 65 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74  les is OP_Insert
1fde0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  ..*/.case OP_Idx
1fdf0 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20  Insert: {       
1fe00 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 69 6e 74   /* in2 */.  int
1fe10 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
1fe20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1fe30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
1fe40 72 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  r;.  assert( i>=
1fe50 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
1fe60 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1fe70 2d 3e 61 70 43 73 72 5b 69 5d 21 3d 30 20 29 3b  ->apCsr[i]!=0 );
1fe80 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d  .  assert( pIn2-
1fe90 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
1fea0 62 20 29 3b 0a 20 20 69 66 28 20 28 70 43 72 73  b );.  if( (pCrs
1feb0 72 20 3d 20 28 70 43 20 3d 20 70 2d 3e 61 70 43  r = (pC = p->apC
1fec0 73 72 5b 69 5d 29 2d 3e 70 43 75 72 73 6f 72 29  sr[i])->pCursor)
1fed0 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
1fee0 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d  t( pC->isTable==
1fef0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78  0 );.    rc = Ex
1ff00 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a  pandBlob(pIn2);.
1ff10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ff20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1ff30 6e 74 20 6e 4b 65 79 20 3d 20 70 49 6e 32 2d 3e  nt nKey = pIn2->
1ff40 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
1ff50 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 49 6e 32  har *zKey = pIn2
1ff60 2d 3e 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ->z;.      rc = 
1ff70 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1ff80 72 74 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20  rt(pCrsr, zKey, 
1ff90 6e 4b 65 79 2c 20 22 22 2c 20 30 2c 20 30 2c 20  nKey, "", 0, 0, 
1ffa0 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  pOp->p3);.      
1ffb0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
1ffc0 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
1ffd0 0a 20 20 20 20 20 20 70 43 2d 3e 63 61 63 68 65  .      pC->cache
1ffe0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1fff0 54 41 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TALE;.    }.  }.
20000 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
20010 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65  pcode: IdxDelete
20020 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
20030 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
20040 6f 66 20 50 33 20 72 65 67 69 73 74 65 72 73 20  of P3 registers 
20050 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 69  starting at regi
20060 73 74 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20  ster P2 form.** 
20070 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
20080 78 20 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f  x key. This opco
20090 64 65 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20  de removes that 
200a0 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a  entry from the .
200b0 2a 2a 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20  ** index opened 
200c0 62 79 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f  by cursor P1..*/
200d0 0a 63 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65  .case OP_IdxDele
200e0 74 65 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  te: {.  int i = 
200f0 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43  pOp->p1;.  VdbeC
20100 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
20110 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
20120 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
20130 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20140 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
20150 3e 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e  >p2+pOp->p3<=p->
20160 6e 4d 65 6d 2b 31 20 29 3b 0a 20 20 61 73 73 65  nMem+1 );.  asse
20170 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
20180 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
20190 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
201a0 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ]!=0 );.  if( (p
201b0 43 72 73 72 20 3d 20 28 70 43 20 3d 20 70 2d 3e  Crsr = (pC = p->
201c0 61 70 43 73 72 5b 69 5d 29 2d 3e 70 43 75 72 73  apCsr[i])->pCurs
201d0 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  or)!=0 ){.    in
201e0 74 20 72 65 73 3b 0a 20 20 20 20 55 6e 70 61 63  t res;.    Unpac
201f0 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 20  kedRecord r;.   
20200 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
20210 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  ->pKeyInfo;.    
20220 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
20230 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e 66  pOp->p3;.    r.f
20240 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 2e  lags = 0;.    r.
20250 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  aMem = &p->aMem[
20260 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 72 63  pOp->p2];.    rc
20270 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
20280 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
20290 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26  rsr, &r, 0, 0, &
202a0 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  res);.    if( rc
202b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
202c0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
202d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
202e0 44 65 6c 65 74 65 28 70 43 72 73 72 29 3b 0a 20  Delete(pCrsr);. 
202f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20300 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
20310 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43  eto==0 );.    pC
20320 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
20330 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
20340 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
20350 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f 77 69 64  Opcode: IdxRowid
20360 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
20370 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65  ** Write into re
20380 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e 74  gister P2 an int
20390 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
203a0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
203b0 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a 2a  the record at.**
203c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
203d0 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74 65  index key pointe
203e0 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20 50  d to by cursor P
203f0 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65 72  1.  This integer
20400 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74 68   should be.** th
20410 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 74  e rowid of the t
20420 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77 68  able entry to wh
20430 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20 65  ich this index e
20440 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a 0a  ntry points..**.
20450 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f 77  ** See also: Row
20460 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e 0a  id, MakeRecord..
20470 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 52 6f  */.case OP_IdxRo
20480 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20  wid: {          
20490 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
204a0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
204b0 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 42  i = pOp->p1;.  B
204c0 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
204d0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
204e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
204f0 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
20500 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
20510 2d 3e 61 70 43 73 72 5b 69 5d 21 3d 30 20 29 3b  ->apCsr[i]!=0 );
20520 0a 20 20 69 66 28 20 28 70 43 72 73 72 20 3d 20  .  if( (pCrsr = 
20530 28 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  (pC = p->apCsr[i
20540 5d 29 2d 3e 70 43 75 72 73 6f 72 29 21 3d 30 20  ])->pCursor)!=0 
20550 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64  ){.    i64 rowid
20560 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
20570 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
20580 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  o==0 );.    asse
20590 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
205a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  =0 );.    if( !p
205b0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  C->nullRow ){.  
205c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
205d0 56 64 62 65 49 64 78 52 6f 77 69 64 28 70 43 72  VdbeIdxRowid(pCr
205e0 73 72 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  sr, &rowid);.   
205f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20610 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
20620 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
20630 0a 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70  .      MemSetTyp
20640 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
20650 49 6e 74 29 3b 0a 20 20 20 20 20 20 70 4f 75 74  Int);.      pOut
20660 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20  ->u.i = rowid;. 
20670 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
20680 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
20690 49 64 78 47 45 20 50 31 20 50 32 20 50 33 20 50  IdxGE P1 P2 P3 P
206a0 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  4 P5.**.** The P
206b0 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
206c0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
206d0 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
206e0 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
206f0 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
20700 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  e ROWID.  Compar
20710 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
20720 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
20730 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69  ex .** that P1 i
20740 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
20750 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
20760 67 20 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74  g the ROWID on t
20770 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a  he P1 index..**.
20780 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e 64  ** If the P1 ind
20790 65 78 20 65 6e 74 72 79 20 69 73 20 67 72 65 61  ex entry is grea
207a0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
207b0 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
207c0 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70 20  ue.** then jump 
207d0 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69 73  to P2.  Otherwis
207e0 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  e fall through t
207f0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
20800 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  uction..**.** If
20810 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20   P5 is non-zero 
20820 74 68 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  then the key val
20830 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20  ue is increased 
20840 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20 0a 2a  by an epsilon .*
20850 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  * prior to the c
20860 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73  omparison.  This
20870 20 6d 61 6b 65 20 74 68 65 20 6f 70 63 6f 64 65   make the opcode
20880 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 47 54   work like IdxGT
20890 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
208a0 69 66 20 74 68 65 20 6b 65 79 20 66 72 6f 6d 20  if the key from 
208b0 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61  register P3 is a
208c0 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b   prefix of the k
208d0 65 79 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72  ey in the cursor
208e0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
208f0 69 73 20 66 61 6c 73 65 20 77 68 65 72 65 61 73  is false whereas
20900 20 69 74 20 77 6f 75 6c 64 20 62 65 20 74 72 75   it would be tru
20910 65 20 77 69 74 68 20 49 64 78 47 54 2e 0a 2a 2f  e with IdxGT..*/
20920 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 4c  ./* Opcode: IdxL
20930 54 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  T P1 P2 P3 * P5.
20940 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67  **.** The P4 reg
20950 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67  ister values beg
20960 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66  inning with P3 f
20970 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  orm an unpacked 
20980 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68  index .** key th
20990 61 74 20 6f 6d 69 74 73 20 74 68 65 20 52 4f 57  at omits the ROW
209a0 49 44 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69  ID.  Compare thi
209b0 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69  s key value agai
209c0 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a  nst the index .*
209d0 2a 20 74 68 61 74 20 50 31 20 69 73 20 63 75 72  * that P1 is cur
209e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
209f0 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65  to, ignoring the
20a00 20 52 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31   ROWID on the P1
20a10 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66   index..**.** If
20a20 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e   the P1 index en
20a30 74 72 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  try is less than
20a40 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
20a50 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
20a60 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
20a70 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
20a80 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
20a90 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  n..**.** If P5 i
20aa0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
20ab0 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 69 73  the key value is
20ac0 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 61 6e   increased by an
20ad0 20 65 70 73 69 6c 6f 6e 20 70 72 69 6f 72 20 0a   epsilon prior .
20ae0 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ** to the compar
20af0 69 73 6f 6e 2e 20 20 54 68 69 73 20 6d 61 6b 65  ison.  This make
20b00 73 20 74 68 65 20 6f 70 63 6f 64 65 20 77 6f 72  s the opcode wor
20b10 6b 20 6c 69 6b 65 20 49 64 78 4c 45 2e 0a 2a 2f  k like IdxLE..*/
20b20 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 54 3a 20  .case OP_IdxLT: 
20b30 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
20b40 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
20b50 5f 49 64 78 47 45 3a 20 7b 20 20 20 20 20 20 20  _IdxGE: {       
20b60 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
20b70 0a 20 20 69 6e 74 20 69 3d 20 70 4f 70 2d 3e 70  .  int i= pOp->p
20b80 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  1;.  VdbeCursor 
20b90 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *pC;..  assert( 
20ba0 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75  i>=0 && i<p->nCu
20bb0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
20bc0 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21 3d 30  ( p->apCsr[i]!=0
20bd0 20 29 3b 0a 20 20 69 66 28 20 28 70 43 20 3d 20   );.  if( (pC = 
20be0 70 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e 70 43  p->apCsr[i])->pC
20bf0 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20  ursor!=0 ){.    
20c00 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 55 6e 70  int res;.    Unp
20c10 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20  ackedRecord r;. 
20c20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64     assert( pC->d
20c30 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
20c40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20c50 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f  pOp->p5==0 || pO
20c60 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 20 20  p->p5==1 );.    
20c70 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
20c80 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
20c90 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
20ca0 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
20cb0 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
20cc0 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  u16)pOp->p4.i;. 
20cd0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29     if( pOp->p5 )
20ce0 7b 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20  {.      r.flags 
20cf0 3d 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  = UNPACKED_INCRK
20d00 45 59 20 7c 20 55 4e 50 41 43 4b 45 44 5f 49 47  EY | UNPACKED_IG
20d10 4e 4f 52 45 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NORE_ROWID;.    
20d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 2e 66  }else{.      r.f
20d30 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
20d40 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b 0a 20 20  IGNORE_ROWID;.  
20d50 20 20 7d 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d    }.    r.aMem =
20d60 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
20d70 33 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  3];.    rc = sql
20d80 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
20d90 6d 70 61 72 65 28 70 43 2c 20 26 72 2c 20 26 72  mpare(pC, &r, &r
20da0 65 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  es);.    if( pOp
20db0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78  ->opcode==OP_Idx
20dc0 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  LT ){.      res 
20dd0 3d 20 2d 72 65 73 3b 0a 20 20 20 20 7d 65 6c 73  = -res;.    }els
20de0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
20df0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
20e00 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20  _IdxGE );.      
20e10 72 65 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  res++;.    }.   
20e20 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
20e30 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
20e40 20 2d 20 31 20 3b 0a 20 20 20 20 7d 0a 20 20 7d   - 1 ;.    }.  }
20e50 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
20e60 4f 70 63 6f 64 65 3a 20 44 65 73 74 72 6f 79 20  Opcode: Destroy 
20e70 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
20e80 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
20e90 69 72 65 20 64 61 74 61 62 61 73 65 20 74 61 62  ire database tab
20ea0 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
20eb0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  e root page in t
20ec0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
20ed0 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  ile is given by 
20ee0 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  P1..**.** The ta
20ef0 62 6c 65 20 62 65 69 6e 67 20 64 65 73 74 72 6f  ble being destro
20f00 79 65 64 20 69 73 20 69 6e 20 74 68 65 20 6d 61  yed is in the ma
20f10 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
20f20 20 69 66 20 50 33 3d 3d 30 2e 20 20 49 66 0a 2a   if P3==0.  If.*
20f30 2a 20 50 33 3d 3d 31 20 74 68 65 6e 20 74 68 65  * P3==1 then the
20f40 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65   table to be cle
20f50 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78  ar is in the aux
20f60 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
20f70 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20  file.** that is 
20f80 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61  used to store ta
20f90 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e  bles create usin
20fa0 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
20fb0 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  RY TABLE..**.** 
20fc0 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
20fd0 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 69 74   enabled then it
20fe0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
20ff0 74 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 20 70  t another root p
21000 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  age.** might be 
21010 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 6e  moved into the n
21020 65 77 6c 79 20 64 65 6c 65 74 65 64 20 72 6f 6f  ewly deleted roo
21030 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20  t page in order 
21040 74 6f 20 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20 72  to keep all.** r
21050 6f 6f 74 20 70 61 67 65 73 20 63 6f 6e 74 69 67  oot pages contig
21060 75 6f 75 73 20 61 74 20 74 68 65 20 62 65 67 69  uous at the begi
21070 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
21080 61 62 61 73 65 2e 20 20 54 68 65 20 66 6f 72 6d  abase.  The form
21090 65 72 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  er.** value of t
210a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 74 68 61  he root page tha
210b0 74 20 6d 6f 76 65 64 20 2d 20 69 74 73 20 76 61  t moved - its va
210c0 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20 6d  lue before the m
210d0 6f 76 65 20 6f 63 63 75 72 72 65 64 20 2d 0a 2a  ove occurred -.*
210e0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  * is stored in r
210f0 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20  egister P2.  If 
21100 6e 6f 20 70 61 67 65 20 0a 2a 2a 20 6d 6f 76 65  no page .** move
21110 6d 65 6e 74 20 77 61 73 20 72 65 71 75 69 72 65  ment was require
21120 64 20 28 62 65 63 61 75 73 65 20 74 68 65 20 74  d (because the t
21130 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
21140 65 64 20 77 61 73 20 61 6c 72 65 61 64 79 20 0a  ed was already .
21150 2a 2a 20 74 68 65 20 6c 61 73 74 20 6f 6e 65 20  ** the last one 
21160 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 29  in the database)
21170 20 74 68 65 6e 20 61 20 7a 65 72 6f 20 69 73 20   then a zero is 
21180 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
21190 65 72 20 50 32 2e 0a 2a 2a 20 49 66 20 41 55 54  er P2..** If AUT
211a0 4f 56 41 43 55 55 4d 20 69 73 20 64 69 73 61 62  OVACUUM is disab
211b0 6c 65 64 20 74 68 65 6e 20 61 20 7a 65 72 6f 20  led then a zero 
211c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
211d0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
211e0 53 65 65 20 61 6c 73 6f 3a 20 43 6c 65 61 72 0a  See also: Clear.
211f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 73 74 72  */.case OP_Destr
21200 6f 79 3a 20 7b 20 20 20 20 20 2f 2a 20 6f 75 74  oy: {     /* out
21210 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
21220 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a 20 20    int iMoved;.  
21230 69 6e 74 20 69 43 6e 74 3b 0a 23 69 66 6e 64 65  int iCnt;.#ifnde
21240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
21250 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 56 64 62  RTUALTABLE.  Vdb
21260 65 20 2a 70 56 64 62 65 3b 0a 20 20 69 43 6e 74  e *pVdbe;.  iCnt
21270 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56 64 62   = 0;.  for(pVdb
21280 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56 64  e=db->pVdbe; pVd
21290 62 65 3b 20 70 56 64 62 65 3d 70 56 64 62 65 2d  be; pVdbe=pVdbe-
212a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
212b0 20 70 56 64 62 65 2d 3e 6d 61 67 69 63 3d 3d 56   pVdbe->magic==V
212c0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
212d0 20 70 56 64 62 65 2d 3e 69 6e 56 74 61 62 4d 65   pVdbe->inVtabMe
212e0 74 68 6f 64 3c 32 20 26 26 20 70 56 64 62 65 2d  thod<2 && pVdbe-
212f0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
21300 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iCnt++;.    }.  
21310 7d 0a 23 65 6c 73 65 0a 20 20 69 43 6e 74 20 3d  }.#else.  iCnt =
21320 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
21330 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  nt;.#endif.  if(
21340 20 69 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 72   iCnt>1 ){.    r
21350 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
21360 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  D;.    p->errorA
21370 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
21380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
21390 6e 74 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33  nt iDb = pOp->p3
213a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  ;.    assert( iC
213b0 6e 74 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  nt==1 );.    ass
213c0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
213d0 73 6b 20 26 20 28 31 3c 3c 69 44 62 29 29 21 3d  sk & (1<<iDb))!=
213e0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
213f0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
21400 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ble(db->aDb[iDb]
21410 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26  .pBt, pOp->p1, &
21420 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 4d 65 6d  iMoved);.    Mem
21430 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
21440 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20  , MEM_Int);.    
21450 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76  pOut->u.i = iMov
21460 65 64 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ed;.#ifndef SQLI
21470 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21480 55 4d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  UM.    if( rc==S
21490 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4d 6f 76  QLITE_OK && iMov
214a0 65 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ed!=0 ){.      s
214b0 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
214c0 76 65 64 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  ved(&db->aDb[iDb
214d0 5d 2c 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e  ], iMoved, pOp->
214e0 70 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p1);.    }.#endi
214f0 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  f.  }.  break;.}
21500 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65  ../* Opcode: Cle
21510 61 72 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a  ar P1 P2 P3.**.*
21520 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e  * Delete all con
21530 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
21540 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
21550 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20  ndex whose root 
21560 70 61 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  page.** in the d
21570 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
21580 67 69 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75  given by P1.  Bu
21590 74 2c 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f  t, unlike Destro
215a0 79 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d  y, do not.** rem
215b0 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72  ove the table or
215c0 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
215d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
215e0 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
215f0 65 69 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e  eing clear is in
21600 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
21610 73 65 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30  se file if P2==0
21620 2e 20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74  .  If.** P2==1 t
21630 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f  hen the table to
21640 20 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20   be clear is in 
21650 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
21660 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74  tabase file.** t
21670 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  hat is used to s
21680 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61  tore tables crea
21690 74 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20  te using CREATE 
216a0 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e  TEMPORARY TABLE.
216b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33  .**.** If the P3
216c0 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
216d0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62  ro, then the tab
216e0 6c 65 20 72 65 66 65 72 65 64 20 74 6f 20 6d 75  le refered to mu
216f0 73 74 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  st be an.** intk
21700 65 79 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c  ey table (an SQL
21710 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69   table, not an i
21720 6e 64 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63  ndex). In this c
21730 61 73 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e  ase the row chan
21740 67 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20  ge .** count is 
21750 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
21760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
21770 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62  s in the table b
21780 65 69 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  eing cleared. .*
21790 2a 20 49 66 20 50 33 20 69 73 20 67 72 65 61 74  * If P3 is great
217a0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
217b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  en the value sto
217c0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
217d0 50 33 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e  P3 is.** also in
217e0 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
217f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
21800 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  in the table bei
21810 6e 67 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  ng cleared..**.*
21820 2a 20 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74  * See also: Dest
21830 72 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  roy.*/.case OP_C
21840 6c 65 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43  lear: {.  int nC
21850 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 61 73 73  hange = 0;.  ass
21860 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
21870 73 6b 20 26 20 28 31 3c 3c 70 4f 70 2d 3e 70 32  sk & (1<<pOp->p2
21880 29 29 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  ))!=0 );.  rc = 
21890 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
218a0 72 54 61 62 6c 65 28 0a 20 20 20 20 20 20 64 62  rTable(.      db
218b0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70  ->aDb[pOp->p2].p
218c0 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f  Bt, pOp->p1, (pO
218d0 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67 65  p->p3 ? &nChange
218e0 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28   : 0).  );.  if(
218f0 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20   pOp->p3 ){.    
21900 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43  p->nChange += nC
21910 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70  hange;.    if( p
21920 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20  Op->p3>0 ){.    
21930 20 20 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70    p->aMem[pOp->p
21940 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67  3].u.i += nChang
21950 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  e;.    }.  }.  b
21960 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
21970 64 65 3a 20 43 72 65 61 74 65 54 61 62 6c 65 20  de: CreateTable 
21980 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
21990 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
219a0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
219b0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
219c0 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20   if P1==0 or in 
219d0 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  the.** auxiliary
219e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
219f0 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e  f P1==1 or in an
21a00 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
21a10 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20  se if.** P1>1.  
21a20 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70  Write the root p
21a30 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
21a40 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f  e new table into
21a50 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 0a  .** register P2.
21a60 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
21a70 65 6e 63 65 20 62 65 74 77 65 65 6e 20 61 20 74  ence between a t
21a80 61 62 6c 65 20 61 6e 64 20 61 6e 20 69 6e 64 65  able and an inde
21a90 78 20 69 73 20 74 68 69 73 3a 20 20 41 20 74 61  x is this:  A ta
21aa0 62 6c 65 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65  ble must.** have
21ab0 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65 67 65   a 4-byte intege
21ac0 72 20 6b 65 79 20 61 6e 64 20 63 61 6e 20 68 61  r key and can ha
21ad0 76 65 20 61 72 62 69 74 72 61 72 79 20 64 61 74  ve arbitrary dat
21ae0 61 2e 20 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20  a.  An index.** 
21af0 68 61 73 20 61 6e 20 61 72 62 69 74 72 61 72 79  has an arbitrary
21b00 20 6b 65 79 20 62 75 74 20 6e 6f 20 64 61 74 61   key but no data
21b10 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
21b20 3a 20 43 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f  : CreateIndex.*/
21b30 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61  ./* Opcode: Crea
21b40 74 65 49 6e 64 65 78 20 50 31 20 50 32 20 2a 20  teIndex P1 P2 * 
21b50 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  * *.**.** Alloca
21b60 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 69  te a new index i
21b70 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
21b80 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d  ase file if P1==
21b90 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61  0 or in the.** a
21ba0 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
21bb0 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20  e file if P1==1 
21bc0 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65  or in an attache
21bd0 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a  d database if.**
21be0 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68   P1>1.  Write th
21bf0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
21c00 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
21c10 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ble into.** regi
21c20 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  ster P2..**.** S
21c30 65 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ee documentation
21c40 20 6f 6e 20 4f 50 5f 43 72 65 61 74 65 54 61 62   on OP_CreateTab
21c50 6c 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  le for additiona
21c60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
21c70 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65  /.case OP_Create
21c80 49 6e 64 65 78 3a 20 20 20 20 20 20 20 20 20 20  Index:          
21c90 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
21ca0 65 61 73 65 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  ease */.case OP_
21cb0 43 72 65 61 74 65 54 61 62 6c 65 3a 20 7b 20 20  CreateTable: {  
21cc0 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
21cd0 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
21ce0 69 6e 74 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  int pgno = 0;.  
21cf0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 44 62 20  int flags;.  Db 
21d00 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *pDb;.  assert( 
21d10 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
21d20 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
21d30 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
21d40 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70  treeMask & (1<<p
21d50 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20  Op->p1))!=0 );. 
21d60 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
21d70 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
21d80 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20  rt( pDb->pBt!=0 
21d90 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
21da0 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54  code==OP_CreateT
21db0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 66  able ){.    /* f
21dc0 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54  lags = BTREE_INT
21dd0 4b 45 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61 67  KEY; */.    flag
21de0 73 20 3d 20 42 54 52 45 45 5f 4c 45 41 46 44 41  s = BTREE_LEAFDA
21df0 54 41 7c 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b  TA|BTREE_INTKEY;
21e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
21e10 61 67 73 20 3d 20 42 54 52 45 45 5f 5a 45 52 4f  ags = BTREE_ZERO
21e20 44 41 54 41 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  DATA;.  }.  rc =
21e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
21e40 61 74 65 54 61 62 6c 65 28 70 44 62 2d 3e 70 42  ateTable(pDb->pB
21e50 74 2c 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73 29  t, &pgno, flags)
21e60 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
21e70 70 67 6e 6f 3b 0a 20 20 4d 65 6d 53 65 74 54 79  pgno;.  MemSetTy
21e80 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
21e90 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  _Int);.  break;.
21ea0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61  }../* Opcode: Pa
21eb0 72 73 65 53 63 68 65 6d 61 20 50 31 20 50 32 20  rseSchema P1 P2 
21ec0 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61  * P4 *.**.** Rea
21ed0 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20  d and parse all 
21ee0 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
21ef0 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
21f00 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65  able of database
21f10 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63   P1.** that matc
21f20 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
21f30 73 65 20 50 34 2e 20 20 50 32 20 69 73 20 74 68  se P4.  P2 is th
21f40 65 20 22 66 6f 72 63 65 22 20 66 6c 61 67 2e 20  e "force" flag. 
21f50 20 20 41 6c 77 61 79 73 20 64 6f 0a 2a 2a 20 74    Always do.** t
21f60 68 65 20 70 61 72 73 69 6e 67 20 69 66 20 50 32  he parsing if P2
21f70 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 50 32   is true.  If P2
21f80 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
21f90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21fa0 61 0a 2a 2a 20 6e 6f 2d 6f 70 20 69 66 20 74 68  a.** no-op if th
21fb0 65 20 73 63 68 65 6d 61 20 69 73 20 6e 6f 74 20  e schema is not 
21fc0 63 75 72 72 65 6e 74 6c 79 20 6c 6f 61 64 65 64  currently loaded
21fd0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
21fe0 73 2c 20 69 66 20 50 32 0a 2a 2a 20 69 73 20 66  s, if P2.** is f
21ff0 61 6c 73 65 2c 20 74 68 65 20 53 51 4c 49 54 45  alse, the SQLITE
22000 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 69 73  _MASTER table is
22010 20 6f 6e 6c 79 20 70 61 72 73 65 64 20 69 66 20   only parsed if 
22020 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 0a  the rest of the.
22030 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 61 6c 72  ** schema is alr
22040 65 61 64 79 20 6c 6f 61 64 65 64 20 69 6e 74 6f  eady loaded into
22050 20 74 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   the symbol tabl
22060 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
22070 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
22080 20 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74   parser to creat
22090 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
220a0 6d 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e  machine,.** then
220b0 20 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69   runs the new vi
220c0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
220d0 49 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d  It is thus a re-
220e0 65 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a  entrant opcode..
220f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65  */.case OP_Parse
22100 53 63 68 65 6d 61 3a 20 7b 0a 20 20 63 68 61 72  Schema: {.  char
22110 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 44   *zSql;.  int iD
22120 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 63  b = pOp->p1;.  c
22130 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
22140 65 72 3b 0a 20 20 49 6e 69 74 44 61 74 61 20 69  er;.  InitData i
22150 6e 69 74 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  nitData;..  asse
22160 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
22170 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 69  b<db->nDb );.  i
22180 66 28 20 21 70 4f 70 2d 3e 70 32 20 26 26 20 21  f( !pOp->p2 && !
22190 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
221a0 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61  , iDb, DB_Schema
221b0 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 62  Loaded) ){.    b
221c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  reak;.  }.  zMas
221d0 74 65 72 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  ter = SCHEMA_TAB
221e0 4c 45 28 69 44 62 29 3b 0a 20 20 69 6e 69 74 44  LE(iDb);.  initD
221f0 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 69  ata.db = db;.  i
22200 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f  nitData.iDb = pO
22210 70 2d 3e 70 31 3b 0a 20 20 69 6e 69 74 44 61 74  p->p1;.  initDat
22220 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d  a.pzErrMsg = &p-
22230 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 7a 53 71 6c  >zErrMsg;.  zSql
22240 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
22250 66 28 64 62 2c 0a 20 20 20 20 20 22 53 45 4c 45  f(db,.     "SELE
22260 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67  CT name, rootpag
22270 65 2c 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27  e, sql FROM '%q'
22280 2e 25 73 20 57 48 45 52 45 20 25 73 22 2c 0a 20  .%s WHERE %s",. 
22290 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
222a0 2e 7a 4e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  .zName, zMaster,
222b0 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 69   pOp->p4.z);.  i
222c0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 67 6f 74  f( zSql==0 ) got
222d0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 28 76 6f 69  o no_mem;.  (voi
222e0 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
222f0 66 66 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ff(db);.  assert
22300 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
22310 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 69 6e 69 74  =0 );.  db->init
22320 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 69 6e 69  .busy = 1;.  ini
22330 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54  tData.rc = SQLIT
22340 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
22350 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
22360 64 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  d );.  rc = sqli
22370 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
22380 6c 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61  l, sqlite3InitCa
22390 6c 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74  llback, &initDat
223a0 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  a, 0);.  if( rc=
223b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
223c0 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a 20  = initData.rc;. 
223d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
223e0 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62 2d 3e  b, zSql);.  db->
223f0 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20  init.busy = 0;. 
22400 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
22410 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 69 66  fetyOn(db);.  if
22420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
22430 45 4d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e  EM ){.    goto n
22440 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65  o_mem;.  }.  bre
22450 61 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65  ak;  .}..#if !de
22460 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22470 54 5f 41 4e 41 4c 59 5a 45 29 20 26 26 20 21 64  T_ANALYZE) && !d
22480 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22490 49 54 5f 50 41 52 53 45 52 29 0a 2f 2a 20 4f 70  IT_PARSER)./* Op
224a0 63 6f 64 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73  code: LoadAnalys
224b0 69 73 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  is P1 * * * *.**
224c0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 73 71 6c  .** Read the sql
224d0 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
224e0 66 6f 72 20 64 61 74 61 62 61 73 65 20 50 31 20  for database P1 
224f0 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  and load the con
22500 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20  tent.** of that 
22510 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69  table into the i
22520 6e 74 65 72 6e 61 6c 20 69 6e 64 65 78 20 68 61  nternal index ha
22530 73 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  sh table.  This 
22540 77 69 6c 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68  will cause.** th
22550 65 20 61 6e 61 6c 79 73 69 73 20 74 6f 20 62 65  e analysis to be
22560 20 75 73 65 64 20 77 68 65 6e 20 70 72 65 70 61   used when prepa
22570 72 69 6e 67 20 61 6c 6c 20 73 75 62 73 65 71 75  ring all subsequ
22580 65 6e 74 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a  ent queries..*/.
22590 63 61 73 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c  case OP_LoadAnal
225a0 79 73 69 73 3a 20 7b 0a 20 20 69 6e 74 20 69 44  ysis: {.  int iD
225b0 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61  b = pOp->p1;.  a
225c0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
225d0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
225e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e    rc = sqlite3An
225f0 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 69  alysisLoad(db, i
22600 44 62 29 3b 0a 20 20 62 72 65 61 6b 3b 20 20 0a  Db);.  break;  .
22610 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
22620 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22630 5f 41 4e 41 4c 59 5a 45 29 20 26 26 20 21 64 65  _ANALYZE) && !de
22640 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22650 54 5f 50 41 52 53 45 52 29 20 20 2a 2f 0a 0a 2f  T_PARSER)  */../
22660 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 61  * Opcode: DropTa
22670 62 6c 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ble P1 * * P4 *.
22680 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
22690 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65   internal (in-me
226a0 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63  mory) data struc
226b0 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72  tures that descr
226c0 69 62 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ibe.** the table
226d0 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
226e0 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
226f0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
22700 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64 72  a table.** is dr
22710 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72 20 74  opped in order t
22720 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72  o keep the inter
22730 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
22740 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68  on of the.** sch
22750 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  ema consistent w
22760 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
22770 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  isk..*/.case OP_
22780 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a 20 20 73  DropTable: {.  s
22790 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
227a0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
227b0 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
227c0 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  z);.  break;.}..
227d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49  /* Opcode: DropI
227e0 6e 64 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a  ndex P1 * * P4 *
227f0 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
22800 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
22810 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
22820 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
22830 72 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  ribe.** the inde
22840 78 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61  x named P4 in da
22850 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73  tabase P1.  This
22860 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
22870 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20   an index.** is 
22880 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72  dropped in order
22890 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74   to keep the int
228a0 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
228b0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
228c0 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
228d0 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
228e0 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
228f0 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20 7b 0a 20  P_DropIndex: {. 
22900 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
22910 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
22920 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
22930 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
22940 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
22950 70 54 72 69 67 67 65 72 20 50 31 20 2a 20 2a 20  pTrigger P1 * * 
22960 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
22970 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
22980 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
22990 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
229a0 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
229b0 74 72 69 67 67 65 72 20 6e 61 6d 65 64 20 50 34  trigger named P4
229c0 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
229d0 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64    This is called
229e0 20 61 66 74 65 72 20 61 20 74 72 69 67 67 65 72   after a trigger
229f0 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69  .** is dropped i
22a00 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
22a10 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
22a20 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
22a30 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
22a40 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
22a50 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
22a60 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 72 69  .case OP_DropTri
22a70 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65  gger: {.  sqlite
22a80 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
22a90 54 72 69 67 67 65 72 28 64 62 2c 20 70 4f 70 2d  Trigger(db, pOp-
22aa0 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  >p1, pOp->p4.z);
22ab0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69  .  break;.}...#i
22ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22ad0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
22ae0 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74  K./* Opcode: Int
22af0 65 67 72 69 74 79 43 6b 20 50 31 20 50 32 20 50  egrityCk P1 P2 P
22b00 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20  3 * P5.**.** Do 
22b10 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  an analysis of t
22b20 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
22b30 6e 20 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f  n database.  Sto
22b40 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  re in.** registe
22b50 72 20 50 31 20 74 68 65 20 74 65 78 74 20 6f 66  r P1 the text of
22b60 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
22b70 65 20 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79  e describing any
22b80 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66   problems..** If
22b90 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65   no problems are
22ba0 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20   found, store a 
22bb0 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72  NULL in register
22bc0 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   P1..**.** The r
22bd0 65 67 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61  egister P3 conta
22be0 69 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ins the maximum 
22bf0 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 77 65  number of allowe
22c00 64 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41 74 20  d errors..** At 
22c10 6d 6f 73 74 20 72 65 67 28 50 33 29 20 65 72 72  most reg(P3) err
22c20 6f 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ors will be repo
22c30 72 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  rted..** In othe
22c40 72 20 77 6f 72 64 73 2c 20 74 68 65 20 61 6e 61  r words, the ana
22c50 6c 79 73 69 73 20 73 74 6f 70 73 20 61 73 20 73  lysis stops as s
22c60 6f 6f 6e 20 61 73 20 72 65 67 28 50 31 29 20 65  oon as reg(P1) e
22c70 72 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20 73 65  rrors are .** se
22c80 65 6e 2e 20 20 52 65 67 28 50 31 29 20 69 73 20  en.  Reg(P1) is 
22c90 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
22ca0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
22cb0 73 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a  s remaining..**.
22cc0 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
22cd0 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c 6c 20   numbers of all 
22ce0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61  tables in the da
22cf0 74 61 62 61 73 65 20 61 72 65 20 69 6e 74 65 67  tabase are integ
22d00 65 72 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  er.** stored in 
22d10 72 65 67 28 50 31 29 2c 20 72 65 67 28 50 31 2b  reg(P1), reg(P1+
22d20 31 29 2c 20 72 65 67 28 50 31 2b 32 29 2c 20 2e  1), reg(P1+2), .
22d30 2e 2e 2e 20 20 54 68 65 72 65 20 61 72 65 20 50  ...  There are P
22d40 32 20 74 61 62 6c 65 73 0a 2a 2a 20 74 6f 74 61  2 tables.** tota
22d50 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  l..**.** If P5 i
22d60 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20  s not zero, the 
22d70 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e  check is done on
22d80 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
22d90 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c  atabase.** file,
22da0 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20 64 61   not the main da
22db0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
22dc0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
22dd0 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
22de0 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72 69 74  ent the integrit
22df0 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a  y_check pragma..
22e00 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67  */.case OP_Integ
22e10 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20  rityCk: {.  int 
22e20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e  nRoot;      /* N
22e30 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
22e40 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62  to check.  (Numb
22e50 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  er of root pages
22e60 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  .) */.  int *aRo
22e70 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ot;     /* Array
22e80 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d   of rootpage num
22e90 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65 73 20  bers for tables 
22ea0 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
22eb0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
22ec0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22ed0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  er */.  int nErr
22ee0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
22ef0 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 70 6f  r of errors repo
22f00 72 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rted */.  char *
22f10 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  z;        /* Tex
22f20 74 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 72  t of the error r
22f30 65 70 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20 2a  eport */.  Mem *
22f40 70 6e 45 72 72 3b 20 20 20 20 20 2f 2a 20 52 65  pnErr;     /* Re
22f50 67 69 73 74 65 72 20 6b 65 65 70 69 6e 67 20 74  gister keeping t
22f60 72 61 63 6b 20 6f 66 20 65 72 72 6f 72 73 20 72  rack of errors r
22f70 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20  emaining */.  . 
22f80 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70 32   nRoot = pOp->p2
22f90 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 6f 6f  ;.  assert( nRoo
22fa0 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f 74 20 3d  t>0 );.  aRoot =
22fb0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22fc0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
22fd0 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29 20 29 3b  nt)*(nRoot+1) );
22fe0 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20  .  if( aRoot==0 
22ff0 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
23000 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
23010 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70  >0 && pOp->p3<=p
23020 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 6e 45 72  ->nMem );.  pnEr
23030 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  r = &p->aMem[pOp
23040 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
23050 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26   (pnErr->flags &
23060 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
23070 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
23080 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
23090 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
230a0 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 70 2d   );.  pIn1 = &p-
230b0 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  >aMem[pOp->p1];.
230c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f    for(j=0; j<nRo
230d0 6f 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 52  ot; j++){.    aR
230e0 6f 6f 74 5b 6a 5d 20 3d 20 28 69 6e 74 29 73 71  oot[j] = (int)sq
230f0 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
23100 65 28 26 70 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d  e(&pIn1[j]);.  }
23110 0a 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b  .  aRoot[j] = 0;
23120 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
23130 70 35 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p5<db->nDb );.  
23140 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65  assert( (p->btre
23150 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f 70 2d  eMask & (1<<pOp-
23160 3e 70 35 29 29 21 3d 30 20 29 3b 0a 20 20 7a 20  >p5))!=0 );.  z 
23170 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
23180 74 65 67 72 69 74 79 43 68 65 63 6b 28 64 62 2d  tegrityCheck(db-
23190 3e 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42  >aDb[pOp->p5].pB
231a0 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  t, aRoot, nRoot,
231b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e    (int)pnErr->u.
231e0 69 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c  i, &nErr);.  sql
231f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
23200 52 6f 6f 74 29 3b 0a 20 20 70 6e 45 72 72 2d 3e  Root);.  pnErr->
23210 75 2e 69 20 2d 3d 20 6e 45 72 72 3b 0a 20 20 73  u.i -= nErr;.  s
23220 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
23230 4e 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66  Null(pIn1);.  if
23240 28 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ( nErr==0 ){.   
23250 20 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b   assert( z==0 );
23260 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d  .  }else if( z==
23270 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  0 ){.    goto no
23280 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _mem;.  }else{. 
23290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
232a0 6d 53 65 74 53 74 72 28 70 49 6e 31 2c 20 7a 2c  mSetStr(pIn1, z,
232b0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
232c0 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
232d0 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41  .  }.  UPDATE_MA
232e0 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29  X_BLOBSIZE(pIn1)
232f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23300 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 49  hangeEncoding(pI
23310 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n1, encoding);. 
23320 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
23330 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23340 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
23350 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  */../* Opcode: R
23360 6f 77 53 65 74 41 64 64 20 50 31 20 50 32 20 2a  owSetAdd P1 P2 *
23370 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 73 65 72   * *.**.** Inser
23380 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  t the integer va
23390 6c 75 65 20 68 65 6c 64 20 62 79 20 72 65 67 69  lue held by regi
233a0 73 74 65 72 20 50 32 20 69 6e 74 6f 20 61 20 62  ster P2 into a b
233b0 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  oolean index.** 
233c0 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65 72  held in register
233d0 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 73   P1..**.** An as
233e0 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
233f0 20 50 32 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e   P2 is not an in
23400 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
23410 50 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b 20 20  P_RowSetAdd: {  
23420 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20       /* in2 */. 
23430 20 4d 65 6d 20 2a 70 49 64 78 3b 0a 20 20 4d 65   Mem *pIdx;.  Me
23440 6d 20 2a 70 56 61 6c 3b 0a 20 20 61 73 73 65 72  m *pVal;.  asser
23450 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20  t( pOp->p1>0 && 
23460 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p1<=p->nMem
23470 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 26 70 2d   );.  pIdx = &p-
23480 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  >aMem[pOp->p1];.
23490 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
234a0 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 3d  2>0 && pOp->p2<=
234b0 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 56 61  p->nMem );.  pVa
234c0 6c 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  l = &p->aMem[pOp
234d0 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
234e0 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20   (pVal->flags & 
234f0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20  MEM_Int)!=0 );. 
23500 20 69 66 28 20 28 70 49 64 78 2d 3e 66 6c 61 67   if( (pIdx->flag
23510 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
23520 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
23530 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65  3VdbeMemSetRowSe
23540 74 28 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  t(pIdx);.    if(
23550 20 28 70 49 64 78 2d 3e 66 6c 61 67 73 20 26 20   (pIdx->flags & 
23560 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
23570 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
23580 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65  }.  sqlite3RowSe
23590 74 49 6e 73 65 72 74 28 70 49 64 78 2d 3e 75 2e  tInsert(pIdx->u.
235a0 70 52 6f 77 53 65 74 2c 20 70 56 61 6c 2d 3e 75  pRowSet, pVal->u
235b0 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .i);.  break;.}.
235c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53  ./* Opcode: RowS
235d0 65 74 52 65 61 64 20 50 31 20 50 32 20 50 33 20  etRead P1 P2 P3 
235e0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63  * *.**.** Extrac
235f0 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76  t the smallest v
23600 61 6c 75 65 20 66 72 6f 6d 20 62 6f 6f 6c 65 61  alue from boolea
23610 6e 20 69 6e 64 65 78 20 50 31 20 61 6e 64 20 70  n index P1 and p
23620 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  ut that value in
23630 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  to.** register P
23640 33 2e 20 20 4f 72 2c 20 69 66 20 62 6f 6f 6c 65  3.  Or, if boole
23650 61 6e 20 69 6e 64 65 78 20 50 31 20 69 73 20 69  an index P1 is i
23660 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20  nitially empty, 
23670 6c 65 61 76 65 20 50 33 0a 2a 2a 20 75 6e 63 68  leave P3.** unch
23680 61 6e 67 65 64 20 61 6e 64 20 6a 75 6d 70 20 74  anged and jump t
23690 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
236a0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77  ..*/.case OP_Row
236b0 53 65 74 52 65 61 64 3a 20 7b 20 20 20 20 20 20  SetRead: {      
236c0 20 2f 2a 20 6a 75 6d 70 2c 20 6f 75 74 33 20 2a   /* jump, out3 *
236d0 2f 0a 20 20 4d 65 6d 20 2a 70 49 64 78 3b 0a 20  /.  Mem *pIdx;. 
236e0 20 69 36 34 20 76 61 6c 3b 0a 20 20 61 73 73 65   i64 val;.  asse
236f0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26  rt( pOp->p1>0 &&
23700 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65   pOp->p1<=p->nMe
23710 6d 20 29 3b 0a 20 20 43 48 45 43 4b 5f 46 4f 52  m );.  CHECK_FOR
23720 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 70 49  _INTERRUPT;.  pI
23730 64 78 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  dx = &p->aMem[pO
23740 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
23750 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
23760 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 64 78 2d  3];.  if( (pIdx-
23770 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
23780 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Set)==0 .   || s
23790 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74  qlite3RowSetNext
237a0 28 70 49 64 78 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIdx->u.pRowSet
237b0 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a  , &val)==0.  ){.
237c0 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65      /* The boole
237d0 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74  an index is empt
237e0 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  y */.    sqlite3
237f0 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
23800 49 64 78 29 3b 0a 20 20 20 20 70 63 20 3d 20 70  Idx);.    pc = p
23810 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65  Op->p2 - 1;.  }e
23820 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61  lse{.    /* A va
23830 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66  lue was pulled f
23840 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  rom the index */
23850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
23860 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p3>0 && pOp->p
23870 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  3<=p->nMem );.  
23880 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
23890 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 76  SetInt64(pOut, v
238a0 61 6c 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  al);.  }.  break
238b0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
238c0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
238d0 52 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e  R./* Opcode: Con
238e0 74 65 78 74 50 75 73 68 20 2a 20 2a 20 2a 20 0a  textPush * * * .
238f0 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63  **.** Save the c
23900 75 72 72 65 6e 74 20 56 64 62 65 20 63 6f 6e 74  urrent Vdbe cont
23910 65 78 74 20 73 75 63 68 20 74 68 61 74 20 69 74  ext such that it
23920 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
23930 20 62 79 20 61 20 43 6f 6e 74 65 78 74 50 6f 70   by a ContextPop
23940 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  .** opcode. The 
23950 63 6f 6e 74 65 78 74 20 73 74 6f 72 65 73 20 74  context stores t
23960 68 65 20 6c 61 73 74 20 69 6e 73 65 72 74 20 72  he last insert r
23970 6f 77 20 69 64 2c 20 74 68 65 20 6c 61 73 74 20  ow id, the last 
23980 73 74 61 74 65 6d 65 6e 74 20 63 68 61 6e 67 65  statement change
23990 0a 2a 2a 20 63 6f 75 6e 74 2c 20 61 6e 64 20 74  .** count, and t
239a0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
239b0 6d 65 6e 74 20 63 68 61 6e 67 65 20 63 6f 75 6e  ment change coun
239c0 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  t..*/.case OP_Co
239d0 6e 74 65 78 74 50 75 73 68 3a 20 7b 0a 20 20 69  ntextPush: {.  i
239e0 6e 74 20 69 20 3d 20 70 2d 3e 63 6f 6e 74 65 78  nt i = p->contex
239f0 74 53 74 61 63 6b 54 6f 70 2b 2b 3b 0a 20 20 43  tStackTop++;.  C
23a00 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78 74  ontext *pContext
23a10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
23a20 30 20 29 3b 0a 20 20 2f 2a 20 46 49 58 20 4d 45  0 );.  /* FIX ME
23a30 3a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  : This should be
23a40 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61   allocated as pa
23a50 72 74 20 6f 66 20 74 68 65 20 76 64 62 65 20 61  rt of the vdbe a
23a60 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a  t compile-time *
23a70 2f 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 63 6f  /.  if( i>=p->co
23a80 6e 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20  ntextStackDepth 
23a90 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 6e 74 65 78  ){.    p->contex
23aa0 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 69 2b  tStackDepth = i+
23ab0 31 3b 0a 20 20 20 20 70 2d 3e 63 6f 6e 74 65 78  1;.    p->contex
23ac0 74 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  tStack = sqlite3
23ad0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
23ae0 64 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  db, p->contextSt
23af0 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ack,.           
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23b20 69 7a 65 6f 66 28 43 6f 6e 74 65 78 74 29 2a 28  izeof(Context)*(
23b30 69 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  i+1));.    if( p
23b40 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 3d 3d  ->contextStack==
23b50 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
23b60 0a 20 20 7d 0a 20 20 70 43 6f 6e 74 65 78 74 20  .  }.  pContext 
23b70 3d 20 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  = &p->contextSta
23b80 63 6b 5b 69 5d 3b 0a 20 20 70 43 6f 6e 74 65 78  ck[i];.  pContex
23b90 74 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 64  t->lastRowid = d
23ba0 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  b->lastRowid;.  
23bb0 70 43 6f 6e 74 65 78 74 2d 3e 6e 43 68 61 6e 67  pContext->nChang
23bc0 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a  e = p->nChange;.
23bd0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
23be0 70 63 6f 64 65 3a 20 43 6f 6e 74 65 78 74 50 6f  pcode: ContextPo
23bf0 70 20 2a 20 2a 20 2a 20 0a 2a 2a 0a 2a 2a 20 52  p * * * .**.** R
23c00 65 73 74 6f 72 65 20 74 68 65 20 56 64 62 65 20  estore the Vdbe 
23c10 63 6f 6e 74 65 78 74 20 74 6f 20 74 68 65 20 73  context to the s
23c20 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 77  tate it was in w
23c30 68 65 6e 20 63 6f 6e 74 65 78 74 50 75 73 68 20  hen contextPush 
23c40 77 61 73 20 6c 61 73 74 0a 2a 2a 20 65 78 65 63  was last.** exec
23c50 75 74 65 64 2e 20 54 68 65 20 63 6f 6e 74 65 78  uted. The contex
23c60 74 20 73 74 6f 72 65 73 20 74 68 65 20 6c 61 73  t stores the las
23c70 74 20 69 6e 73 65 72 74 20 72 6f 77 20 69 64 2c  t insert row id,
23c80 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 6d   the last statem
23c90 65 6e 74 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f  ent.** change co
23ca0 75 6e 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  unt, and the cur
23cb0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 63  rent statement c
23cc0 68 61 6e 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  hange count..*/.
23cd0 63 61 73 65 20 4f 50 5f 43 6f 6e 74 65 78 74 50  case OP_ContextP
23ce0 6f 70 3a 20 7b 0a 20 20 43 6f 6e 74 65 78 74 20  op: {.  Context 
23cf0 2a 70 43 6f 6e 74 65 78 74 20 3d 20 26 70 2d 3e  *pContext = &p->
23d00 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 2d 2d 70  contextStack[--p
23d10 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
23d20 70 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p];.  assert( p-
23d30 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
23d40 3e 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 6c 61 73  >=0 );.  db->las
23d50 74 52 6f 77 69 64 20 3d 20 70 43 6f 6e 74 65 78  tRowid = pContex
23d60 74 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  t->lastRowid;.  
23d70 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 43 6f  p->nChange = pCo
23d80 6e 74 65 78 74 2d 3e 6e 43 68 61 6e 67 65 3b 0a  ntext->nChange;.
23d90 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
23da0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
23db0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
23dc0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
23dd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
23de0 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65  REMENT./* Opcode
23df0 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20 2a  : MemMax P1 P2 *
23e00 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74   * *.**.** Set t
23e10 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69  he value of regi
23e20 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20 6d  ster P1 to the m
23e30 61 78 69 6d 75 6d 20 6f 66 20 69 74 73 20 63 75  aximum of its cu
23e40 72 72 65 6e 74 20 76 61 6c 75 65 0a 2a 2a 20 61  rrent value.** a
23e50 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  nd the value in 
23e60 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
23e70 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
23e80 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72  ion throws an er
23e90 72 6f 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72  ror if the memor
23ea0 79 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e  y cell is not in
23eb0 69 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  itially.** an in
23ec0 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  teger..*/.case O
23ed0 50 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20  P_MemMax: {     
23ee0 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e 32 20 2a     /* in1, in2 *
23ef0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
23f00 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e  emIntegerify(pIn
23f10 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
23f20 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
23f30 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31  In2);.  if( pIn1
23f40 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e 69 29  ->u.i<pIn2->u.i)
23f50 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20  {.    pIn1->u.i 
23f60 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d  = pIn2->u.i;.  }
23f70 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
23f80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23f90 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  T_AUTOINCREMENT 
23fa0 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  */../* Opcode: I
23fb0 66 50 6f 73 20 50 31 20 50 32 20 2a 20 2a 20 2a  fPos P1 P2 * * *
23fc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  .**.** If the va
23fd0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
23fe0 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61 74  P1 is 1 or great
23ff0 65 72 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  er, jump to P2..
24000 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
24010 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20  gal to use this 
24020 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61  instruction on a
24030 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64   register that d
24040 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
24050 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  in an integer.  
24060 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
24070 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  lt will result i
24080 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61  f you try..*/.ca
24090 73 65 20 4f 50 5f 49 66 50 6f 73 3a 20 7b 20 20  se OP_IfPos: {  
240a0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
240b0 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n1 */.  assert( 
240c0 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
240d0 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  Int );.  if( pIn
240e0 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20 20 20  1->u.i>0 ){.    
240f0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
24100 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
24110 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
24120 4e 65 67 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Neg P1 P2 * * *.
24130 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  **.** If the val
24140 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
24150 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  1 is less than z
24160 65 72 6f 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e  ero, jump to P2.
24170 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c   .**.** It is il
24180 6c 65 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69  legal to use thi
24190 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
241a0 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
241b0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
241c0 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
241d0 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66    An assertion f
241e0 61 75 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74  ault will result
241f0 20 69 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a   if you try..*/.
24200 63 61 73 65 20 4f 50 5f 49 66 4e 65 67 3a 20 7b  case OP_IfNeg: {
24210 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
24220 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74   in1 */.  assert
24230 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn1->flags&ME
24240 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70  M_Int );.  if( p
24250 49 6e 31 2d 3e 75 2e 69 3c 30 20 29 7b 0a 20 20  In1->u.i<0 ){.  
24260 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
24270 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
24280 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
24290 49 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a  IfZero P1 P2 * *
242a0 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20   *.**.** If the 
242b0 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
242c0 72 20 50 31 20 69 73 20 65 78 61 63 74 6c 79 20  r P1 is exactly 
242d0 30 2c 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a  0, jump to P2. .
242e0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
242f0 67 61 6c 20 74 6f 20 75 73 65 20 74 68 69 73 20  gal to use this 
24300 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61  instruction on a
24310 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 64   register that d
24320 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
24330 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  in an integer.  
24340 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
24350 6c 74 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  lt will result i
24360 66 20 79 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61  f you try..*/.ca
24370 73 65 20 4f 50 5f 49 66 5a 65 72 6f 3a 20 7b 20  se OP_IfZero: { 
24380 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
24390 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in1 */.  assert(
243a0 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
243b0 5f 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49  _Int );.  if( pI
243c0 6e 31 2d 3e 75 2e 69 3d 3d 30 20 29 7b 0a 20 20  n1->u.i==0 ){.  
243d0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
243e0 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
243f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
24400 41 67 67 53 74 65 70 20 2a 20 50 32 20 50 33 20  AggStep * P2 P3 
24410 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63  P4 P5.**.** Exec
24420 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e  ute the step fun
24430 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67  ction for an agg
24440 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20  regate.  The.** 
24450 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20  function has P5 
24460 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20  arguments.   P4 
24470 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
24480 74 68 65 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73  the FuncDef.** s
24490 74 72 75 63 74 75 72 65 20 74 68 61 74 20 73 70  tructure that sp
244a0 65 63 69 66 69 65 73 20 74 68 65 20 66 75 6e 63  ecifies the func
244b0 74 69 6f 6e 2e 20 20 55 73 65 20 72 65 67 69 73  tion.  Use regis
244c0 74 65 72 0a 2a 2a 20 50 33 20 61 73 20 74 68 65  ter.** P3 as the
244d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
244e0 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75 6d  .** The P5 argum
244f0 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ents are taken f
24500 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32 20  rom register P2 
24510 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63 65  and its.** succe
24520 73 73 6f 72 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ssors..*/.case O
24530 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 69  P_AggStep: {.  i
24540 6e 74 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  nt n = pOp->p5;.
24550 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
24560 70 4d 65 6d 2c 20 2a 70 52 65 63 3b 0a 20 20 73  pMem, *pRec;.  s
24570 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 63  qlite3_context c
24580 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  tx;.  sqlite3_va
24590 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 0a 20 20  lue **apVal;..  
245a0 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
245b0 20 20 70 52 65 63 20 3d 20 26 70 2d 3e 61 4d 65    pRec = &p->aMe
245c0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 70  m[pOp->p2];.  ap
245d0 56 61 6c 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a  Val = p->apArg;.
245e0 20 20 61 73 73 65 72 74 28 20 61 70 56 61 6c 20    assert( apVal 
245f0 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  || n==0 );.  for
24600 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20  (i=0; i<n; i++, 
24610 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 61 70 56  pRec++){.    apV
24620 61 6c 5b 69 5d 20 3d 20 70 52 65 63 3b 0a 20 20  al[i] = pRec;.  
24630 20 20 73 74 6f 72 65 54 79 70 65 49 6e 66 6f 28    storeTypeInfo(
24640 70 52 65 63 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pRec, encoding);
24650 0a 20 20 7d 0a 20 20 63 74 78 2e 70 46 75 6e 63  .  }.  ctx.pFunc
24660 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
24670 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
24680 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
24690 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 63  <=p->nMem );.  c
246a0 74 78 2e 70 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d  tx.pMem = pMem =
246b0 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
246c0 33 5d 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b  3];.  pMem->n++;
246d0 0a 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d  .  ctx.s.flags =
246e0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78   MEM_Null;.  ctx
246f0 2e 73 2e 7a 20 3d 20 30 3b 0a 20 20 63 74 78 2e  .s.z = 0;.  ctx.
24700 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  s.zMalloc = 0;. 
24710 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30 3b   ctx.s.xDel = 0;
24720 0a 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62  .  ctx.s.db = db
24730 3b 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20  ;.  ctx.isError 
24740 3d 20 30 3b 0a 20 20 63 74 78 2e 70 43 6f 6c 6c  = 0;.  ctx.pColl
24750 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e   = 0;.  if( ctx.
24760 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53  pFunc->flags & S
24770 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
24780 4f 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OLL ){.    asser
24790 74 28 20 70 4f 70 3e 70 2d 3e 61 4f 70 20 29 3b  t( pOp>p->aOp );
247a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
247b0 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f  [-1].p4type==P4_
247c0 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 61  COLLSEQ );.    a
247d0 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
247e0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65  pcode==OP_CollSe
247f0 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43 6f  q );.    ctx.pCo
24800 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e  ll = pOp[-1].p4.
24810 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 28 63 74  pColl;.  }.  (ct
24820 78 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 29 28  x.pFunc->xStep)(
24830 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29 3b  &ctx, n, apVal);
24840 0a 20 20 69 66 28 20 63 74 78 2e 69 73 45 72 72  .  if( ctx.isErr
24850 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
24860 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
24870 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
24880 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
24890 74 65 78 74 28 26 63 74 78 2e 73 29 29 3b 0a 20  text(&ctx.s));. 
248a0 20 20 20 72 63 20 3d 20 63 74 78 2e 69 73 45 72     rc = ctx.isEr
248b0 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ror;.  }.  sqlit
248c0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
248d0 28 26 63 74 78 2e 73 29 3b 0a 20 20 62 72 65 61  (&ctx.s);.  brea
248e0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
248f0 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50 32 20   AggFinal P1 P2 
24900 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 65  * P4 *.**.** Exe
24910 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69 7a  cute the finaliz
24920 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
24930 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 50  an aggregate.  P
24940 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f  1 is.** the memo
24950 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74  ry location that
24960 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61   is the accumula
24970 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67 72  tor for the aggr
24980 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  egate..**.** P2 
24990 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
249a0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
249b0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
249c0 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50  n takes and.** P
249d0 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
249e0 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f  o the FuncDef fo
249f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
24a00 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75    The P2.** argu
24a10 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  ment is not used
24a20 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   by this opcode.
24a30 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65    It is only the
24a40 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61  re to disambigua
24a50 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  te.** functions 
24a60 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61  that can take va
24a70 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66  rying numbers of
24a80 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
24a90 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20  .** P4 argument 
24aa0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
24ab0 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61 74  or the degenerat
24ac0 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  e case where.** 
24ad0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
24ae0 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69 6f  n was not previo
24af0 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  usly called..*/.
24b00 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c  case OP_AggFinal
24b10 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  : {.  Mem *pMem;
24b20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
24b30 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  p1>0 && pOp->p1<
24b40 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4d  =p->nMem );.  pM
24b50 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  em = &p->aMem[pO
24b60 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
24b70 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
24b80 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f   ~(MEM_Null|MEM_
24b90 41 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63  Agg))==0 );.  rc
24ba0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
24bb0 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20  mFinalize(pMem, 
24bc0 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a  pOp->p4.pFunc);.
24bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24be0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 73 71  _ERROR ){.    sq
24bf0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
24c00 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
24c10 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
24c20 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29 29 3b  lue_text(pMem));
24c30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
24c40 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
24c50 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29  (pMem, encoding)
24c60 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
24c70 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20  LOBSIZE(pMem);. 
24c80 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
24c90 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20  MemTooBig(pMem) 
24ca0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
24cb0 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  big;.  }.  break
24cc0 3b 0a 7d 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  ;.}...#if !defin
24cd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
24ce0 41 43 55 55 4d 29 20 26 26 20 21 64 65 66 69 6e  ACUUM) && !defin
24cf0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
24d00 54 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65  TTACH)./* Opcode
24d10 3a 20 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20 2a  : Vacuum * * * *
24d20 20 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20   *.**.** Vacuum 
24d30 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 62  the entire datab
24d40 61 73 65 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ase.  This opcod
24d50 65 20 77 69 6c 6c 20 63 61 75 73 65 20 6f 74 68  e will cause oth
24d60 65 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d 61  er virtual.** ma
24d70 63 68 69 6e 65 73 20 74 6f 20 62 65 20 63 72 65  chines to be cre
24d80 61 74 65 64 20 61 6e 64 20 72 75 6e 2e 20 20 49  ated and run.  I
24d90 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  t may not be cal
24da0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a  led from within.
24db0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
24dc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63  ..*/.case OP_Vac
24dd0 75 75 6d 3a 20 7b 0a 20 20 69 66 28 20 73 71 6c  uum: {.  if( sql
24de0 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
24df0 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
24e00 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 20 0a 20  ue_to_misuse; . 
24e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e   rc = sqlite3Run
24e20 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d  Vacuum(&p->zErrM
24e30 73 67 2c 20 64 62 29 3b 0a 20 20 69 66 28 20 73  sg, db);.  if( s
24e40 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
24e50 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  b) ) goto abort_
24e60 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20  due_to_misuse;. 
24e70 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
24e80 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
24e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24ea0 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64 65  ACUUM)./* Opcode
24eb0 3a 20 49 6e 63 72 56 61 63 75 75 6d 20 50 31 20  : IncrVacuum P1 
24ec0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50  P2 * * *.**.** P
24ed0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
24ee0 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 63 72  step of the incr
24ef0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 70  emental vacuum p
24f00 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a 2a 20 74  rocedure on.** t
24f10 68 65 20 50 31 20 64 61 74 61 62 61 73 65 2e 20  he P1 database. 
24f20 49 66 20 74 68 65 20 76 61 63 75 75 6d 20 68 61  If the vacuum ha
24f30 73 20 66 69 6e 69 73 68 65 64 2c 20 6a 75 6d 70  s finished, jump
24f40 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a   to instruction.
24f50 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65  ** P2. Otherwise
24f60 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  , fall through t
24f70 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
24f80 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  uction..*/.case 
24f90 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 3a 20 7b  OP_IncrVacuum: {
24fa0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
24fb0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  */.  Btree *pBt;
24fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
24fd0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
24fe0 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
24ff0 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
25000 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f 70 2d 3e  Mask & (1<<pOp->
25010 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42 74  p1))!=0 );.  pBt
25020 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
25030 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20  p1].pBt;.  rc = 
25040 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
25050 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20 69  Vacuum(pBt);.  i
25060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
25070 4e 45 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  NE ){.    pc = p
25080 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
25090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
250a0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
250b0 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65  endif../* Opcode
250c0 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a 20  : Expire P1 * * 
250d0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20  * *.**.** Cause 
250e0 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
250f0 65 6d 65 6e 74 73 20 74 6f 20 62 65 63 6f 6d 65  ements to become
25100 20 65 78 70 69 72 65 64 2e 20 41 6e 20 65 78 70   expired. An exp
25110 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ired statement.*
25120 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20  * fails with an 
25130 65 72 72 6f 72 20 63 6f 64 65 20 6f 66 20 53 51  error code of SQ
25140 4c 49 54 45 5f 53 43 48 45 4d 41 20 69 66 20 69  LITE_SCHEMA if i
25150 74 20 69 73 20 65 76 65 72 20 65 78 65 63 75 74  t is ever execut
25160 65 64 20 0a 2a 2a 20 28 76 69 61 20 73 71 6c 69  ed .** (via sqli
25170 74 65 33 5f 73 74 65 70 28 29 29 2e 0a 2a 2a 20  te3_step())..** 
25180 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30 2c 20  .** If P1 is 0, 
25190 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74 61  then all SQL sta
251a0 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20 65  tements become e
251b0 78 70 69 72 65 64 2e 20 49 66 20 50 31 20 69 73  xpired. If P1 is
251c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68   non-zero,.** th
251d0 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75 72 72  en only the curr
251e0 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20  ently executing 
251f0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 66 66  statement is aff
25200 65 63 74 65 64 2e 20 0a 2a 2f 0a 63 61 73 65 20  ected. .*/.case 
25210 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20 69  OP_Expire: {.  i
25220 66 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  f( !pOp->p1 ){. 
25230 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
25240 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
25250 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  ts(db);.  }else{
25260 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
25270 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 1;.  }.  break
25280 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
25290 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
252a0 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  CACHE./* Opcode:
252b0 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32   TableLock P1 P2
252c0 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f   P3 P4 *.**.** O
252d0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
252e0 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
252f0 6c 65 2e 20 54 68 69 73 20 69 6e 73 74 72 75 63  le. This instruc
25300 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
25310 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 73 68  d when.** the sh
25320 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
25330 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 0a  re is enabled. .
25340 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 20  **.** If P1 is  
25350 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
25360 20 64 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c   database in sql
25370 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68  ite3.aDb[] of th
25380 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e  e database.** on
25390 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20   which the lock 
253a0 69 73 20 61 63 71 75 69 72 65 64 2e 20 20 41 20  is acquired.  A 
253b0 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61  readlock is obta
253c0 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72  ined if P3==0 or
253d0 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  .** a write lock
253e0 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a   if P3==1..**.**
253f0 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P2 contains the
25400 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68   root-page of th
25410 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e  e table to lock.
25420 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69  .**.** P4 contai
25430 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
25440 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
25450 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b  table being lock
25460 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ed. This is only
25470 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65  .** used to gene
25480 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
25490 73 73 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63  ssage if the loc
254a0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
254b0 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ined..*/.case OP
254c0 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20  _TableLock: {.  
254d0 69 6e 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  int p1 = pOp->p1
254e0 3b 20 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c  ; .  u8 isWriteL
254f0 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70  ock = (u8)pOp->p
25500 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e  3;.  assert( p1>
25510 3d 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62  =0 && p1<db->nDb
25520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
25530 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31  ->btreeMask & (1
25540 3c 3c 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 61  <<p1))!=0 );.  a
25550 73 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f  ssert( isWriteLo
25560 63 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65  ck==0 || isWrite
25570 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 72 63 20  Lock==1 );.  rc 
25580 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  = sqlite3BtreeLo
25590 63 6b 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b  ckTable(db->aDb[
255a0 70 31 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32  p1].pBt, pOp->p2
255b0 2c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a  , isWriteLock);.
255c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
255d0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 63  _LOCKED ){.    c
255e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
255f0 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 73 71  Op->p4.z;.    sq
25600 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
25610 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
25620 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
25630 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20  is locked: %s", 
25640 7a 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  z);.  }.  break;
25650 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25660 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
25670 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
25680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
25690 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
256a0 63 6f 64 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a  code: VBegin * *
256b0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
256c0 20 6d 61 79 20 62 65 20 61 20 70 6f 69 6e 74 65   may be a pointe
256d0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
256e0 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
256f0 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20  If so, call the 
25700 0a 2a 2a 20 78 42 65 67 69 6e 20 6d 65 74 68 6f  .** xBegin metho
25710 64 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  d for that table
25720 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68  ..**.** Also, wh
25730 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 50 34 20  ether or not P4 
25740 69 73 20 73 65 74 2c 20 63 68 65 63 6b 20 74 68  is set, check th
25750 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 62  at this is not b
25760 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
25770 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 63 61 6c  .** within a cal
25780 6c 62 61 63 6b 20 74 6f 20 61 20 76 69 72 74 75  lback to a virtu
25790 61 6c 20 74 61 62 6c 65 20 78 53 79 6e 63 28 29  al table xSync()
257a0 20 6d 65 74 68 6f 64 2e 20 49 66 20 69 74 20 69   method. If it i
257b0 73 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 65 72  s, set the.** er
257c0 72 6f 72 20 63 6f 64 65 20 74 6f 20 53 51 4c 49  ror code to SQLI
257d0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61  TE_LOCKED..*/.ca
257e0 73 65 20 4f 50 5f 56 42 65 67 69 6e 3a 20 7b 0a  se OP_VBegin: {.
257f0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
25800 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
25810 70 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71  pVtab;.  rc = sq
25820 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e 28 64  lite3VtabBegin(d
25830 62 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28  b, pVtab);.  if(
25840 20 70 56 74 61 62 20 29 7b 0a 20 20 20 20 73 71   pVtab ){.    sq
25850 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25860 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
25870 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56   p->zErrMsg = pV
25880 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  tab->zErrMsg;.  
25890 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
258a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
258b0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
258c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
258d0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
258e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
258f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
25900 4f 70 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20  Opcode: VCreate 
25910 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
25920 2a 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65  * P4 is the name
25930 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
25940 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20  ble in database 
25950 50 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 43 72  P1. Call the xCr
25960 65 61 74 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 66  eate method.** f
25970 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
25980 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72 65 61 74  /.case OP_VCreat
25990 65 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e: {.  rc = sqli
259a0 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61 74  te3VtabCallCreat
259b0 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  e(db, pOp->p1, p
259c0 4f 70 2d 3e 70 34 2e 7a 2c 20 26 70 2d 3e 7a 45  Op->p4.z, &p->zE
259d0 72 72 4d 73 67 29 3b 0a 20 20 62 72 65 61 6b 3b  rrMsg);.  break;
259e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
259f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
25a00 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
25a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
25a20 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
25a30 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20 50  code: VDestroy P
25a40 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
25a50 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65 20   P4 is the name 
25a60 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
25a70 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  le in database P
25a80 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44 65  1.  Call the xDe
25a90 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20  stroy method.** 
25aa0 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  of that table..*
25ab0 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74 72  /.case OP_VDestr
25ac0 6f 79 3a 20 7b 0a 20 20 70 2d 3e 69 6e 56 74 61  oy: {.  p->inVta
25ad0 62 4d 65 74 68 6f 64 20 3d 20 32 3b 0a 20 20 72  bMethod = 2;.  r
25ae0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43  c = sqlite3VtabC
25af0 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c 20 70  allDestroy(db, p
25b00 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
25b10 7a 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d  z);.  p->inVtabM
25b20 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 62 72 65  ethod = 0;.  bre
25b30 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
25b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
25b50 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
25b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25b70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
25b80 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e 20 50   Opcode: VOpen P
25b90 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
25ba0 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
25bb0 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
25bc0 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
25bd0 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
25be0 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69 73 20  cture..** P1 is 
25bf0 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  a cursor number.
25c00 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6f 70    This opcode op
25c10 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20  ens a cursor to 
25c20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
25c30 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 73 20  able and stores 
25c40 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e 20 50  that cursor in P
25c50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4f  1..*/.case OP_VO
25c60 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  pen: {.  VdbeCur
25c70 73 6f 72 20 2a 70 43 75 72 20 3d 20 30 3b 0a 20  sor *pCur = 0;. 
25c80 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
25c90 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
25ca0 72 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65  r = 0;..  sqlite
25cb0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
25cc0 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
25cd0 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
25ce0 2a 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71 6c 69  *pModule = (sqli
25cf0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74  te3_module *)pVt
25d00 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20  ab->pModule;..  
25d10 61 73 73 65 72 74 28 70 56 74 61 62 20 26 26 20  assert(pVtab && 
25d20 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 69 66 28 20  pModule);.  if( 
25d30 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
25d40 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72  (db) ) goto abor
25d50 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b  t_due_to_misuse;
25d60 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d  .  rc = pModule-
25d70 3e 78 4f 70 65 6e 28 70 56 74 61 62 2c 20 26 70  >xOpen(pVtab, &p
25d80 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 73  VtabCursor);.  s
25d90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25da0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
25db0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56 74  p->zErrMsg = pVt
25dc0 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70  ab->zErrMsg;.  p
25dd0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
25de0 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
25df0 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67  SafetyOn(db) ) g
25e00 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
25e10 5f 6d 69 73 75 73 65 3b 0a 20 20 69 66 28 20 53  _misuse;.  if( S
25e20 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a  QLITE_OK==rc ){.
25e30 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
25e40 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e sqlite3_vtab_c
25e50 75 72 73 6f 72 20 62 61 73 65 20 63 6c 61 73 73  ursor base class
25e60 20 2a 2f 0a 20 20 20 20 70 56 74 61 62 43 75 72   */.    pVtabCur
25e70 73 6f 72 2d 3e 70 56 74 61 62 20 3d 20 70 56 74  sor->pVtab = pVt
25e80 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  ab;..    /* Init
25e90 69 61 6c 69 73 65 20 76 64 62 65 20 63 75 72 73  ialise vdbe curs
25ea0 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  or object */.   
25eb0 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65   pCur = allocate
25ec0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
25ed0 31 2c 20 26 70 4f 70 5b 2d 31 5d 2c 20 2d 31 2c  1, &pOp[-1], -1,
25ee0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75   0);.    if( pCu
25ef0 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  r ){.      pCur-
25f00 3e 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  >pVtabCursor = p
25f10 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
25f20 20 20 70 43 75 72 2d 3e 70 4d 6f 64 75 6c 65 20    pCur->pModule 
25f30 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  = pVtabCursor->p
25f40 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
25f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25f60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25f70 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4d 6f 64   = 1;.      pMod
25f80 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
25f90 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  bCursor);.    }.
25fa0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
25fb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25fc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
25fd0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
25fe0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
25ff0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
26000 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50 32 20  : VFilter P1 P2 
26010 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31  P3 P4 *.**.** P1
26020 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65   is a cursor ope
26030 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e  ned using VOpen.
26040 20 20 50 32 20 69 73 20 61 6e 20 61 64 64 72 65    P2 is an addre
26050 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
26060 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65 64  .** the filtered
26070 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65   result set is e
26080 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  mpty..**.** P4 i
26090 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  s either NULL or
260a0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 77   a string that w
260b0 61 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  as generated by 
260c0 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a  the xBestIndex.*
260d0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
260e0 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e 74  module.  The int
260f0 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74  erpretation of t
26100 68 65 20 50 34 20 73 74 72 69 6e 67 20 69 73 20  he P4 string is 
26110 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d  left.** to the m
26120 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  odule implementa
26130 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
26140 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
26150 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  the xFilter meth
26160 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61  od on the virtua
26170 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65  l table specifie
26180 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68 65  d.** by P1.  The
26190 20 69 6e 74 65 67 65 72 20 71 75 65 72 79 20 70   integer query p
261a0 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74 6f  lan parameter to
261b0 20 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f 72   xFilter is stor
261c0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a  ed in register.*
261d0 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72 20 50  * P3. Register P
261e0 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20 61  3+1 stores the a
261f0 72 67 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rgc parameter to
26200 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
26210 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65 74  e.** xFilter met
26220 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20 50  hod. Registers P
26230 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61  3+2..P3+1+argc a
26240 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20 61  re the argc.** a
26250 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65  dditional parame
26260 74 65 72 73 20 77 68 69 63 68 20 61 72 65 20 70  ters which are p
26270 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c  assed to.** xFil
26280 74 65 72 20 61 73 20 61 72 67 76 2e 20 52 65 67  ter as argv. Reg
26290 69 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f 6d  ister P3+2 becom
262a0 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e 20  es argv[0] when 
262b0 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65  passed to xFilte
262c0 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  r..**.** A jump 
262d0 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69 66  is made to P2 if
262e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
262f0 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67 20  after filtering 
26300 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a  would be empty..
26310 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c 74  */.case OP_VFilt
26320 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  er: {   /* jump 
26330 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  */.  int nArg;. 
26340 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20 63   int iQuery;.  c
26350 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
26360 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
26370 4d 65 6d 20 2a 70 51 75 65 72 79 20 3d 20 26 70  Mem *pQuery = &p
26380 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b  ->aMem[pOp->p3];
26390 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63 20 3d 20  .  Mem *pArgc = 
263a0 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20 20 73 71  &pQuery[1];.  sq
263b0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
263c0 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r *pVtabCursor;.
263d0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
263e0 70 56 74 61 62 3b 0a 0a 20 20 56 64 62 65 43 75  pVtab;..  VdbeCu
263f0 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e  rsor *pCur = p->
26400 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
26410 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
26420 45 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72  E(pOp->p3, pQuer
26430 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  y);.  assert( pC
26440 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  ur->pVtabCursor 
26450 29 3b 0a 20 20 70 56 74 61 62 43 75 72 73 6f 72  );.  pVtabCursor
26460 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75   = pCur->pVtabCu
26470 72 73 6f 72 3b 0a 20 20 70 56 74 61 62 20 3d 20  rsor;.  pVtab = 
26480 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
26490 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
264a0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
264b0 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 69  .  /* Grab the i
264c0 6e 64 65 78 20 6e 75 6d 62 65 72 20 61 6e 64 20  ndex number and 
264d0 61 72 67 63 20 70 61 72 61 6d 65 74 65 72 73 20  argc parameters 
264e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 51  */.  assert( (pQ
264f0 75 65 72 79 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  uery->flags&MEM_
26500 49 6e 74 29 21 3d 30 20 26 26 20 70 41 72 67 63  Int)!=0 && pArgc
26510 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74  ->flags==MEM_Int
26520 20 29 3b 0a 20 20 6e 41 72 67 20 3d 20 28 69 6e   );.  nArg = (in
26530 74 29 70 41 72 67 63 2d 3e 75 2e 69 3b 0a 20 20  t)pArgc->u.i;.  
26540 69 51 75 65 72 79 20 3d 20 28 69 6e 74 29 70 51  iQuery = (int)pQ
26550 75 65 72 79 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a  uery->u.i;..  /*
26560 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
26570 74 65 72 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ter method */.  
26580 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20  {.    int res = 
26590 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
265a0 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67 20 3d 20    Mem **apArg = 
265b0 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 66 6f  p->apArg;.    fo
265c0 72 28 69 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b  r(i = 0; i<nArg;
265d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 41   i++){.      apA
265e0 72 67 5b 69 5d 20 3d 20 26 70 41 72 67 63 5b 69  rg[i] = &pArgc[i
265f0 2b 31 5d 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  +1];.      store
26600 54 79 70 65 49 6e 66 6f 28 61 70 41 72 67 5b 69  TypeInfo(apArg[i
26610 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ], 0);.    }..  
26620 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66    if( sqlite3Saf
26630 65 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74  etyOff(db) ) got
26640 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
26650 69 73 75 73 65 3b 0a 20 20 20 20 73 71 6c 69 74  isuse;.    sqlit
26660 65 33 56 74 61 62 4c 6f 63 6b 28 70 56 74 61 62  e3VtabLock(pVtab
26670 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
26680 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
26690 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 46  rc = pModule->xF
266a0 69 6c 74 65 72 28 70 56 74 61 62 43 75 72 73 6f  ilter(pVtabCurso
266b0 72 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e  r, iQuery, pOp->
266c0 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72  p4.z, nArg, apAr
266d0 67 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  g);.    p->inVta
266e0 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 20  bMethod = 0;.   
266f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26700 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
26710 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
26720 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b   pVtab->zErrMsg;
26730 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  .    pVtab->zErr
26740 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Msg = 0;.    sql
26750 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 64  ite3VtabUnlock(d
26760 62 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69  b, pVtab);.    i
26770 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26780 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
26790 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56  pModule->xEof(pV
267a0 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
267b0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
267c0 33 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20  3SafetyOn(db) ) 
267d0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
267e0 6f 5f 6d 69 73 75 73 65 3b 0a 0a 20 20 20 20 69  o_misuse;..    i
267f0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
26800 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
26810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
26820 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  ur->nullRow = 0;
26830 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ..  break;.}.#en
26840 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
26850 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
26860 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
26870 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
26880 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
26890 56 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a  VRowid P1 P2 * *
268a0 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69   *.**.** Store i
268b0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20  nto register P2 
268c0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 2a 2a   the rowid of.**
268d0 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62   the virtual-tab
268e0 6c 65 20 74 68 61 74 20 74 68 65 20 50 31 20 63  le that the P1 c
268f0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
26900 67 20 74 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  g to..*/.case OP
26910 5f 56 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20  _VRowid: {      
26920 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
26930 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 73  rerelease */.  s
26940 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
26950 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
26960 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
26970 75 6c 65 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  ule;.  sqlite_in
26980 74 36 34 20 69 52 6f 77 3b 0a 20 20 56 64 62 65  t64 iRow;.  Vdbe
26990 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
269a0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
269b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
269c0 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  r->pVtabCursor )
269d0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75  ;.  if( pCur->nu
269e0 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62 72 65  llRow ){.    bre
269f0 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20  ak;.  }.  pVtab 
26a00 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  = pCur->pVtabCur
26a10 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  sor->pVtab;.  pM
26a20 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
26a30 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
26a40 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69  ( pModule->xRowi
26a50 64 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  d );.  if( sqlit
26a60 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 20  e3SafetyOff(db) 
26a70 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
26a80 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 72 63  _to_misuse;.  rc
26a90 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77   = pModule->xRow
26aa0 69 64 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75  id(pCur->pVtabCu
26ab0 72 73 6f 72 2c 20 26 69 52 6f 77 29 3b 0a 20 20  rsor, &iRow);.  
26ac0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
26ad0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
26ae0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56   p->zErrMsg = pV
26af0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  tab->zErrMsg;.  
26b00 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
26b10 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
26b20 33 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20  3SafetyOn(db) ) 
26b30 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
26b40 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 4d 65 6d 53  o_misuse;.  MemS
26b50 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
26b60 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 70 4f 75   MEM_Int);.  pOu
26b70 74 2d 3e 75 2e 69 20 3d 20 69 52 6f 77 3b 0a 20  t->u.i = iRow;. 
26b80 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
26b90 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
26ba0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
26bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26bc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
26bd0 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 6f  E./* Opcode: VCo
26be0 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20 2a 20  lumn P1 P2 P3 * 
26bf0 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68  *.**.** Store th
26c00 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
26c10 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  2-th column of.*
26c20 2a 20 74 68 65 20 72 6f 77 20 6f 66 20 74 68 65  * the row of the
26c30 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 74   virtual-table t
26c40 68 61 74 20 74 68 65 20 0a 2a 2a 20 50 31 20 63  hat the .** P1 c
26c50 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
26c60 67 20 74 6f 20 69 6e 74 6f 20 72 65 67 69 73 74  g to into regist
26c70 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P3..*/.case O
26c80 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 73  P_VColumn: {.  s
26c90 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
26ca0 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ab;.  const sqli
26cb0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
26cc0 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44 65 73  ule;.  Mem *pDes
26cd0 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t;.  sqlite3_con
26ce0 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 0a  text sContext;..
26cf0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
26d00 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ur = p->apCsr[pO
26d10 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
26d20 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  ( pCur->pVtabCur
26d30 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
26d40 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f   pOp->p3>0 && pO
26d50 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p3<=p->nMem )
26d60 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 70 2d 3e  ;.  pDest = &p->
26d70 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
26d80 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52   if( pCur->nullR
26d90 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ow ){.    sqlite
26da0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
26db0 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61  pDest);.    brea
26dc0 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d  k;.  }.  pVtab =
26dd0 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73   pCur->pVtabCurs
26de0 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f  or->pVtab;.  pMo
26df0 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
26e00 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  odule;.  assert(
26e10 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d   pModule->xColum
26e20 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n );.  memset(&s
26e30 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65  Context, 0, size
26e40 6f 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a  of(sContext));..
26e50 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
26e60 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79  cell may already
26e70 20 68 61 76 65 20 61 20 62 75 66 66 65 72 20 61   have a buffer a
26e80 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20  llocated. Move. 
26e90 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
26ea0 63 6f 6e 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e  contents to sCon
26eb0 74 65 78 74 2e 73 20 73 6f 20 69 6e 20 63 61 73  text.s so in cas
26ec0 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74  e the user-funct
26ed0 69 6f 6e 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73  ion .  ** can us
26ee0 65 20 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c  e the already al
26ef0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 69  located buffer i
26f00 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61  nstead of alloca
26f10 74 69 6e 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77  ting a .  ** new
26f20 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   one..  */.  sql
26f30 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
26f40 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65  &sContext.s, pDe
26f50 73 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70  st);.  MemSetTyp
26f60 65 46 6c 61 67 28 26 73 43 6f 6e 74 65 78 74 2e  eFlag(&sContext.
26f70 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20  s, MEM_Null);.. 
26f80 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
26f90 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f  tyOff(db) ) goto
26fa0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69   abort_due_to_mi
26fb0 73 75 73 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f  suse;.  rc = pMo
26fc0 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43  dule->xColumn(pC
26fd0 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2c  ur->pVtabCursor,
26fe0 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70 2d   &sContext, pOp-
26ff0 3e 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >p2);.  sqlite3D
27000 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
27010 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
27020 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72  Msg = pVtab->zEr
27030 72 4d 73 67 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  rMsg;.  pVtab->z
27040 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f  ErrMsg = 0;..  /
27050 2a 20 43 6f 70 79 20 74 68 65 20 72 65 73 75 6c  * Copy the resul
27060 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
27070 6e 20 74 6f 20 74 68 65 20 50 33 20 72 65 67 69  n to the P3 regi
27080 73 74 65 72 2e 20 57 65 0a 20 20 2a 2a 20 64 6f  ster. We.  ** do
27090 20 74 68 69 73 20 72 65 67 61 72 64 6c 65 73 73   this regardless
270a0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
270b0 6f 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ot an error occu
270c0 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6e  red to ensure an
270d0 79 0a 20 20 2a 2a 20 64 79 6e 61 6d 69 63 20 61  y.  ** dynamic a
270e0 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 73 43 6f  llocation in sCo
270f0 6e 74 65 78 74 2e 73 20 28 61 20 4d 65 6d 20 73  ntext.s (a Mem s
27100 74 72 75 63 74 29 20 69 73 20 20 72 65 6c 65 61  truct) is  relea
27110 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
27120 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
27130 6f 64 69 6e 67 28 26 73 43 6f 6e 74 65 78 74 2e  oding(&sContext.
27140 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  s, encoding);.  
27150 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
27160 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a  Op->p3, pDest);.
27170 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
27180 4d 6f 76 65 28 70 44 65 73 74 2c 20 26 73 43 6f  Move(pDest, &sCo
27190 6e 74 65 78 74 2e 73 29 3b 0a 20 20 55 50 44 41  ntext.s);.  UPDA
271a0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
271b0 70 44 65 73 74 29 3b 0a 0a 20 20 69 66 28 20 73  pDest);..  if( s
271c0 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
271d0 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  b) ){.    goto a
271e0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75  bort_due_to_misu
271f0 73 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  se;.  }.  if( sq
27200 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42  lite3VdbeMemTooB
27210 69 67 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  ig(pDest) ){.   
27220 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
27230 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
27240 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
27250 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
27260 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
27270 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
27280 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
27290 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a   VNext P1 P2 * *
272a0 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65   *.**.** Advance
272b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50   virtual table P
272c0 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  1 to the next ro
272d0 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20  w in its result 
272e0 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20  set and.** jump 
272f0 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
27300 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76  2.  Or, if the v
27310 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73  irtual table has
27320 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20   reached.** the 
27330 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c  end of its resul
27340 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c  t set, then fall
27350 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
27360 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
27370 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65  ..*/.case OP_VNe
27380 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  xt: {   /* jump 
27390 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
273a0 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
273b0 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
273c0 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74   *pModule;.  int
273d0 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20 56 64 62   res = 0;..  Vdb
273e0 65 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  eCursor *pCur = 
273f0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
27400 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
27410 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  r->pVtabCursor )
27420 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75  ;.  if( pCur->nu
27430 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62 72 65  llRow ){.    bre
27440 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20  ak;.  }.  pVtab 
27450 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  = pCur->pVtabCur
27460 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  sor->pVtab;.  pM
27470 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
27480 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
27490 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  ( pModule->xNext
274a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65   );..  /* Invoke
274b0 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74   the xNext() met
274c0 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  hod of the modul
274d0 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77  e. There is no w
274e0 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ay for the.  ** 
274f0 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c 65  underlying imple
27500 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65 74  mentation to ret
27510 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20  urn an error if 
27520 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  one occurs durin
27530 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e 20  g.  ** xNext(). 
27540 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e 20 65  Instead, if an e
27550 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 72 75  rror occurs, tru
27560 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 69  e is returned (i
27570 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 0a  ndicating that .
27580 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61    ** data is ava
27590 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68 65 20  ilable) and the 
275a0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
275b0 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d 6e  ned when xColumn
275c0 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74   or.  ** some ot
275d0 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20 6e 65  her method is ne
275e0 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  xt invoked on th
275f0 65 20 73 61 76 65 20 76 69 72 74 75 61 6c 20 74  e save virtual t
27600 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a  able cursor..  *
27610 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  /.  if( sqlite3S
27620 61 66 65 74 79 4f 66 66 28 64 62 29 20 29 20 67  afetyOff(db) ) g
27630 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
27640 5f 6d 69 73 75 73 65 3b 0a 20 20 73 71 6c 69 74  _misuse;.  sqlit
27650 65 33 56 74 61 62 4c 6f 63 6b 28 70 56 74 61 62  e3VtabLock(pVtab
27660 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  );.  p->inVtabMe
27670 74 68 6f 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d  thod = 1;.  rc =
27680 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28   pModule->xNext(
27690 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
276a0 72 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d  r);.  p->inVtabM
276b0 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 73 71 6c  ethod = 0;.  sql
276c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
276d0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
276e0 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62  >zErrMsg = pVtab
276f0 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70 56 74  ->zErrMsg;.  pVt
27700 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
27710 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
27720 6c 6f 63 6b 28 64 62 2c 20 70 56 74 61 62 29 3b  lock(db, pVtab);
27730 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 73 20  E_OK ){.    res 
27750 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28  = pModule->xEof(
27760 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
27770 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  r);.  }.  if( sq
27780 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
27790 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
277a0 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 0a 20  ue_to_misuse;.. 
277b0 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20   if( !res ){.   
277c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
277d0 64 61 74 61 2c 20 6a 75 6d 70 20 74 6f 20 50 32  data, jump to P2
277e0 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   */.    pc = pOp
277f0 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
27800 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
27810 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
27820 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
27830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27840 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
27850 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e  ./* Opcode: VRen
27860 61 6d 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ame P1 * * P4 *.
27870 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f  **.** P4 is a po
27880 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75  inter to a virtu
27890 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c  al table object,
278a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
278b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
278c0 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
278d0 65 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  es the correspon
278e0 64 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d 65 74  ding xRename met
278f0 68 6f 64 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a  hod. The value.*
27900 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  * in register P1
27910 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
27920 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74  e zName argument
27930 20 74 6f 20 74 68 65 20 78 52 65 6e 61 6d 65 20   to the xRename 
27940 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20  method..*/.case 
27950 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20  OP_VRename: {.  
27960 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
27970 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
27980 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d  tab;.  Mem *pNam
27990 65 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  e = &p->aMem[pOp
279a0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
279b0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
279c0 3e 78 52 65 6e 61 6d 65 20 29 3b 0a 20 20 52 45  >xRename );.  RE
279d0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
279e0 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 0a 20  ->p1, pName);.. 
279f0 20 53 74 72 69 6e 67 69 66 79 28 70 4e 61 6d 65   Stringify(pName
27a00 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20  , encoding);..  
27a10 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  if( sqlite3Safet
27a20 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20  yOff(db) ) goto 
27a30 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
27a40 75 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  use;.  sqlite3Vt
27a50 61 62 4c 6f 63 6b 28 70 56 74 61 62 29 3b 0a 20  abLock(pVtab);. 
27a60 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
27a70 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56  dule->xRename(pV
27a80 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  tab, pName->z);.
27a90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27aa0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
27ab0 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
27ac0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a  pVtab->zErrMsg;.
27ad0 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
27ae0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56   = 0;.  sqlite3V
27af0 74 61 62 55 6e 6c 6f 63 6b 28 64 62 2c 20 70 56  tabUnlock(db, pV
27b00 74 61 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tab);.  if( sqli
27b10 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 20  te3SafetyOn(db) 
27b20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
27b30 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 0a 20 20 62  _to_misuse;..  b
27b40 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
27b50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27b60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
27b70 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 55 70 64  ./* Opcode: VUpd
27b80 61 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ate P1 P2 P3 P4 
27b90 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
27ba0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72  pointer to a vir
27bb0 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63  tual table objec
27bc0 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  t, an sqlite3_vt
27bd0 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ab structure..**
27be0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76   This opcode inv
27bf0 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73 70  okes the corresp
27c00 6f 6e 64 69 6e 67 20 78 55 70 64 61 74 65 20 6d  onding xUpdate m
27c10 65 74 68 6f 64 2e 20 50 32 20 76 61 6c 75 65 73  ethod. P2 values
27c20 0a 2a 2a 20 61 72 65 20 63 6f 6e 74 69 67 75 6f  .** are contiguo
27c30 75 73 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  us memory cells 
27c40 73 74 61 72 74 69 6e 67 20 61 74 20 50 33 20 74  starting at P3 t
27c50 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 78 55  o pass to the xU
27c60 70 64 61 74 65 20 0a 2a 2a 20 69 6e 76 6f 63 61  pdate .** invoca
27c70 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
27c80 69 6e 20 72 65 67 69 73 74 65 72 20 28 50 33 2b  in register (P3+
27c90 50 32 2d 31 29 20 63 6f 72 72 65 73 70 6f 6e 64  P2-1) correspond
27ca0 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 32 74  s to the .** p2t
27cb0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
27cc0 20 61 72 67 76 20 61 72 72 61 79 20 70 61 73 73   argv array pass
27cd0 65 64 20 74 6f 20 78 55 70 64 61 74 65 2e 0a 2a  ed to xUpdate..*
27ce0 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64 61 74 65  *.** The xUpdate
27cf0 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 64 6f 20   method will do 
27d00 61 20 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49  a DELETE or an I
27d10 4e 53 45 52 54 20 6f 72 20 62 6f 74 68 2e 0a 2a  NSERT or both..*
27d20 2a 20 54 68 65 20 61 72 67 76 5b 30 5d 20 65 6c  * The argv[0] el
27d30 65 6d 65 6e 74 20 28 77 68 69 63 68 20 63 6f 72  ement (which cor
27d40 72 65 73 70 6f 6e 64 73 20 74 6f 20 6d 65 6d 6f  responds to memo
27d50 72 79 20 63 65 6c 6c 20 50 33 29 0a 2a 2a 20 69  ry cell P3).** i
27d60 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61  s the rowid of a
27d70 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20   row to delete. 
27d80 20 49 66 20 61 72 67 76 5b 30 5d 20 69 73 20 4e   If argv[0] is N
27d90 55 4c 4c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  ULL then no .** 
27da0 64 65 6c 65 74 69 6f 6e 20 6f 63 63 75 72 73 2e  deletion occurs.
27db0 20 20 54 68 65 20 61 72 67 76 5b 31 5d 20 65 6c    The argv[1] el
27dc0 65 6d 65 6e 74 20 69 73 20 74 68 65 20 72 6f 77  ement is the row
27dd0 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 0a 2a  id of the new .*
27de0 2a 20 72 6f 77 2e 20 20 54 68 69 73 20 63 61 6e  * row.  This can
27df0 20 62 65 20 4e 55 4c 4c 20 74 6f 20 68 61 76 65   be NULL to have
27e00 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
27e10 6c 65 20 73 65 6c 65 63 74 20 74 68 65 20 6e 65  le select the ne
27e20 77 20 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20  w .** rowid for 
27e30 69 74 73 65 6c 66 2e 20 20 54 68 65 20 73 75 62  itself.  The sub
27e40 73 65 71 75 65 6e 74 20 65 6c 65 6d 65 6e 74 73  sequent elements
27e50 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 61 72   in the array ar
27e60 65 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  e .** the values
27e70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
27e80 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a  he new row..**.*
27e90 2a 20 49 66 20 50 32 3d 3d 31 20 74 68 65 6e 20  * If P2==1 then 
27ea0 6e 6f 20 69 6e 73 65 72 74 20 69 73 20 70 65 72  no insert is per
27eb0 66 6f 72 6d 65 64 2e 20 20 61 72 67 76 5b 30 5d  formed.  argv[0]
27ec0 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66   is the rowid of
27ed0 0a 2a 2a 20 61 20 72 6f 77 20 74 6f 20 64 65 6c  .** a row to del
27ee0 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  ete..**.** P1 is
27ef0 20 61 20 62 6f 6f 6c 65 61 6e 20 66 6c 61 67 2e   a boolean flag.
27f00 20 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f   If it is set to
27f10 20 74 72 75 65 20 61 6e 64 20 74 68 65 20 78 55   true and the xU
27f20 70 64 61 74 65 20 63 61 6c 6c 0a 2a 2a 20 69 73  pdate call.** is
27f30 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
27f40 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
27f50 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
27f60 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
27f70 64 28 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74  d() .** is set t
27f80 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
27f90 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
27fa0 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74   row just insert
27fb0 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ed..*/.case OP_V
27fc0 55 70 64 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69  Update: {.  sqli
27fd0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
27fe0 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b  = pOp->p4.pVtab;
27ff0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  .  sqlite3_modul
28000 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71  e *pModule = (sq
28010 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70  lite3_module *)p
28020 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
28030 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 4f 70 2d   int nArg = pOp-
28040 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p2;.  assert( p
28050 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56  Op->p4type==P4_V
28060 54 41 42 20 29 3b 0a 20 20 69 66 28 20 70 4d 6f  TAB );.  if( pMo
28070 64 75 6c 65 2d 3e 78 55 70 64 61 74 65 3d 3d 30  dule->xUpdate==0
28080 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
28090 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
280a0 72 4d 73 67 2c 20 64 62 2c 20 22 72 65 61 64 2d  rMsg, db, "read-
280b0 6f 6e 6c 79 20 74 61 62 6c 65 22 29 3b 0a 20 20  only table");.  
280c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
280d0 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
280e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
280f0 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 3b  ite_int64 rowid;
28100 0a 20 20 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67  .    Mem **apArg
28110 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 20   = p->apArg;.   
28120 20 4d 65 6d 20 2a 70 58 20 3d 20 26 70 2d 3e 61   Mem *pX = &p->a
28130 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
28140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
28150 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  g; i++){.      s
28160 74 6f 72 65 54 79 70 65 49 6e 66 6f 28 70 58 2c  toreTypeInfo(pX,
28170 20 30 29 3b 0a 20 20 20 20 20 20 61 70 41 72 67   0);.      apArg
28180 5b 69 5d 20 3d 20 70 58 3b 0a 20 20 20 20 20 20  [i] = pX;.      
28190 70 58 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pX++;.    }.    
281a0 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  if( sqlite3Safet
281b0 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20  yOff(db) ) goto 
281c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
281d0 75 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  use;.    sqlite3
281e0 56 74 61 62 4c 6f 63 6b 28 70 56 74 61 62 29 3b  VtabLock(pVtab);
281f0 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  .    rc = pModul
28200 65 2d 3e 78 55 70 64 61 74 65 28 70 56 74 61 62  e->xUpdate(pVtab
28210 2c 20 6e 41 72 67 2c 20 61 70 41 72 67 2c 20 26  , nArg, apArg, &
28220 72 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  rowid);.    sqli
28230 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
28240 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
28250 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61  ->zErrMsg = pVta
28260 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20  b->zErrMsg;.    
28270 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
28280 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
28290 74 61 62 55 6e 6c 6f 63 6b 28 64 62 2c 20 70 56  tabUnlock(db, pV
282a0 74 61 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  tab);.    if( sq
282b0 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
282c0 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
282d0 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20  ue_to_misuse;.  
282e0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 26 26    if( pOp->p1 &&
282f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28300 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28310 6e 41 72 67 3e 31 20 26 26 20 61 70 41 72 67 5b  nArg>1 && apArg[
28320 30 5d 20 26 26 20 28 61 70 41 72 67 5b 30 5d 2d  0] && (apArg[0]-
28330 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29  >flags&MEM_Null)
28340 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61   );.      db->la
28350 73 74 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b  stRowid = rowid;
28360 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43  .    }.    p->nC
28370 68 61 6e 67 65 2b 2b 3b 0a 20 20 7d 0a 20 20 62  hange++;.  }.  b
28380 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
28390 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
283a0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
283b0 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f 4f  ifndef  SQLITE_O
283c0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
283d0 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67  S./* Opcode: Pag
283e0 65 63 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a  ecount P1 P2 * *
283f0 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
28400 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
28410 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
28420 74 61 62 61 73 65 20 50 31 20 74 6f 20 6d 65 6d  tabase P1 to mem
28430 6f 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a  ory cell P2..*/.
28440 63 61 73 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e  case OP_Pagecoun
28450 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
28460 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
28470 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 20 3d  se */.  int p1 =
28480 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 69 6e 74   pOp->p1; .  int
28490 20 6e 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20   nPage;.  Pager 
284a0 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
284b0 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
284c0 61 44 62 5b 70 31 5d 2e 70 42 74 29 3b 0a 0a 20  aDb[p1].pBt);.. 
284d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
284e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
284f0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
28500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28510 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
28520 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
28530 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e     pOut->u.i = n
28540 50 61 67 65 3b 0a 20 20 7d 0a 20 20 62 72 65 61  Page;.  }.  brea
28550 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  k;.}.#endif..#if
28560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28570 5f 54 52 41 43 45 0a 2f 2a 20 4f 70 63 6f 64 65  _TRACE./* Opcode
28580 3a 20 54 72 61 63 65 20 2a 20 2a 20 2a 20 50 34  : Trace * * * P4
28590 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 61 63   *.**.** If trac
285a0 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20 28  ing is enabled (
285b0 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  by the sqlite3_t
285c0 72 61 63 65 28 29 29 20 69 6e 74 65 72 66 61 63  race()) interfac
285d0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 55  e, then.** the U
285e0 54 46 2d 38 20 73 74 72 69 6e 67 20 63 6f 6e 74  TF-8 string cont
285f0 61 69 6e 65 64 20 69 6e 20 50 34 20 69 73 20 65  ained in P4 is e
28600 6d 69 74 74 65 64 20 6f 6e 20 74 68 65 20 74 72  mitted on the tr
28610 61 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ace callback..*/
28620 0a 63 61 73 65 20 4f 50 5f 54 72 61 63 65 3a 20  .case OP_Trace: 
28630 7b 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65  {.  char *zTrace
28640 20 3d 20 28 70 4f 70 2d 3e 70 34 2e 7a 20 3f 20   = (pOp->p4.z ? 
28650 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20 70 2d 3e 7a  pOp->p4.z : p->z
28660 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 54 72 61  Sql);.  if( zTra
28670 63 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  ce ){.    if( db
28680 2d 3e 78 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->xTrace ){.    
28690 20 20 64 62 2d 3e 78 54 72 61 63 65 28 64 62 2d    db->xTrace(db-
286a0 3e 70 54 72 61 63 65 41 72 67 2c 20 7a 54 72 61  >pTraceArg, zTra
286b0 63 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ce);.    }.#ifde
286c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
286d0 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
286e0 73 20 26 20 53 51 4c 49 54 45 5f 53 71 6c 54 72  s & SQLITE_SqlTr
286f0 61 63 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ace)!=0 ){.     
28700 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28710 6e 74 66 28 22 53 51 4c 2d 74 72 61 63 65 3a 20  ntf("SQL-trace: 
28720 25 73 5c 6e 22 2c 20 7a 54 72 61 63 65 29 3b 0a  %s\n", zTrace);.
28730 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
28740 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
28750 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
28760 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  endif.../* Opcod
28770 65 3a 20 4e 6f 6f 70 20 2a 20 2a 20 2a 20 2a 20  e: Noop * * * * 
28780 2a 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 68 69  *.**.** Do nothi
28790 6e 67 2e 20 20 54 68 69 73 20 69 6e 73 74 72 75  ng.  This instru
287a0 63 74 69 6f 6e 20 69 73 20 6f 66 74 65 6e 20 75  ction is often u
287b0 73 65 66 75 6c 20 61 73 20 61 20 6a 75 6d 70 0a  seful as a jump.
287c0 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  ** destination..
287d0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 67  */./*.** The mag
287e0 69 63 20 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  ic Explain opcod
287f0 65 20 61 72 65 20 6f 6e 6c 79 20 69 6e 73 65 72  e are only inser
28800 74 65 64 20 77 68 65 6e 20 65 78 70 6c 61 69 6e  ted when explain
28810 3d 3d 32 20 28 77 68 69 63 68 0a 2a 2a 20 69 73  ==2 (which.** is
28820 20 74 6f 20 73 61 79 20 77 68 65 6e 20 74 68 65   to say when the
28830 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
28840 4c 41 4e 20 73 79 6e 74 61 78 20 69 73 20 75 73  LAN syntax is us
28850 65 64 2e 29 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ed.).** This opc
28860 6f 64 65 20 72 65 63 6f 72 64 73 20 69 6e 66 6f  ode records info
28870 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
28880 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 49 74 20   optimizer.  It 
28890 69 73 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 61  is the.** the sa
288a0 6d 65 20 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  me as a no-op.  
288b0 54 68 69 73 20 6f 70 63 6f 64 65 73 6e 65 76 65  This opcodesneve
288c0 72 20 61 70 70 65 61 72 73 20 69 6e 20 61 20 72  r appears in a r
288d0 65 61 6c 20 56 4d 20 70 72 6f 67 72 61 6d 2e 0a  eal VM program..
288e0 2a 2f 0a 64 65 66 61 75 6c 74 3a 20 7b 20 20 20  */.default: {   
288f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
28900 73 20 72 65 61 6c 6c 79 20 4f 50 5f 4e 6f 6f 70  s really OP_Noop
28910 20 61 6e 64 20 4f 50 5f 45 78 70 6c 61 69 6e 20   and OP_Explain 
28920 2a 2f 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  */.  break;.}../
28930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
28980 20 54 68 65 20 63 61 73 65 73 20 6f 66 20 74 68   The cases of th
28990 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65  e switch stateme
289a0 6e 74 20 61 62 6f 76 65 20 74 68 69 73 20 6c 69  nt above this li
289b0 6e 65 20 73 68 6f 75 6c 64 20 61 6c 6c 20 62 65  ne should all be
289c0 20 69 6e 64 65 6e 74 65 64 0a 2a 2a 20 62 79 20   indented.** by 
289d0 36 20 73 70 61 63 65 73 2e 20 20 42 75 74 20 74  6 spaces.  But t
289e0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 36 20 73  he left-most 6 s
289f0 70 61 63 65 73 20 68 61 76 65 20 62 65 65 6e 20  paces have been 
28a00 72 65 6d 6f 76 65 64 20 74 6f 20 69 6d 70 72 6f  removed to impro
28a10 76 65 20 74 68 65 0a 2a 2a 20 72 65 61 64 61 62  ve the.** readab
28a20 69 6c 69 74 79 2e 20 20 46 72 6f 6d 20 74 68 69  ility.  From thi
28a30 73 20 70 6f 69 6e 74 20 6f 6e 20 64 6f 77 6e 2c  s point on down,
28a40 20 74 68 65 20 6e 6f 72 6d 61 6c 20 69 6e 64 65   the normal inde
28a50 6e 74 61 74 69 6f 6e 20 72 75 6c 65 73 20 61 72  ntation rules ar
28a60 65 0a 2a 2a 20 72 65 73 74 6f 72 65 64 2e 0a 2a  e.** restored..*
28a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20  ************/.  
28ac0 20 20 7d 0a 0a 23 69 66 64 65 66 20 56 44 42 45    }..#ifdef VDBE
28ad0 5f 50 52 4f 46 49 4c 45 0a 20 20 20 20 7b 0a 20  _PROFILE.    {. 
28ae0 20 20 20 20 20 75 36 34 20 65 6c 61 70 73 65 64       u64 elapsed
28af0 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65   = sqlite3Hwtime
28b00 28 29 20 2d 20 73 74 61 72 74 3b 0a 20 20 20 20  () - start;.    
28b10 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 2b 3d    pOp->cycles +=
28b20 20 65 6c 61 70 73 65 64 3b 0a 20 20 20 20 20 20   elapsed;.      
28b30 70 4f 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66 20  pOp->cnt++;.#if 
28b40 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  0.        fprint
28b50 66 28 73 74 64 6f 75 74 2c 20 22 25 31 30 6c 6c  f(stdout, "%10ll
28b60 75 20 22 2c 20 65 6c 61 70 73 65 64 29 3b 0a 20  u ", elapsed);. 
28b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28b80 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74  bePrintOp(stdout
28b90 2c 20 6f 72 69 67 50 63 2c 20 26 70 2d 3e 61 4f  , origPc, &p->aO
28ba0 70 5b 6f 72 69 67 50 63 5d 29 3b 0a 23 65 6e 64  p[origPc]);.#end
28bb0 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  if.    }.#endif.
28bc0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
28bd0 6f 77 69 6e 67 20 63 6f 64 65 20 61 64 64 73 20  owing code adds 
28be0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 65 20 61  nothing to the a
28bf0 63 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c  ctual functional
28c00 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ity.    ** of th
28c10 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 74 20 69  e program.  It i
28c20 73 20 6f 6e 6c 79 20 68 65 72 65 20 66 6f 72 20  s only here for 
28c30 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
28c40 67 67 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e  gging..    ** On
28c50 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
28c60 20 69 74 20 64 6f 65 73 20 62 75 72 6e 20 43 50   it does burn CP
28c70 55 20 63 79 63 6c 65 73 20 65 76 65 72 79 20 74  U cycles every t
28c80 69 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 20 20  ime through.    
28c90 2a 2a 20 74 68 65 20 65 76 61 6c 75 61 74 6f 72  ** the evaluator
28ca0 20 6c 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 61   loop.  So we ca
28cb0 6e 20 6c 65 61 76 65 20 69 74 20 6f 75 74 20 77  n leave it out w
28cc0 68 65 6e 20 4e 44 45 42 55 47 20 69 73 20 64 65  hen NDEBUG is de
28cd0 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
28ce0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
28cf0 20 61 73 73 65 72 74 28 20 70 63 3e 3d 2d 31 20   assert( pc>=-1 
28d00 26 26 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  && pc<p->nOp );.
28d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28d20 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
28d30 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69  trace ){.      i
28d40 66 28 20 72 63 21 3d 30 20 29 20 66 70 72 69 6e  f( rc!=0 ) fprin
28d50 74 66 28 70 2d 3e 74 72 61 63 65 2c 22 72 63 3d  tf(p->trace,"rc=
28d60 25 64 5c 6e 22 2c 72 63 29 3b 0a 20 20 20 20 20  %d\n",rc);.     
28d70 20 69 66 28 20 6f 70 50 72 6f 70 65 72 74 79 20   if( opProperty 
28d80 26 20 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52 45  & OPFLG_OUT2_PRE
28d90 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20  RELEASE ){.     
28da0 20 20 20 72 65 67 69 73 74 65 72 54 72 61 63 65     registerTrace
28db0 28 70 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e  (p->trace, pOp->
28dc0 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20  p2, pOut);.     
28dd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 50   }.      if( opP
28de0 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f  roperty & OPFLG_
28df0 4f 55 54 33 20 29 7b 0a 20 20 20 20 20 20 20 20  OUT3 ){.        
28e00 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d  registerTrace(p-
28e10 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70 33 2c  >trace, pOp->p3,
28e20 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a   pOut);.      }.
28e30 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 20 2f 2a      }.#endif  /*
28e40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
28e50 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
28e60 55 47 20 2a 2f 0a 20 20 7d 20 20 2f 2a 20 54 68  UG */.  }  /* Th
28e70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 6f 72  e end of the for
28e80 28 3b 3b 29 20 6c 6f 6f 70 20 74 68 65 20 6c 6f  (;;) loop the lo
28e90 6f 70 73 20 74 68 72 6f 75 67 68 20 6f 70 63 6f  ops through opco
28ea0 64 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  des */..  /* If 
28eb0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
28ec0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
28ed0 61 74 20 65 78 65 63 75 74 69 6f 6e 20 69 73 20  at execution is 
28ee0 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 20 20  finished with.  
28ef0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 73  ** an error of s
28f00 6f 6d 65 20 6b 69 6e 64 2e 0a 20 20 2a 2f 0a 76  ome kind..  */.v
28f10 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3a 0a  dbe_error_halt:.
28f20 20 20 61 73 73 65 72 74 28 20 72 63 20 29 3b 0a    assert( rc );.
28f30 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
28f40 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
28f50 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
28f60 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28f70 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   ) db->mallocFai
28f80 6c 65 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  led = 1;.  rc = 
28f90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
28fa0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
28fb0 6f 6e 6c 79 20 77 61 79 20 6f 75 74 20 6f 66 20  only way out of 
28fc0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 20  this procedure. 
28fd0 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a   We have to.  **
28fe0 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74   release the mut
28ff0 65 78 65 73 20 6f 6e 20 62 74 72 65 65 73 20 74  exes on btrees t
29000 68 61 74 20 77 65 72 65 20 61 63 71 75 69 72 65  hat were acquire
29010 64 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 74 6f  d at the.  ** to
29020 70 2e 20 2a 2f 0a 76 64 62 65 5f 72 65 74 75 72  p. */.vdbe_retur
29030 6e 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n:.  sqlite3Btre
29040 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
29050 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
29060 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
29070 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
29080 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f   a string or blo
29090 62 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  b larger than SQ
290a0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
290b0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
290c0 72 65 64 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69  red..  */.too_bi
290d0 67 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53  g:.  sqlite3SetS
290e0 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
290f0 67 2c 20 64 62 2c 20 22 73 74 72 69 6e 67 20 6f  g, db, "string o
29100 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29  r blob too big")
29110 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
29120 54 4f 4f 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76  TOOBIG;.  goto v
29130 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a  dbe_error_halt;.
29140 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
29150 72 65 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  re if a malloc()
29160 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f   fails..  */.no_
29170 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f  mem:.  db->mallo
29180 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73  cFailed = 1;.  s
29190 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
291a0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
291b0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
291c0 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  );.  rc = SQLITE
291d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76  _NOMEM;.  goto v
291e0 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a  dbe_error_halt;.
291f0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
29200 72 65 20 66 6f 72 20 61 6e 20 53 51 4c 49 54 45  re for an SQLITE
29210 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 20  _MISUSE error.. 
29220 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f   */.abort_due_to
29230 5f 6d 69 73 75 73 65 3a 0a 20 20 72 63 20 3d 20  _misuse:.  rc = 
29240 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
29250 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
29260 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
29270 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 2f 2a 20 4a  error */..  /* J
29280 75 6d 70 20 74 6f 20 68 65 72 65 20 66 6f 72 20  ump to here for 
29290 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f  any other kind o
292a0 66 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 20 20  f fatal error.  
292b0 54 68 65 20 22 72 63 22 20 76 61 72 69 61 62 6c  The "rc" variabl
292c0 65 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 6f  e.  ** should ho
292d0 6c 64 20 74 68 65 20 65 72 72 6f 72 20 6e 75 6d  ld the error num
292e0 62 65 72 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f  ber..  */.abort_
292f0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3a 0a 20 20  due_to_error:.  
29300 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 4d  assert( p->zErrM
29310 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64  sg==0 );.  if( d
29320 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29330 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
29340 4d 45 4d 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  MEM;.  if( rc!=S
29350 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
29360 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
29370 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
29380 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
29390 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
293a0 63 29 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20  c));.  }.  goto 
293b0 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b  vdbe_error_halt;
293c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68  ..  /* Jump to h
293d0 65 72 65 20 69 66 20 74 68 65 20 73 71 6c 69 74  ere if the sqlit
293e0 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20 41  e3_interrupt() A
293f0 50 49 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  PI sets the inte
29400 72 72 75 70 74 0a 20 20 2a 2a 20 66 6c 61 67 2e  rrupt.  ** flag.
29410 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f  .  */.abort_due_
29420 74 6f 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20 20  to_interrupt:.  
29430 61 73 73 65 72 74 28 20 64 62 2d 3e 75 31 2e 69  assert( db->u1.i
29440 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 3b 0a  sInterrupted );.
29450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
29460 54 45 52 52 55 50 54 3b 0a 20 20 70 2d 3e 72 63  TERRUPT;.  p->rc
29470 20 3d 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33   = rc;.  sqlite3
29480 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
29490 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
294a0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
294b0 63 29 29 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65  c));.  goto vdbe
294c0 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 7d 0a     _error_halt;.}.