/ Hex Artifact Content
Login

Artifact a7b9ad4a1924fae36976391d3945b590066d8a9b:


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 35 32 20 32 30 30 39  e.c,v 1.852 2009
0850: 2f 30 36 2f 31 37 20 31 36 3a 32 30 3a 30 34 20  /06/17 16:20:04 
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 69 6e 74 20 6e 46 69 65 6c  r */.  int nFiel
1a80: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1a90: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
1aa0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1ab0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1ac0: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
1ad0: 20 20 2f 2a 20 57 68 65 6e 20 64 61 74 61 62 61    /* When databa
1ae0: 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  se the cursor be
1af0: 6c 6f 6e 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20  longs to, or -1 
1b00: 2a 2f 0a 20 20 69 6e 74 20 69 73 42 74 72 65 65  */.  int isBtree
1b10: 43 75 72 73 6f 72 20 20 20 20 20 2f 2a 20 54 72  Cursor     /* Tr
1b20: 75 65 20 66 6f 72 20 42 2d 54 72 65 65 20 76 73  ue for B-Tree vs
1b30: 2e 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 6f  . pseudo-table o
1b40: 72 20 76 74 61 62 20 2a 2f 0a 29 7b 0a 20 20 2f  r vtab */.){.  /
1b50: 2a 20 46 69 6e 64 20 74 68 65 20 6d 65 6d 6f 72  * Find the memor
1b60: 79 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  y cell that will
1b70: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
1b80: 65 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  e the blob of me
1b90: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
1ba0: 65 64 20 66 6f 72 20 74 68 69 73 20 56 64 62 65  ed for this Vdbe
1bb0: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
1bc0: 2e 20 49 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  . It is convenie
1bd0: 6e 74 20 74 6f 20 75 73 65 20 61 20 0a 20 20 2a  nt to use a .  *
1be0: 2a 20 76 64 62 65 20 6d 65 6d 6f 72 79 20 63 65  * vdbe memory ce
1bf0: 6c 6c 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65  ll to manage the
1c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1c10: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
1c20: 61 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  a.  ** VdbeCurso
1c30: 72 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  r structure for 
1c40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  the following re
1c50: 61 73 6f 6e 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  asons:.  **.  **
1c60: 20 20 20 2a 20 53 6f 6d 65 74 69 6d 65 73 20 63     * Sometimes c
1c70: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1c80: 65 20 75 73 65 64 20 66 6f 72 20 61 20 63 6f 75  e used for a cou
1c90: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
1ca0: 0a 20 20 2a 2a 20 20 20 20 20 70 75 72 70 6f 73  .  **     purpos
1cb0: 65 73 20 69 6e 20 61 20 76 64 62 65 20 70 72 6f  es in a vdbe pro
1cc0: 67 72 61 6d 2e 20 54 68 65 20 64 69 66 66 65 72  gram. The differ
1cd0: 65 6e 74 20 75 73 65 73 20 6d 69 67 68 74 20 72  ent uses might r
1ce0: 65 71 75 69 72 65 0a 20 20 2a 2a 20 20 20 20 20  equire.  **     
1cf0: 64 69 66 66 65 72 65 6e 74 20 73 69 7a 65 64 20  different sized 
1d00: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 4d 65 6d  allocations. Mem
1d10: 6f 72 79 20 63 65 6c 6c 73 20 70 72 6f 76 69 64  ory cells provid
1d20: 65 20 67 72 6f 77 61 62 6c 65 0a 20 20 2a 2a 20  e growable.  ** 
1d30: 20 20 20 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e      allocations.
1d40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
1d50: 68 65 6e 20 75 73 69 6e 67 20 45 4e 41 42 4c 45  hen using ENABLE
1d60: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1d70: 4e 54 2c 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  NT, memory cell 
1d80: 62 75 66 66 65 72 73 20 63 61 6e 0a 20 20 2a 2a  buffers can.  **
1d90: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 6c 61       be freed la
1da0: 7a 69 6c 79 20 76 69 61 20 74 68 65 20 73 71 6c  zily via the sql
1db0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1dc0: 6f 72 79 28 29 20 41 50 49 2e 20 54 68 69 73 0a  ory() API. This.
1dd0: 20 20 2a 2a 20 20 20 20 20 6d 69 6e 69 6d 69 7a    **     minimiz
1de0: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1df0: 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73 20 6d 61   malloc calls ma
1e00: 64 65 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  de by the system
1e10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 65 6d 6f  ..  **.  ** Memo
1e20: 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 63 75 72  ry cells for cur
1e30: 73 6f 72 73 20 61 72 65 20 61 6c 6c 6f 63 61 74  sors are allocat
1e40: 65 64 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ed at the top of
1e50: 20 74 68 65 20 61 64 64 72 65 73 73 0a 20 20 2a   the address.  *
1e60: 2a 20 73 70 61 63 65 2e 20 4d 65 6d 6f 72 79 20  * space. Memory 
1e70: 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d 29 20 63  cell (p->nMem) c
1e80: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63 75  orresponds to cu
1e90: 72 73 6f 72 20 30 2e 20 53 70 61 63 65 20 66 6f  rsor 0. Space fo
1ea0: 72 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 31 20  r.  ** cursor 1 
1eb0: 69 73 20 6d 61 6e 61 67 65 64 20 62 79 20 6d 65  is managed by me
1ec0: 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d  mory cell (p->nM
1ed0: 65 6d 2d 31 29 2c 20 65 74 63 2e 0a 20 20 2a 2f  em-1), etc..  */
1ee0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
1ef0: 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d  p->aMem[p->nMem-
1f00: 69 43 75 72 5d 3b 0a 0a 20 20 69 6e 74 20 6e 42  iCur];..  int nB
1f10: 79 74 65 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  yte;.  VdbeCurso
1f20: 72 20 2a 70 43 78 20 3d 20 30 3b 0a 20 20 6e 42  r *pCx = 0;.  nB
1f30: 79 74 65 20 3d 20 0a 20 20 20 20 20 20 73 69 7a  yte = .      siz
1f40: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 20  eof(VdbeCursor) 
1f50: 2b 20 0a 20 20 20 20 20 20 28 69 73 42 74 72 65  + .      (isBtre
1f60: 65 43 75 72 73 6f 72 3f 73 71 6c 69 74 65 33 42  eCursor?sqlite3B
1f70: 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
1f80: 3a 30 29 20 2b 20 0a 20 20 20 20 20 20 32 2a 6e  :0) + .      2*n
1f90: 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75 33 32  Field*sizeof(u32
1fa0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  );..  assert( iC
1fb0: 75 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  ur<p->nCursor );
1fc0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b  .  if( p->apCsr[
1fd0: 69 43 75 72 5d 20 29 7b 0a 20 20 20 20 73 71 6c  iCur] ){.    sql
1fe0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
1ff0: 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69  or(p, p->apCsr[i
2000: 43 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Cur]);.    p->ap
2010: 43 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b 0a 20  Csr[iCur] = 0;. 
2020: 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
2030: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
2040: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79  emGrow(pMem, nBy
2050: 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 2d  te, 0) ){.    p-
2060: 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 70  >apCsr[iCur] = p
2070: 43 78 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  Cx = (VdbeCursor
2080: 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d  *)pMem->z;.    m
2090: 65 6d 73 65 74 28 70 4d 65 6d 2d 3e 7a 2c 20 30  emset(pMem->z, 0
20a0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 43  , nByte);.    pC
20b0: 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  x->iDb = iDb;.  
20c0: 20 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20    pCx->nField = 
20d0: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20  nField;.    if( 
20e0: 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20  nField ){.      
20f0: 70 43 78 2d 3e 61 54 79 70 65 20 3d 20 28 75 33  pCx->aType = (u3
2100: 32 20 2a 29 26 70 4d 65 6d 2d 3e 7a 5b 73 69 7a  2 *)&pMem->z[siz
2110: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 5d  eof(VdbeCursor)]
2120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2130: 69 73 42 74 72 65 65 43 75 72 73 6f 72 20 29 7b  isBtreeCursor ){
2140: 0a 20 20 20 20 20 20 70 43 78 2d 3e 70 43 75 72  .      pCx->pCur
2150: 73 6f 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a  sor = (BtCursor*
2160: 29 0a 20 20 20 20 20 20 20 20 20 20 26 70 4d 65  ).          &pMe
2170: 6d 2d 3e 7a 5b 73 69 7a 65 6f 66 28 56 64 62 65  m->z[sizeof(Vdbe
2180: 43 75 72 73 6f 72 29 2b 32 2a 6e 46 69 65 6c 64  Cursor)+2*nField
2190: 2a 73 69 7a 65 6f 66 28 75 33 32 29 5d 3b 0a 20  *sizeof(u32)];. 
21a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21b0: 6e 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pCx;.}../*.** 
21c0: 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  Try to convert a
21d0: 20 76 61 6c 75 65 20 69 6e 74 6f 20 61 20 6e 75   value into a nu
21e0: 6d 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61  meric representa
21f0: 74 69 6f 6e 20 69 66 20 77 65 20 63 61 6e 0a 2a  tion if we can.*
2200: 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f 75 74 20  * do so without 
2210: 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
2220: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
2230: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 73 74 72  ords, if the str
2240: 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20 6c 69 6b  ing.** looks lik
2250: 65 20 61 20 6e 75 6d 62 65 72 2c 20 63 6f 6e 76  e a number, conv
2260: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 20 6e 75  ert it into a nu
2270: 6d 62 65 72 2e 20 20 49 66 20 69 74 20 64 6f 65  mber.  If it doe
2280: 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69  s not.** look li
2290: 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 6c 65 61  ke a number, lea
22a0: 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a 2a 2f 0a  ve it alone..*/.
22b0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c  static void appl
22c0: 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
22d0: 28 4d 65 6d 20 2a 70 52 65 63 29 7b 0a 20 20 69  (Mem *pRec){.  i
22e0: 66 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 20  f( (pRec->flags 
22f0: 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
2300: 49 6e 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Int))==0 ){.    
2310: 69 6e 74 20 72 65 61 6c 6e 75 6d 3b 0a 20 20 20  int realnum;.   
2320: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
2330: 75 6c 54 65 72 6d 69 6e 61 74 65 28 70 52 65 63  ulTerminate(pRec
2340: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63  );.    if( (pRec
2350: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ->flags&MEM_Str)
2360: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
2370: 69 74 65 33 49 73 4e 75 6d 62 65 72 28 70 52 65  ite3IsNumber(pRe
2380: 63 2d 3e 7a 2c 20 26 72 65 61 6c 6e 75 6d 2c 20  c->z, &realnum, 
2390: 70 52 65 63 2d 3e 65 6e 63 29 20 29 7b 0a 20 20  pRec->enc) ){.  
23a0: 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
23b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23c0: 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
23d0: 52 65 63 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Rec, SQLITE_UTF8
23e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65  );.      if( !re
23f0: 61 6c 6e 75 6d 20 26 26 20 73 71 6c 69 74 65 33  alnum && sqlite3
2400: 41 74 6f 69 36 34 28 70 52 65 63 2d 3e 7a 2c 20  Atoi64(pRec->z, 
2410: 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  &value) ){.     
2420: 20 20 20 70 52 65 63 2d 3e 75 2e 69 20 3d 20 76     pRec->u.i = v
2430: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 4d 65  alue;.        Me
2440: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 52 65  mSetTypeFlag(pRe
2450: 63 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20  c, MEM_Int);.   
2460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2480: 52 65 61 6c 69 66 79 28 70 52 65 63 29 3b 0a 20  Realify(pRec);. 
2490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  .}../*.** Proces
24b0: 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69 6e  sing is determin
24c0: 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69 74  e by the affinit
24d0: 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a 0a  y parameter:.**.
24e0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
24f0: 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54 45  TEGER:.** SQLITE
2500: 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53 51  _AFF_REAL:.** SQ
2510: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
2520: 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20 63  :.**    Try to c
2530: 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20 61  onvert pRec to a
2540: 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
2550: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a 2a  entation or a .*
2560: 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  *    floating-po
2570: 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  int representati
2580: 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65 72  on if an integer
2590: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
25a0: 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f 73  **    is not pos
25b0: 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61  sible.  Note tha
25c0: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 65  t the integer re
25d0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 0a  presentation is.
25e0: 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72 65  **    always pre
25f0: 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66 20  ferred, even if 
2600: 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73 20  the affinity is 
2610: 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a 2a  REAL, because.**
2620: 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 72      an integer r
2630: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2640: 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66 69   more space effi
2650: 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a  cient on disk..*
2660: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  *.** SQLITE_AFF_
2670: 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e 76  TEXT:.**    Conv
2680: 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74 65  ert pRec to a te
2690: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
26a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  n..**.** SQLITE_
26b0: 41 46 46 5f 4e 4f 4e 45 3a 0a 2a 2a 20 20 20 20  AFF_NONE:.**    
26c0: 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73 20  No-op.  pRec is 
26d0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
26e0: 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79 41  atic void applyA
26f0: 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20 2a  ffinity(.  Mem *
2700: 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 2f  pRec,          /
2710: 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20 61  * The value to a
2720: 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74 6f  pply affinity to
2730: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
2740: 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ity,      /* The
2750: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20   affinity to be 
2760: 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38 20  applied */.  u8 
2770: 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  enc             
2780: 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65 78   /* Use this tex
2790: 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29 7b  t encoding */.){
27a0: 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 3d  .  if( affinity=
27b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
27c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
27d0: 61 74 74 65 6d 70 74 20 74 68 65 20 63 6f 6e 76  attempt the conv
27e0: 65 72 73 69 6f 6e 20 74 6f 20 54 45 58 54 20 69  ersion to TEXT i
27f0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  f there is an in
2800: 74 65 67 65 72 20 6f 72 20 72 65 61 6c 0a 20 20  teger or real.  
2810: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
2820: 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64 20 4e 55  ion (blob and NU
2830: 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74 20 63 6f  LL do not get co
2840: 6e 76 65 72 74 65 64 29 20 62 75 74 20 6e 6f 20  nverted) but no 
2850: 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65  string.    ** re
2860: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 20  presentation..  
2870: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d    */.    if( 0==
2880: 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pRec->flags&MEM
2890: 5f 53 74 72 29 20 26 26 20 28 70 52 65 63 2d 3e  _Str) && (pRec->
28a0: 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61 6c 7c  flags&(MEM_Real|
28b0: 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20 20 20  MEM_Int)) ){.   
28c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
28d0: 6d 53 74 72 69 6e 67 69 66 79 28 70 52 65 63 2c  mStringify(pRec,
28e0: 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20   enc);.    }.   
28f0: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20   pRec->flags &= 
2900: 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49  ~(MEM_Real|MEM_I
2910: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  nt);.  }else if(
2920: 20 61 66 66 69 6e 69 74 79 21 3d 53 51 4c 49 54   affinity!=SQLIT
2930: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
2940: 20 20 61 73 73 65 72 74 28 20 61 66 66 69 6e 69    assert( affini
2950: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
2960: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 69 6e 69  NTEGER || affini
2970: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
2980: 45 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EAL.            
2990: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
29a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
29b0: 20 29 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d   );.    applyNum
29c0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 52 65  ericAffinity(pRe
29d0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63  c);.    if( pRec
29e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
29f0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
2a00: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
2a10: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
2a20: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2a30: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2a40: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2a50: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2a60: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2a70: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2a80: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2a90: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2aa0: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2ab0: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2ac0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2ad0: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2ae0: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2af0: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2b00: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2b10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2b20: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2b30: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2b40: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
2b50: 69 73 20 69 73 20 61 6e 20 45 58 50 45 52 49 4d  is is an EXPERIM
2b60: 45 4e 54 41 4c 20 61 70 69 20 61 6e 64 20 69 73  ENTAL api and is
2b70: 20 73 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e   subject to chan
2b80: 67 65 20 6f 72 20 72 65 6d 6f 76 61 6c 2e 0a 2a  ge or removal..*
2b90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 61  /.int sqlite3_va
2ba0: 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65  lue_numeric_type
2bb0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
2bc0: 70 56 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a 70 4d  pVal){.  Mem *pM
2bd0: 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b  em = (Mem*)pVal;
2be0: 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41  .  applyNumericA
2bf0: 66 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a 20  ffinity(pMem);. 
2c00: 20 73 74 6f 72 65 54 79 70 65 49 6e 66 6f 28 70   storeTypeInfo(p
2c10: 4d 65 6d 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Mem, 0);.  retur
2c20: 6e 20 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a 7d 0a  n pMem->type;.}.
2c30: 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20  ./*.** Exported 
2c40: 76 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79  version of apply
2c50: 41 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73  Affinity(). This
2c60: 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71   one works on sq
2c70: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a  lite3_value*, .*
2c80: 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e  * not the intern
2c90: 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f  al Mem* type..*/
2ca0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c  .void sqlite3Val
2cb0: 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
2cc0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2cd0: 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66   *pVal, .  u8 af
2ce0: 66 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e  finity, .  u8 en
2cf0: 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69  c.){.  applyAffi
2d00: 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c  nity((Mem *)pVal
2d10: 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29  , affinity, enc)
2d20: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2d30: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57  TE_DEBUG./*.** W
2d40: 72 69 74 65 20 61 20 6e 69 63 65 20 73 74 72 69  rite a nice stri
2d50: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
2d60: 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  n of the content
2d70: 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a  s of cell pMem.*
2d80: 2a 20 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42  * into buffer zB
2d90: 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e  uf, length nBuf.
2da0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2db0: 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69  VdbeMemPrettyPri
2dc0: 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68  nt(Mem *pMem, ch
2dd0: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61  ar *zBuf){.  cha
2de0: 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a  r *zCsr = zBuf;.
2df0: 20 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e    int f = pMem->
2e00: 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63  flags;..  static
2e10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
2e20: 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20  st encnames[] = 
2e30: 7b 22 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22  {"(X)", "(8)", "
2e40: 28 31 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29  (16LE)", "(16BE)
2e50: 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d  "};..  if( f&MEM
2e60: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74  _Blob ){.    int
2e70: 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   i;.    char c;.
2e80: 20 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f      if( f & MEM_
2e90: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  Dyn ){.      c =
2ea0: 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'z';.      asse
2eb0: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
2ec0: 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  atic|MEM_Ephem))
2ed0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
2ee0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61   if( f & MEM_Sta
2ef0: 74 69 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  tic ){.      c =
2f00: 20 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65   't';.      asse
2f10: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79  rt( (f & (MEM_Dy
2f20: 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30  n|MEM_Ephem))==0
2f30: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
2f40: 28 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20  ( f & MEM_Ephem 
2f50: 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27  ){.      c = 'e'
2f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2f70: 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63  (f & (MEM_Static
2f80: 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b  |MEM_Dyn))==0 );
2f90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fa0: 20 20 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d    c = 's';.    }
2fb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
2fc0: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
2fd0: 2c 20 22 25 63 22 2c 20 63 29 3b 0a 20 20 20 20  , "%c", c);.    
2fe0: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
2ff0: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3000: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3010: 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22  ntf(100, zCsr, "
3020: 25 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a  %d[", pMem->n);.
3030: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
3040: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
3050: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
3060: 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e  i<16 && i<pMem->
3070: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
3080: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3090: 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 30 32 58  100, zCsr, "%02X
30a0: 22 2c 20 28 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a  ", ((int)pMem->z
30b0: 5b 69 5d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  [i] & 0xFF));.  
30c0: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
30d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
30e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
30f0: 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c  (i=0; i<16 && i<
3100: 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pMem->n; i++){. 
3110: 20 20 20 20 20 63 68 61 72 20 7a 20 3d 20 70 4d       char z = pM
3120: 65 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  em->z[i];.      
3130: 69 66 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32  if( z<32 || z>12
3140: 36 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e  6 ) *zCsr++ = '.
3150: 27 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 2a 7a  ';.      else *z
3160: 43 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d  Csr++ = z;.    }
3170: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
3180: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
3190: 2c 20 22 5d 25 73 22 2c 20 65 6e 63 6e 61 6d 65  , "]%s", encname
31a0: 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20  s[pMem->enc]);. 
31b0: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74     zCsr += sqlit
31c0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29  e3Strlen30(zCsr)
31d0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
31e0: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
31f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3200: 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a  (100, zCsr,"+%dz
3210: 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29  ",pMem->u.nZero)
3220: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3230: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3240: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
3250: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
3260: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
3270: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e  EM_Str ){.    in
3280: 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66  t j, k;.    zBuf
3290: 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [0] = ' ';.    i
32a0: 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29  f( f & MEM_Dyn )
32b0: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
32c0: 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'z';.      ass
32d0: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
32e0: 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29  tatic|MEM_Ephem)
32f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3300: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
3310: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42  atic ){.      zB
3320: 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20  uf[1] = 't';.   
3330: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3340: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
3350: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
3360: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3370: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
3380: 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20  zBuf[1] = 'e';. 
3390: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
33a0: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
33b0: 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20  M_Dyn))==0 );.  
33c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
33d0: 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20  Buf[1] = 's';.  
33e0: 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20    }.    k = 2;. 
33f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3400: 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b  ntf(100, &zBuf[k
3410: 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e  ], "%d", pMem->n
3420: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3430: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3440: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3450: 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20  k++] = '[';.    
3460: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26  for(j=0; j<15 &&
3470: 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29   j<pMem->n; j++)
3480: 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d 20 70  {.      u8 c = p
3490: 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20  Mem->z[j];.     
34a0: 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20   if( c>=0x20 && 
34b0: 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20  c<0x7f ){.      
34c0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b    zBuf[k++] = c;
34d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34e0: 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20        zBuf[k++] 
34f0: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = '.';.      }. 
3500: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b     }.    zBuf[k+
3510: 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71  +] = ']';.    sq
3520: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
3530: 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63  00,&zBuf[k], enc
3540: 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d  names[pMem->enc]
3550: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3560: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3570: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3580: 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  k++] = 0;.  }.}.
3590: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
35a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
35b0: 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75  * Print the valu
35c0: 65 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20  e of a register 
35d0: 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75 72 70  for tracing purp
35e0: 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  oses:.*/.static 
35f0: 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69  void memTracePri
3600: 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 4d 65  nt(FILE *out, Me
3610: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  m *p){.  if( p->
3620: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
3630: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3640: 6f 75 74 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a 20  out, " NULL");. 
3650: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 66   }else if( (p->f
3660: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  lags & (MEM_Int|
3670: 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f  MEM_Str))==(MEM_
3680: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a  Int|MEM_Str) ){.
3690: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
36a0: 20 22 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e   " si:%lld", p->
36b0: 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  u.i);.  }else if
36c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
36d0: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  _Int ){.    fpri
36e0: 6e 74 66 28 6f 75 74 2c 20 22 20 69 3a 25 6c 6c  ntf(out, " i:%ll
36f0: 64 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 23 69 66  d", p->u.i);.#if
3700: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3710: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
3720: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66    }else if( p->f
3730: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
3740: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
3750: 75 74 2c 20 22 20 72 3a 25 67 22 2c 20 70 2d 3e  ut, " r:%g", p->
3760: 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  r);.#endif.  }el
3770: 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  se if( p->flags 
3780: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a  & MEM_RowSet ){.
3790: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
37a0: 20 22 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20   " (rowset)");. 
37b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
37c0: 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20   zBuf[200];.    
37d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
37e0: 65 74 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75  ettyPrint(p, zBu
37f0: 66 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  f);.    fprintf(
3800: 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 66  out, " ");.    f
3810: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
3820: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 73  , zBuf);.  }.}.s
3830: 74 61 74 69 63 20 76 6f 69 64 20 72 65 67 69 73  tatic void regis
3840: 74 65 72 54 72 61 63 65 28 46 49 4c 45 20 2a 6f  terTrace(FILE *o
3850: 75 74 2c 20 69 6e 74 20 69 52 65 67 2c 20 4d 65  ut, int iReg, Me
3860: 6d 20 2a 70 29 7b 0a 20 20 66 70 72 69 6e 74 66  m *p){.  fprintf
3870: 28 6f 75 74 2c 20 22 52 45 47 5b 25 64 5d 20 3d  (out, "REG[%d] =
3880: 20 22 2c 20 69 52 65 67 29 3b 0a 20 20 6d 65 6d   ", iReg);.  mem
3890: 54 72 61 63 65 50 72 69 6e 74 28 6f 75 74 2c 20  TracePrint(out, 
38a0: 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  p);.  fprintf(ou
38b0: 74 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64  t, "\n");.}.#end
38c0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
38d0: 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e  E_DEBUG.#  defin
38e0: 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45  e REGISTER_TRACE
38f0: 28 52 2c 4d 29 20 69 66 28 70 2d 3e 74 72 61 63  (R,M) if(p->trac
3900: 65 29 72 65 67 69 73 74 65 72 54 72 61 63 65 28  e)registerTrace(
3910: 70 2d 3e 74 72 61 63 65 2c 52 2c 4d 29 0a 23 65  p->trace,R,M).#e
3920: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45  lse.#  define RE
3930: 47 49 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d  GISTER_TRACE(R,M
3940: 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  ).#endif...#ifde
3950: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a  f VDBE_PROFILE..
3960: 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20  /* .** hwtime.h 
3970: 63 6f 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20  contains inline 
3980: 61 73 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66  assembler code f
3990: 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  or implementing 
39a0: 0a 2a 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d  .** high-perform
39b0: 61 6e 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74  ance timing rout
39c0: 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ines..*/.#includ
39d0: 65 20 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65  e "hwtime.h"..#e
39e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
39f0: 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
3a00: 55 50 54 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  UPT macro define
3a10: 64 20 68 65 72 65 20 6c 6f 6f 6b 73 20 74 6f 20  d here looks to 
3a20: 73 65 65 20 69 66 20 74 68 65 0a 2a 2a 20 73 71  see if the.** sq
3a30: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
3a40: 29 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  ) routine has be
3a50: 65 6e 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  en called.  If i
3a60: 74 20 68 61 73 20 62 65 65 6e 2c 20 74 68 65 6e  t has been, then
3a70: 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  .** processing o
3a80: 66 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  f the VDBE progr
3a90: 61 6d 20 69 73 20 69 6e 74 65 72 72 75 70 74 65  am is interrupte
3aa0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  d..**.** This ma
3ab0: 63 72 6f 20 61 64 64 65 64 20 74 6f 20 65 76 65  cro added to eve
3ac0: 72 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ry instruction t
3ad0: 68 61 74 20 64 6f 65 73 20 61 20 6a 75 6d 70 20  hat does a jump 
3ae0: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 69  in order to.** i
3af0: 6d 70 6c 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 2e  mplement a loop.
3b00: 20 20 54 68 69 73 20 74 65 73 74 20 75 73 65 64    This test used
3b10: 20 74 6f 20 62 65 20 6f 6e 20 65 76 65 72 79 20   to be on every 
3b20: 73 69 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69  single instructi
3b30: 6f 6e 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74 20  on,.** but that 
3b40: 6d 65 61 6e 74 20 77 65 20 6d 6f 72 65 20 74 65  meant we more te
3b50: 73 74 69 6e 67 20 74 68 61 74 20 77 65 20 6e 65  sting that we ne
3b60: 65 64 65 64 2e 20 20 42 79 20 6f 6e 6c 79 20 74  eded.  By only t
3b70: 65 73 74 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6c  esting the.** fl
3b80: 61 67 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ag on jump instr
3b90: 75 63 74 69 6f 6e 73 2c 20 77 65 20 67 65 74 20  uctions, we get 
3ba0: 61 20 28 73 6d 61 6c 6c 29 20 73 70 65 65 64 20  a (small) speed 
3bb0: 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  improvement..*/.
3bc0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 46 4f  #define CHECK_FO
3bd0: 52 5f 49 4e 54 45 52 52 55 50 54 20 5c 0a 20 20  R_INTERRUPT \.  
3be0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
3bf0: 74 65 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f  terrupted ) goto
3c00: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e   abort_due_to_in
3c10: 74 65 72 72 75 70 74 3b 0a 0a 23 69 66 64 65 66  terrupt;..#ifdef
3c20: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c30: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 45 78 69  atic int fileExi
3c40: 73 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  sts(sqlite3 *db,
3c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
3c60: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  le){.  int res =
3c70: 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
3c80: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 64 65 66  QLITE_OK;.#ifdef
3c90: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
3ca0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72 72  * If we are curr
3cb0: 65 6e 74 6c 79 20 74 65 73 74 69 6e 67 20 49 4f  ently testing IO
3cc0: 20 65 72 72 6f 72 73 2c 20 74 68 65 6e 20 64 6f   errors, then do
3cd0: 20 6e 6f 74 20 63 61 6c 6c 20 4f 73 41 63 63 65   not call OsAcce
3ce0: 73 73 28 29 20 74 6f 0a 20 20 2a 2a 20 74 65 73  ss() to.  ** tes
3cf0: 74 20 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e  t for the presen
3d00: 63 65 20 6f 66 20 7a 46 69 6c 65 2e 20 54 68 69  ce of zFile. Thi
3d10: 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79  s is because any
3d20: 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 0a 20   IO error that. 
3d30: 20 2a 2a 20 6f 63 63 75 72 73 20 68 65 72 65 20   ** occurs here 
3d40: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 65 70 6f  will not be repo
3d50: 72 74 65 64 2c 20 63 61 75 73 69 6e 67 20 74 68  rted, causing th
3d60: 65 20 74 65 73 74 20 74 6f 20 66 61 69 6c 2e 0a  e test to fail..
3d70: 20 20 2a 2f 0a 20 20 65 78 74 65 72 6e 20 69 6e    */.  extern in
3d80: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
3d90: 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 69 66  or_pending;.  if
3da0: 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  ( sqlite3_io_err
3db0: 6f 72 5f 70 65 6e 64 69 6e 67 3c 3d 30 20 29 0a  or_pending<=0 ).
3dc0: 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
3dd0: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
3de0: 64 62 2d 3e 70 56 66 73 2c 20 7a 46 69 6c 65 2c  db->pVfs, zFile,
3df0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
3e00: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
3e10: 72 65 74 75 72 6e 20 28 72 65 73 20 26 26 20 72  return (res && r
3e20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d  c==SQLITE_OK);.}
3e30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3e40: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68   NDEBUG./*.** Th
3e50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
3e60: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
3e70: 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74  within an assert
3e80: 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  () expression. I
3e90: 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74  t.** checks that
3ea0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72   the sqlite3.nTr
3eb0: 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62  ansaction variab
3ec0: 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20  le is correctly 
3ed0: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75  set to.** the nu
3ee0: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e  mber of non-tran
3ef0: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
3f00: 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
3f10: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
3f20: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
3f30: 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69  sqlite3.pSavepoi
3f40: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65  nt..** .** Usage
3f50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65  :.**.**     asse
3f60: 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
3f70: 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a  ntCount(db) );.*
3f80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
3f90: 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
3fa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3fb0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61   int n = 0;.  Sa
3fc0: 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f  vepoint *p;.  fo
3fd0: 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  r(p=db->pSavepoi
3fe0: 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nt; p; p=p->pNex
3ff0: 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74  t) n++;.  assert
4000: 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70  ( n==(db->nSavep
4010: 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61  oint + db->isTra
4020: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
4030: 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  t) );.  return 1
4040: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4050: 2a 20 45 78 65 63 75 74 65 20 61 73 20 6d 75 63  * Execute as muc
4060: 68 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f 67  h of a VDBE prog
4070: 72 61 6d 20 61 73 20 77 65 20 63 61 6e 20 74 68  ram as we can th
4080: 65 6e 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a  en return..**.**
4090: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
40a0: 52 65 61 64 79 28 29 20 6d 75 73 74 20 62 65 20  Ready() must be 
40b0: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68  called before th
40c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
40d0: 64 65 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65 20  der to.** close 
40e0: 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 74 68  the program with
40f0: 20 61 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74   a final OP_Halt
4100: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
4110: 68 65 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a 20  he callbacks.** 
4120: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
4130: 73 73 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  ssage pointer..*
4140: 2a 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 61 20  *.** Whenever a 
4150: 72 6f 77 20 6f 72 20 72 65 73 75 6c 74 20 64 61  row or result da
4160: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ta is available,
4170: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
4180: 6c 6c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e 76  ll either.** inv
4190: 6f 6b 65 20 74 68 65 20 72 65 73 75 6c 74 20 63  oke the result c
41a0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 72  allback (if ther
41b0: 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 72 65 74  e is one) or ret
41c0: 75 72 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  urn with.** SQLI
41d0: 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49 66  TE_ROW..**.** If
41e0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
41f0: 61 64 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c 6f  ade to open a lo
4200: 63 6b 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  cked database, t
4210: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4220: 0a 2a 2a 20 77 69 6c 6c 20 65 69 74 68 65 72 20  .** will either 
4230: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
4240: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65  callback (if the
4250: 72 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 69 74  re is one) or it
4260: 20 77 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e 20   will.** return 
4270: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
4280: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
4290: 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
42a0: 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
42b0: 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  en to memory obt
42c0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
42d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
42e0: 6e 64 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69 73  nd p->zErrMsg is
42f0: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
4300: 6f 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a 2a  o that memory..*
4310: 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * The error code
4320: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 2d   is stored in p-
4330: 3e 72 63 20 61 6e 64 20 74 68 69 73 20 72 6f 75  >rc and this rou
4340: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
4350: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
4360: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
4370: 20 65 76 65 72 20 72 65 74 75 72 6e 73 20 6e 6f   ever returns no
4380: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
4390: 20 70 72 6f 67 72 61 6d 20 65 78 69 74 73 0a 2a   program exits.*
43a0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  * immediately.  
43b0: 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  There will be no
43c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
43d0: 75 74 20 74 68 65 20 70 2d 3e 72 63 20 66 69 65  ut the p->rc fie
43e0: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
43f0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e 64  SQLITE_ABORT and
4400: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
4410: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
4420: 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 20  _ERROR..**.** A 
4430: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4440: 6e 20 65 72 72 6f 72 20 63 61 75 73 65 73 20 70  n error causes p
4450: 2d 3e 72 63 20 74 6f 20 62 65 20 73 65 74 20 74  ->rc to be set t
4460: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
4470: 6e 64 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  nd this.** routi
4480: 6e 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  ne to return SQL
4490: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a  ITE_ERROR..**.**
44a0: 20 4f 74 68 65 72 20 66 61 74 61 6c 20 65 72 72   Other fatal err
44b0: 6f 72 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ors return SQLIT
44c0: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41  E_ERROR..**.** A
44d0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
44e0: 65 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20  e has finished, 
44f0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
4500: 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 0a  ize() should be.
4510: 2a 2a 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  ** used to clean
4520: 20 75 70 20 74 68 65 20 6d 65 73 73 20 74 68 61   up the mess tha
4530: 74 20 77 61 73 20 6c 65 66 74 20 62 65 68 69 6e  t was left behin
4540: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4550: 33 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62  3VdbeExec(.  Vdb
4560: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
4570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
4580: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
4590: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
45a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
45b0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
45c0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  .  Op *pOp;     
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
45e0: 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69   Current operati
45f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
4600: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4610: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4620: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4630: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4640: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4650: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 65 6e  abase */.  u8 en
4660: 63 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62 29  coding = ENC(db)
4670: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ;     /* The dat
4680: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
4690: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20  /.  Mem *pIn1 = 
46a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
46b0: 2a 20 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72  * 1st input oper
46c0: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
46d0: 6e 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n2 = 0;         
46e0: 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74      /* 2nd input
46f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
4700: 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20  m *pIn3 = 0;    
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20           /* 3rd 
4720: 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  input operand */
4730: 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30  .  Mem *pOut = 0
4740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4750: 20 4f 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20   Output operand 
4760: 2a 2f 0a 20 20 75 38 20 6f 70 50 72 6f 70 65 72  */.  u8 opProper
4770: 74 79 3b 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61  ty;.  int iCompa
4780: 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
4790: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 6c 61   /* Result of la
47a0: 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70  st OP_Compare op
47b0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
47c0: 20 2a 61 50 65 72 6d 75 74 65 20 3d 20 30 3b 20   *aPermute = 0; 
47d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 75          /* Permu
47e0: 74 61 74 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e  tation of column
47f0: 73 20 66 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65  s for OP_Compare
4800: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
4810: 50 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74  PROFILE.  u64 st
4820: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
4830: 20 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63       /* CPU cloc
4840: 6b 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74  k count at start
4850: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   of opcode */.  
4860: 69 6e 74 20 6f 72 69 67 50 63 3b 20 20 20 20 20  int origPc;     
4870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
4880: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 61 74  ogram counter at
4890: 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65   start of opcode
48a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   */.#endif.#ifnd
48b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
48c0: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
48d0: 0a 20 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73  .  int nProgress
48e0: 4f 70 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Ops = 0;      /*
48f0: 20 4f 70 63 6f 64 65 73 20 65 78 65 63 75 74 65   Opcodes execute
4900: 64 20 73 69 6e 63 65 20 70 72 6f 67 72 65 73 73  d since progress
4910: 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 23 65   callback. */.#e
4920: 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45  ndif.  /*** INSE
4930: 52 54 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48  RT STACK UNION H
4940: 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65  ERE ***/..  asse
4950: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4960: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20  BE_MAGIC_RUN ); 
4970: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70   /* sqlite3_step
4980: 28 29 20 76 65 72 69 66 69 65 73 20 74 68 69 73  () verifies this
4990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
49a0: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
49b0: 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20  MAGIC_BUSY );.  
49c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78  sqlite3VdbeMutex
49d0: 41 72 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 20  ArrayEnter(p);. 
49e0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
49f0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
4a00: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
4a10: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
4a20: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
4a30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4a40: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
4a50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4a60: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
4a70: 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  */.    goto no_m
4a80: 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  em;.  }.  assert
4a90: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4aa0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
4ab0: 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 70 2d  ITE_BUSY );.  p-
4ac0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
4ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
4ae0: 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d  plain==0 );.  p-
4af0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
4b00: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
4b10: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
4b20: 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
4b30: 55 50 54 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  UPT;.  sqlite3Vd
4b40: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b  beIOTraceSql(p);
4b50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4b60: 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33 42 65  EBUG.  sqlite3Be
4b70: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
4b80: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d  );.  if( p->pc==
4b90: 30 20 0a 20 20 20 26 26 20 28 28 70 2d 3e 64 62  0 .   && ((p->db
4ba0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
4bb0: 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 20 7c 7c  _VdbeListing) ||
4bc0: 20 66 69 6c 65 45 78 69 73 74 73 28 64 62 2c 20   fileExists(db, 
4bd0: 22 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29 29  "vdbe_explain"))
4be0: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
4bf0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42  .    printf("VDB
4c00: 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e  E Program Listin
4c10: 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  g:\n");.    sqli
4c20: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
4c30: 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  p);.    for(i=0;
4c40: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
4c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4c60: 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74  bePrintOp(stdout
4c70: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
4c80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4c90: 28 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 74 72 61 63 65 22 29 20 29   "vdbe_trace") )
4cb0: 7b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d  {.    p->trace =
4cc0: 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20 20 73   stdout;.  }.  s
4cd0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4ce0: 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64 69 66 0a  alloc();.#endif.
4cf0: 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70 63 3b 20    for(pc=p->pc; 
4d00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
4d10: 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  c++){.    assert
4d20: 28 20 70 63 3e 3d 30 20 26 26 20 70 63 3c 70 2d  ( pc>=0 && pc<p-
4d30: 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69 66 28 20  >nOp );.    if( 
4d40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4d50: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
4d60: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
4d70: 49 4c 45 0a 20 20 20 20 6f 72 69 67 50 63 20 3d  ILE.    origPc =
4d80: 20 70 63 3b 0a 20 20 20 20 73 74 61 72 74 20 3d   pc;.    start =
4d90: 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
4da0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4f 70  ;.#endif.    pOp
4db0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 63 5d 3b 0a   = &p->aOp[pc];.
4dc0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  .    /* Only all
4dd0: 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 51  ow tracing if SQ
4de0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
4df0: 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
4e00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4e10: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  G.    if( p->tra
4e20: 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ce ){.      if( 
4e30: 70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pc==0 ){.       
4e40: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 45 78   printf("VDBE Ex
4e50: 65 63 75 74 69 6f 6e 20 54 72 61 63 65 3a 5c 6e  ecution Trace:\n
4e60: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
4e70: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
4e80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
4e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4ea0: 6e 74 4f 70 28 70 2d 3e 74 72 61 63 65 2c 20 70  ntOp(p->trace, p
4eb0: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 20  c, pOp);.    }. 
4ec0: 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 3d     if( p->trace=
4ed0: 3d 30 20 26 26 20 70 63 3d 3d 30 20 29 7b 0a 20  =0 && pc==0 ){. 
4ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
4ef0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
4f00: 0a 20 20 20 20 20 20 69 66 28 20 66 69 6c 65 45  .      if( fileE
4f10: 78 69 73 74 73 28 64 62 2c 20 22 76 64 62 65 5f  xists(db, "vdbe_
4f20: 73 71 6c 74 72 61 63 65 22 29 20 29 7b 0a 20 20  sqltrace") ){.  
4f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4f40: 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20  ePrintSql(p);.  
4f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4f60: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
4f70: 6f 63 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  oc();.    }.#end
4f80: 69 66 0a 20 20 20 20 20 20 0a 0a 20 20 20 20 2f  if.      ..    /
4f90: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
4fa0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 69 6d  f we need to sim
4fb0: 75 6c 61 74 65 20 61 6e 20 69 6e 74 65 72 72 75  ulate an interru
4fc0: 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 68  pt.  This only h
4fd0: 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66  appens.    ** if
4fe0: 20 77 65 20 68 61 76 65 20 61 20 73 70 65 63 69   we have a speci
4ff0: 61 6c 20 74 65 73 74 20 62 75 69 6c 64 2e 0a 20  al test build.. 
5000: 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
5010: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28  ITE_TEST.    if(
5020: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
5030: 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20  pt_count>0 ){.  
5040: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
5050: 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20  rrupt_count--;. 
5060: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5070: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
5080: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5090: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
50a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
50b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
50c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
50d0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
50e0: 4b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  K.    /* Call th
50f0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
5100: 61 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ack if it is con
5110: 66 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20  figured and the 
5120: 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a  required number.
5130: 20 20 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f      ** of VDBE o
5140: 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78 65  ps have been exe
5150: 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73 69  cuted (either si
5160: 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74  nce this invocat
5170: 69 6f 6e 20 6f 66 0a 20 20 20 20 2a 2a 20 73 71  ion of.    ** sq
5180: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
5190: 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69  or since last ti
51a0: 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  me the progress 
51b0: 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c  callback was cal
51c0: 6c 65 64 29 2e 0a 20 20 20 20 2a 2a 20 49 66 20  led)..    ** If 
51d0: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
51e0: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
51f0: 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65  n-zero, exit the
5200: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
5210: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 20 72   with.    ** a r
5220: 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54  eturn code SQLIT
5230: 45 5f 41 42 4f 52 54 2e 0a 20 20 20 20 2a 2f 0a  E_ABORT..    */.
5240: 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f      if( db->xPro
5250: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 69  gress ){.      i
5260: 66 28 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73  f( db->nProgress
5270: 4f 70 73 3d 3d 6e 50 72 6f 67 72 65 73 73 4f 70  Ops==nProgressOp
5280: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  s ){.        int
5290: 20 70 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66   prc;.        if
52a0: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  ( sqlite3SafetyO
52b0: 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62  ff(db) ) goto ab
52c0: 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73  ort_due_to_misus
52d0: 65 3b 0a 20 20 20 20 20 20 20 20 70 72 63 20 3d  e;.        prc =
52e0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62  db->xProgress(db
52f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 29 3b  ->pProgressArg);
5300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
5310: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
5320: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
5330: 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 20  e_to_misuse;.   
5340: 20 20 20 20 20 69 66 28 20 70 72 63 21 3d 30 20       if( prc!=0 
5350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
5360: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5370: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
5380: 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61  to vdbe_error_ha
5390: 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  lt;.        }.  
53a0: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f        nProgressO
53b0: 70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ps = 0;.      }.
53c0: 20 20 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4f        nProgressO
53d0: 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ps++;.    }.#end
53e0: 69 66 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 63 6f  if..    /* Do co
53f0: 6d 6d 6f 6e 20 73 65 74 75 70 20 70 72 6f 63 65  mmon setup proce
5400: 73 73 69 6e 67 20 66 6f 72 20 61 6e 79 20 6f 70  ssing for any op
5410: 63 6f 64 65 20 74 68 61 74 20 69 73 20 6d 61 72  code that is mar
5420: 6b 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ked.    ** with 
5430: 74 68 65 20 22 6f 75 74 32 2d 70 72 65 72 65 6c  the "out2-prerel
5440: 65 61 73 65 22 20 74 61 67 2e 20 20 53 75 63 68  ease" tag.  Such
5450: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 61 20   opcodes have a 
5460: 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  single.    ** ou
5470: 74 70 75 74 20 77 68 69 63 68 20 69 73 20 73 70  tput which is sp
5480: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 50  ecified by the P
5490: 32 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  2 parameter.  Th
54a0: 65 20 50 32 20 72 65 67 69 73 74 65 72 0a 20 20  e P2 register.  
54b0: 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
54c0: 7a 65 64 20 74 6f 20 61 20 4e 55 4c 4c 2e 0a 20  zed to a NULL.. 
54d0: 20 20 20 2a 2f 0a 20 20 20 20 6f 70 50 72 6f 70     */.    opProp
54e0: 65 72 74 79 20 3d 20 6f 70 63 6f 64 65 50 72 6f  erty = opcodePro
54f0: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5500: 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 50  e];.    if( (opP
5510: 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f  roperty & OPFLG_
5520: 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53 45 29  OUT2_PRERELEASE)
5530: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5540: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
5550: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5560: 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p2<=p->nMem
5570: 20 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d   );.      pOut =
5580: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
5590: 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2];.      sqlite
55a0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45  3VdbeMemReleaseE
55b0: 78 74 65 72 6e 61 6c 28 70 4f 75 74 29 3b 0a 20  xternal(pOut);. 
55c0: 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73       pOut->flags
55d0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
55e0: 20 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a     pOut->n = 0;.
55f0: 20 20 20 20 7d 65 6c 73 65 0a 20 0a 20 20 20 20      }else. .    
5600: 2f 2a 20 44 6f 20 63 6f 6d 6d 6f 6e 20 73 65 74  /* Do common set
5610: 75 70 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 6d  up for opcodes m
5620: 61 72 6b 65 64 20 77 69 74 68 20 6f 6e 65 20 6f  arked with one o
5630: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
5640: 20 20 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74 69      ** combinati
5650: 6f 6e 73 20 6f 66 20 70 72 6f 70 65 72 74 69 65  ons of propertie
5660: 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
5670: 20 20 20 20 20 20 20 20 20 20 20 69 6e 31 0a 20             in1. 
5680: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
5690: 69 6e 31 20 69 6e 32 0a 20 20 20 20 2a 2a 20 20  in1 in2.    **  
56a0: 20 20 20 20 20 20 20 20 20 69 6e 31 20 69 6e 32           in1 in2
56b0: 20 6f 75 74 33 0a 20 20 20 20 2a 2a 20 20 20 20   out3.    **    
56c0: 20 20 20 20 20 20 20 69 6e 31 20 69 6e 33 0a 20         in1 in3. 
56d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 56 61 72     **.    ** Var
56e0: 69 61 62 6c 65 73 20 70 49 6e 31 2c 20 70 49 6e  iables pIn1, pIn
56f0: 32 2c 20 61 6e 64 20 70 49 6e 33 20 61 72 65 20  2, and pIn3 are 
5700: 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
5710: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20   appropriate.   
5720: 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 66 6f   ** registers fo
5730: 72 20 69 6e 70 75 74 73 2e 20 20 56 61 72 69 61  r inputs.  Varia
5740: 62 6c 65 20 70 4f 75 74 20 70 6f 69 6e 74 73 20  ble pOut points 
5750: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 72 65  to the output re
5760: 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  gister..    */. 
5770: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
5780: 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29 21  ty & OPFLG_IN1)!
5790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
57a0: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b  rt( pOp->p1>0 );
57b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
57c0: 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p1<=p->nMem 
57d0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 31 20 3d 20  );.      pIn1 = 
57e0: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  &p->aMem[pOp->p1
57f0: 5d 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  ];.      REGISTE
5800: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c  R_TRACE(pOp->p1,
5810: 20 70 49 6e 31 29 3b 0a 20 20 20 20 20 20 69 66   pIn1);.      if
5820: 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20  ( (opProperty & 
5830: 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b  OPFLG_IN2)!=0 ){
5840: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5850: 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
5860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5870: 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p2<=p->nMem )
5880: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 32 20 3d  ;.        pIn2 =
5890: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
58a0: 32 5d 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49  2];.        REGI
58b0: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
58c0: 70 32 2c 20 70 49 6e 32 29 3b 0a 20 20 20 20 20  p2, pIn2);.     
58d0: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
58e0: 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29  ty & OPFLG_OUT3)
58f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
5900: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5910: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
5920: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
5930: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20  =p->nMem );.    
5940: 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 70 2d        pOut = &p-
5950: 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  >aMem[pOp->p3];.
5960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5970: 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 50 72 6f  }else if( (opPro
5980: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e  perty & OPFLG_IN
5990: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)!=0 ){.       
59a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
59b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
59c0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70  sert( pOp->p3<=p
59d0: 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20  ->nMem );.      
59e0: 20 20 70 49 6e 33 20 3d 20 26 70 2d 3e 61 4d 65    pIn3 = &p->aMe
59f0: 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20  m[pOp->p3];.    
5a00: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
5a10: 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 49 6e 33  CE(pOp->p3, pIn3
5a20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5a30: 65 6c 73 65 20 69 66 28 20 28 6f 70 50 72 6f 70  else if( (opProp
5a40: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 32  erty & OPFLG_IN2
5a50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5a60: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
5a70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5a80: 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65   pOp->p2<=p->nMe
5a90: 6d 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 32 20  m );.      pIn2 
5aa0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
5ab0: 70 32 5d 3b 0a 20 20 20 20 20 20 52 45 47 49 53  p2];.      REGIS
5ac0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
5ad0: 32 2c 20 70 49 6e 32 29 3b 0a 20 20 20 20 7d 65  2, pIn2);.    }e
5ae0: 6c 73 65 20 69 66 28 20 28 6f 70 50 72 6f 70 65  lse if( (opPrope
5af0: 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29  rty & OPFLG_IN3)
5b00: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5b10: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29  ert( pOp->p3>0 )
5b20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5b30: 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
5b40: 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 33 20 3d   );.      pIn3 =
5b50: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
5b60: 33 5d 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54  3];.      REGIST
5b70: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
5b80: 2c 20 70 49 6e 33 29 3b 0a 20 20 20 20 7d 0a 0a  , pIn3);.    }..
5b90: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
5ba0: 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a  >opcode ){../***
5bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68  **********.** Wh
5c00: 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20  at follows is a 
5c10: 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20 73  massive switch s
5c20: 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65  tatement where e
5c30: 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65  ach case impleme
5c40: 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74  nts a.** separat
5c50: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  e instruction in
5c60: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
5c70: 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c  hine.  If we fol
5c80: 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a  low the usual.**
5c90: 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e   indentation con
5ca0: 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63  ventions, each c
5cb0: 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ase should be in
5cc0: 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61 63  dented by 6 spac
5cd0: 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74  es.  But.** that
5ce0: 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73   is a lot of was
5cf0: 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ted space on the
5d00: 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53   left margin.  S
5d10: 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68 69  o the code withi
5d20: 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20  n.** the switch 
5d30: 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62  statement will b
5d40: 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e  reak with conven
5d50: 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73  tion and be flus
5d60: 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a  h-left. Another.
5d70: 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28  ** big comment (
5d80: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20  similar to this 
5d90: 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74  one) will mark t
5da0: 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  he point in the 
5db0: 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65  code where.** we
5dc0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
5dd0: 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e   to normal inden
5de0: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  tation..**.** Th
5df0: 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20  e formatting of 
5e00: 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d 70  each case is imp
5e10: 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b  ortant.  The mak
5e20: 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65  efile for SQLite
5e30: 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77  .** generates tw
5e40: 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64  o C files "opcod
5e50: 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64  es.h" and "opcod
5e60: 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e  es.c" by scannin
5e70: 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c  g this.** file l
5e80: 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73  ooking for lines
5e90: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5ea0: 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68   "case OP_".  Th
5eb0: 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65  e opcodes.h file
5ec0: 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c  s.** will be fil
5ed0: 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e 65  led with #define
5ee0: 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69 71  s that give uniq
5ef0: 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ue integer value
5f00: 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63  s to each.** opc
5f10: 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  ode and the opco
5f20: 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69  des.c file is fi
5f30: 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72 72  lled with an arr
5f40: 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68  ay of strings wh
5f50: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69  ere.** each stri
5f60: 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c  ng is the symbol
5f70: 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ic name for the 
5f80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70  corresponding op
5f90: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a  code.  If the.**
5fa0: 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20   case statement 
5fb0: 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  is followed by a
5fc0: 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20   comment of the 
5fd0: 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73  form "/# same as
5fe0: 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74   ... #/".** that
5ff0: 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64   comment is used
6000: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
6010: 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  e particular val
6020: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
6030: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65  ..**.** Other ke
6040: 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f  ywords in the co
6050: 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f  mment that follo
6060: 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72 65  ws each case are
6070: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73   used to.** cons
6080: 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f  truct the OPFLG_
6090: 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75  INITIALIZER valu
60a0: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
60b0: 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74  es opcodePropert
60c0: 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73  y[]..** Keywords
60d0: 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69   include: in1, i
60e0: 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70 72  n2, in3, out2_pr
60f0: 65 72 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c 20  erelease, out2, 
6100: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
6110: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
6120: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
6130: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
6140: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
6150: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
6160: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
6170: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
6180: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
6190: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
61a0: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
61b0: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
61c0: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
61d0: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
61e0: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
61f0: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
6200: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
6210: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
6220: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
6230: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
6240: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
6250: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
6260: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
6270: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
6280: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
6290: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
62a0: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
62b0: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
62c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6310: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
6320: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
6330: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
6340: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
6350: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
6360: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
6370: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
6380: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
6390: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
63a0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
63b0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
63c0: 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20  case OP_Goto: { 
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
63e0: 75 6d 70 20 2a 2f 0a 20 20 43 48 45 43 4b 5f 46  ump */.  CHECK_F
63f0: 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  OR_INTERRUPT;.  
6400: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
6410: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6420: 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62 20   Opcode:  Gosub 
6430: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
6440: 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72  * Write the curr
6450: 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74 6f  ent address onto
6460: 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20   register P1.** 
6470: 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  and then jump to
6480: 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f 0a   address P2..*/.
6490: 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20 7b  case OP_Gosub: {
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
64b0: 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ump */.  assert(
64c0: 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20   pOp->p1>0 );.  
64d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3c  assert( pOp->p1<
64e0: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 49  =p->nMem );.  pI
64f0: 6e 31 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  n1 = &p->aMem[pO
6500: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
6510: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
6520: 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a   MEM_Dyn)==0 );.
6530: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
6540: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31 2d  MEM_Int;.  pIn1-
6550: 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45 47  >u.i = pc;.  REG
6560: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
6570: 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70 63  >p1, pIn1);.  pc
6580: 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
6590: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
65a0: 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50  pcode:  Return P
65b0: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
65c0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  Jump to the next
65d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74   instruction aft
65e0: 65 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69  er the address i
65f0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
6600: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72 6e  /.case OP_Return
6610: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
6620: 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74   in1 */.  assert
6630: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
6640: 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63 20  MEM_Int );.  pc 
6650: 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69  = (int)pIn1->u.i
6660: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6670: 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20   Opcode:  Yield 
6680: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
6690: 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72 61   Swap the progra
66a0: 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74  m counter with t
66b0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
66c0: 73 74 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  ster P1..*/.case
66d0: 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20   OP_Yield: {    
66e0: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
66f0: 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a  /.  int pcDest;.
6700: 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d    assert( (pIn1-
6710: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
6720: 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d 3e  )==0 );.  pIn1->
6730: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
6740: 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69 6e 74  .  pcDest = (int
6750: 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70 49  )pIn1->u.i;.  pI
6760: 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20  n1->u.i = pc;.  
6770: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
6780: 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20  Op->p1, pIn1);. 
6790: 20 70 63 20 3d 20 70 63 44 65 73 74 3b 0a 20 20   pc = pcDest;.  
67a0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
67b0: 6f 64 65 3a 20 20 48 61 6c 74 49 66 4e 75 6c 6c  ode:  HaltIfNull
67c0: 20 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a    P1 P2 P3 P4 *.
67d0: 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  **.** Check the 
67e0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
67f0: 72 20 50 33 2e 20 20 49 66 20 69 73 20 69 73 20  r P3.  If is is 
6800: 4e 55 4c 4c 20 74 68 65 6e 20 48 61 6c 74 20 75  NULL then Halt u
6810: 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sing.** paramete
6820: 72 20 50 31 2c 20 50 32 2c 20 61 6e 64 20 50 34  r P1, P2, and P4
6830: 20 61 73 20 69 66 20 74 68 69 73 20 77 65 72 65   as if this were
6840: 20 61 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74   a Halt instruct
6850: 69 6f 6e 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ion.  If the.** 
6860: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
6870: 72 20 50 33 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  r P3 is not NULL
6880: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
6890: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
68a0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 49  */.case OP_HaltI
68b0: 66 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a  fNull: {      /*
68c0: 20 69 6e 33 20 2a 2f 0a 20 20 69 66 28 20 28 70   in3 */.  if( (p
68d0: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
68e0: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61  _Null)==0 ) brea
68f0: 6b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  k;.  /* Fall thr
6900: 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c  ough into OP_Hal
6910: 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  t */.}../* Opcod
6920: 65 3a 20 20 48 61 6c 74 20 50 31 20 50 32 20 2a  e:  Halt P1 P2 *
6930: 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69 74   P4 *.**.** Exit
6940: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 41   immediately.  A
6950: 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c  ll open cursors,
6960: 20 65 74 63 20 61 72 65 20 63 6c 6f 73 65 64 0a   etc are closed.
6970: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
6980: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68  ..**.** P1 is th
6990: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 72 65  e result code re
69a0: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
69b0: 33 5f 65 78 65 63 28 29 2c 20 73 71 6c 69 74 65  3_exec(), sqlite
69c0: 33 5f 72 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72  3_reset(),.** or
69d0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
69e0: 65 28 29 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d  e().  For a norm
69f0: 61 6c 20 68 61 6c 74 2c 20 74 68 69 73 20 73 68  al halt, this sh
6a00: 6f 75 6c 64 20 62 65 20 53 51 4c 49 54 45 5f 4f  ould be SQLITE_O
6a10: 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72  K (0)..** For er
6a20: 72 6f 72 73 2c 20 69 74 20 63 61 6e 20 62 65 20  rors, it can be 
6a30: 73 6f 6d 65 20 6f 74 68 65 72 20 76 61 6c 75 65  some other value
6a40: 2e 20 20 49 66 20 50 31 21 3d 30 20 74 68 65 6e  .  If P1!=0 then
6a50: 20 50 32 20 77 69 6c 6c 20 64 65 74 65 72 6d 69   P2 will determi
6a60: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
6a70: 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b   not to rollback
6a80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6a90: 6e 73 61 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f  nsaction.  Do no
6aa0: 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  t rollback.** if
6ab0: 20 50 32 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f   P2==OE_Fail. Do
6ac0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66   the rollback if
6ad0: 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b   P2==OE_Rollback
6ae0: 2e 20 20 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f  .  If P2==OE_Abo
6af0: 72 74 2c 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b  rt,.** then back
6b00: 20 6f 75 74 20 61 6c 6c 20 63 68 61 6e 67 65 73   out all changes
6b10: 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
6b20: 72 65 64 20 64 75 72 69 6e 67 20 74 68 69 73 20  red during this 
6b30: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
6b40: 0a 2a 2a 20 56 44 42 45 2c 20 62 75 74 20 64 6f  .** VDBE, but do
6b50: 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68   not rollback th
6b60: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  e transaction. .
6b70: 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 6e  **.** If P4 is n
6b80: 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20  ot null then it 
6b90: 69 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  is an error mess
6ba0: 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  age string..**.*
6bb0: 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d  * There is an im
6bc0: 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20 30 20  plied "Halt 0 0 
6bd0: 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  0" instruction i
6be0: 6e 73 65 72 74 65 64 20 61 74 20 74 68 65 20 76  nserted at the v
6bf0: 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76  ery end of.** ev
6c00: 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f  ery program.  So
6c10: 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74 68 65   a jump past the
6c20: 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
6c30: 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  n of the program
6c40: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
6c50: 61 73 20 65 78 65 63 75 74 69 6e 67 20 48 61 6c  as executing Hal
6c60: 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61  t..*/.case OP_Ha
6c70: 6c 74 3a 20 7b 0a 20 20 70 2d 3e 72 63 20 3d 20  lt: {.  p->rc = 
6c80: 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 70 63  pOp->p1;.  p->pc
6c90: 20 3d 20 70 63 3b 0a 20 20 70 2d 3e 65 72 72 6f   = pc;.  p->erro
6ca0: 72 41 63 74 69 6f 6e 20 3d 20 70 4f 70 2d 3e 70  rAction = pOp->p
6cb0: 32 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  2;.  if( pOp->p4
6cc0: 2e 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .z ){.    sqlite
6cd0: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
6ce0: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
6cf0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
6d00: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
6d10: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61  VdbeHalt(p);.  a
6d20: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6d30: 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
6d40: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
6d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
6d60: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
6d70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
6d80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6d90: 63 20 3d 20 70 2d 3e 72 63 20 3f 20 53 51 4c 49  c = p->rc ? SQLI
6da0: 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54  TE_ERROR : SQLIT
6db0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f  E_DONE;.  }.  go
6dc0: 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
6dd0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e  }../* Opcode: In
6de0: 74 65 67 65 72 20 50 31 20 50 32 20 2a 20 2a 20  teger P1 P2 * * 
6df0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62  *.**.** The 32-b
6e00: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
6e10: 20 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69   P1 is written i
6e20: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
6e30: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65  .*/.case OP_Inte
6e40: 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ger: {         /
6e50: 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
6e60: 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  e */.  pOut->fla
6e70: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6e80: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pOut->u.i = pOp-
6e90: 3e 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  >p1;.  break;.}.
6ea0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36  ./* Opcode: Int6
6eb0: 34 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  4 * P2 * P4 *.**
6ec0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
6ed0: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
6ee0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a  integer value..*
6ef0: 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c  * Write that val
6f00: 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ue into register
6f10: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
6f20: 49 6e 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20  Int64: {        
6f30: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
6f40: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
6f50: 74 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21  t( pOp->p4.pI64!
6f60: 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  =0 );.  pOut->fl
6f70: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
6f80: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f   pOut->u.i = *pO
6f90: 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72  p->p4.pI64;.  br
6fa0: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
6fb0: 65 3a 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50  e: Real * P2 * P
6fc0: 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
6fd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36  a pointer to a 6
6fe0: 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
6ff0: 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 57  oint value..** W
7000: 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65 20  rite that value 
7010: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
7020: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
7030: 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
7040: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 46 4c  /* same as TK_FL
7050: 4f 41 54 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c  OAT, out2-prerel
7060: 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d 3e  ease */.  pOut->
7070: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
7080: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
7090: 69 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e  ite3IsNaN(*pOp->
70a0: 70 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70  p4.pReal) );.  p
70b0: 4f 75 74 2d 3e 72 20 3d 20 2a 70 4f 70 2d 3e 70  Out->r = *pOp->p
70c0: 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61 6b  4.pReal;.  break
70d0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
70e0: 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20 50  String8 * P2 * P
70f0: 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69  4 *.**.** P4 poi
7100: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  nts to a nul ter
7110: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
7120: 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64  ring. This opcod
7130: 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  e is transformed
7140: 20 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f   .** into an OP_
7150: 53 74 72 69 6e 67 20 62 65 66 6f 72 65 20 69 74  String before it
7160: 20 69 73 20 65 78 65 63 75 74 65 64 20 66 6f 72   is executed for
7170: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e   the first time.
7180: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69  .*/.case OP_Stri
7190: 6e 67 38 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ng8: {         /
71a0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 52  * same as TK_STR
71b0: 49 4e 47 2c 20 6f 75 74 32 2d 70 72 65 72 65 6c  ING, out2-prerel
71c0: 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
71d0: 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  ( pOp->p4.z!=0 )
71e0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
71f0: 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70  = OP_String;.  p
7200: 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33  Op->p1 = sqlite3
7210: 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34  Strlen30(pOp->p4
7220: 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  .z);..#ifndef SQ
7230: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7240: 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d    if( encoding!=
7250: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
7260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
7270: 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f  mSetStr(pOut, pO
7280: 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c  p->p4.z, -1, SQL
7290: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
72a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66  _STATIC);.    if
72b0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
72c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
72d0: 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63  coding(pOut, enc
72e0: 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f  oding) ) goto no
72f0: 5f 6d 65 6d 3b 0a 20 20 20 20 69 66 28 20 53 51  _mem;.    if( SQ
7300: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
7310: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65  VdbeMemMakeWrite
7320: 61 62 6c 65 28 70 4f 75 74 29 20 29 20 67 6f 74  able(pOut) ) got
7330: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 70 4f  o no_mem;.    pO
7340: 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  ut->zMalloc = 0;
7350: 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
7360: 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a   |= MEM_Static;.
7370: 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
7380: 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20  &= ~MEM_Dyn;.   
7390: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
73a0: 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  ==P4_DYNAMIC ){.
73b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
73c0: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e  ree(db, pOp->p4.
73d0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  z);.    }.    pO
73e0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
73f0: 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70 4f 70 2d  YNAMIC;.    pOp-
7400: 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d 3e 7a 3b  >p4.z = pOut->z;
7410: 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  .    pOp->p1 = p
7420: 4f 75 74 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20  Out->n;.    if( 
7430: 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d  pOp->p1>db->aLim
7440: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7450: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20  LENGTH] ){.     
7460: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
7470: 20 20 20 7d 0a 20 20 20 20 55 50 44 41 54 45 5f     }.    UPDATE_
7480: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
7490: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
74a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
74b0: 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d  pOp->p1>db->aLim
74c0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
74d0: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
74e0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
74f0: 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
7500: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
7510: 61 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a  ase, OP_String *
7520: 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65  /.}.  ./* Opcode
7530: 3a 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a  : String P1 P2 *
7540: 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20   P4 *.**.** The 
7550: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20  string value P4 
7560: 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79  of length P1 (by
7570: 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69  tes) is stored i
7580: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
7590: 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67  /.case OP_String
75a0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  : {          /* 
75b0: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
75c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
75d0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70  ->p4.z!=0 );.  p
75e0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
75f0: 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Str|MEM_Static|
7600: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
7610: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ->z = pOp->p4.z;
7620: 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70  .  pOut->n = pOp
7630: 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  ->p1;.  pOut->en
7640: 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20  c = encoding;.  
7650: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
7660: 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
7670: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7680: 3a 20 4e 75 6c 6c 20 2a 20 50 32 20 2a 20 2a 20  : Null * P2 * * 
7690: 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  *.**.** Write a 
76a0: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
76b0: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
76c0: 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  P_Null: {       
76d0: 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
76e0: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 62 72 65 61  elease */.  brea
76f0: 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
7700: 3a 20 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50  : Blob P1 P2 * P
7710: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74  4.**.** P4 point
7720: 73 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64  s to a blob of d
7730: 61 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e  ata P1 bytes lon
7740: 67 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a  g.  Store this.*
7750: 2a 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74  * blob in regist
7760: 65 72 20 50 32 2e 20 54 68 69 73 20 69 6e 73 74  er P2. This inst
7770: 72 75 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  ruction is not c
7780: 6f 64 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  oded directly.**
7790: 20 62 79 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   by the compiler
77a0: 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63  . Instead, the c
77b0: 6f 6d 70 69 6c 65 72 20 6c 61 79 65 72 20 73 70  ompiler layer sp
77c0: 65 63 69 66 69 65 73 0a 2a 2a 20 61 6e 20 4f 50  ecifies.** an OP
77d0: 5f 48 65 78 42 6c 6f 62 20 6f 70 63 6f 64 65 2c  _HexBlob opcode,
77e0: 20 77 69 74 68 20 74 68 65 20 68 65 78 20 73 74   with the hex st
77f0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
7800: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62 6c  ion of.** the bl
7810: 6f 62 20 61 73 20 50 34 2e 20 54 68 69 73 20 6f  ob as P4. This o
7820: 70 63 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f  pcode is transfo
7830: 72 6d 65 64 20 74 6f 20 61 6e 20 4f 50 5f 42 6c  rmed to an OP_Bl
7840: 6f 62 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ob.** the first 
7850: 74 69 6d 65 20 69 74 20 69 73 20 65 78 65 63 75  time it is execu
7860: 74 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ted..*/.case OP_
7870: 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20  Blob: {         
7880: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
7890: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
78a0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c  ssert( pOp->p1 <
78b0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  = SQLITE_MAX_LEN
78c0: 47 54 48 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  GTH );.  sqlite3
78d0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f  VdbeMemSetStr(pO
78e0: 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70  ut, pOp->p4.z, p
78f0: 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20  Op->p1, 0, 0);. 
7900: 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63   pOut->enc = enc
7910: 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f  oding;.  UPDATE_
7920: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
7930: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
7940: 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61  /* Opcode: Varia
7950: 62 6c 65 20 50 31 20 50 32 20 50 33 20 50 34 20  ble P1 P2 P3 P4 
7960: 2a 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  *.**.** Transfer
7970: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 62   the values of b
7980: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
7990: 50 31 2e 2e 50 31 2b 50 33 2d 31 20 69 6e 74 6f  P1..P1+P3-1 into
79a0: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 50 32   registers.** P2
79b0: 2e 2e 50 32 2b 50 33 2d 31 2e 0a 2a 2a 0a 2a 2a  ..P2+P3-1..**.**
79c0: 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
79d0: 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e  r is named, then
79e0: 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72   its name appear
79f0: 73 20 69 6e 20 50 34 20 61 6e 64 20 50 33 3d 3d  s in P4 and P3==
7a00: 31 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  1..** The P4 val
7a10: 75 65 20 69 73 20 75 73 65 64 20 62 79 20 73 71  ue is used by sq
7a20: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
7a30: 65 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a  eter_name()..*/.
7a40: 63 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65  case OP_Variable
7a50: 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20 20  : {.  int p1;   
7a60: 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62         /* Variab
7a70: 6c 65 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20  le to copy from 
7a80: 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20  */.  int p2;    
7a90: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
7aa0: 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f 0a  r to copy to */.
7ab0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
7ac0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7ad0: 76 61 6c 75 65 73 20 6c 65 66 74 20 74 6f 20 63  values left to c
7ae0: 6f 70 79 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 56  opy */.  Mem *pV
7af0: 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  ar;       /* Val
7b00: 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73 66 65  ue being transfe
7b10: 72 72 65 64 20 2a 2f 0a 0a 20 20 70 31 20 3d 20  rred */..  p1 = 
7b20: 70 4f 70 2d 3e 70 31 20 2d 20 31 3b 0a 20 20 70  pOp->p1 - 1;.  p
7b30: 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 6e  2 = pOp->p2;.  n
7b40: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
7b50: 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
7b60: 31 2b 6e 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a  1+n<=p->nVar );.
7b70: 20 20 61 73 73 65 72 74 28 20 70 32 3e 3d 31 20    assert( p2>=1 
7b80: 26 26 20 70 32 2b 6e 2d 31 3c 3d 70 2d 3e 6e 4d  && p2+n-1<=p->nM
7b90: 65 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  em );.  assert( 
7ba0: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20  pOp->p4.z==0 || 
7bb0: 70 4f 70 2d 3e 70 33 3d 3d 31 20 29 3b 0a 0a 20  pOp->p3==1 );.. 
7bc0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
7bd0: 29 7b 0a 20 20 20 20 70 56 61 72 20 3d 20 26 70  ){.    pVar = &p
7be0: 2d 3e 61 56 61 72 5b 70 31 2b 2b 5d 3b 0a 20 20  ->aVar[p1++];.  
7bf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
7c00: 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29  eMemTooBig(pVar)
7c10: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74   ){.      goto t
7c20: 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20  oo_big;.    }.  
7c30: 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65    pOut = &p->aMe
7c40: 6d 5b 70 32 2b 2b 5d 3b 0a 20 20 20 20 73 71 6c  m[p2++];.    sql
7c50: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
7c60: 73 65 45 78 74 65 72 6e 61 6c 28 70 4f 75 74 29  seExternal(pOut)
7c70: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
7c80: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7ca0: 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
7cb0: 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74  , pVar, MEM_Stat
7cc0: 69 63 29 3b 0a 20 20 20 20 55 50 44 41 54 45 5f  ic);.    UPDATE_
7cd0: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
7ce0: 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  t);.  }.  break;
7cf0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
7d00: 6f 76 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ove P1 P2 P3 * *
7d10: 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  .**.** Move the 
7d20: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
7d30: 65 72 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f  er P1..P1+P3-1 o
7d40: 76 65 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ver into.** regi
7d50: 73 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d  sters P2..P2+P3-
7d60: 31 2e 20 20 52 65 67 69 73 74 65 72 73 20 50 31  1.  Registers P1
7d70: 2e 2e 50 31 2b 50 31 2d 31 20 61 72 65 0a 2a 2a  ..P1+P1-1 are.**
7d80: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 20   left holding a 
7d90: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e 20  NULL.  It is an 
7da0: 65 72 72 6f 72 20 66 6f 72 20 72 65 67 69 73 74  error for regist
7db0: 65 72 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e  er ranges.** P1.
7dc0: 2e 50 31 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e  .P1+P3-1 and P2.
7dd0: 2e 50 32 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72  .P2+P3-1 to over
7de0: 6c 61 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lap..*/.case OP_
7df0: 4d 6f 76 65 3a 20 7b 0a 20 20 63 68 61 72 20 2a  Move: {.  char *
7e00: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 2f 2a 20 48 6f  zMalloc;   /* Ho
7e10: 6c 64 69 6e 67 20 76 61 72 69 61 62 6c 65 20 66  lding variable f
7e20: 6f 72 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  or allocated mem
7e30: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ory */.  int n; 
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
7e60: 20 6c 65 66 74 20 74 6f 20 63 6f 70 79 20 2a 2f   left to copy */
7e70: 0a 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20  .  int p1;      
7e80: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
7e90: 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f 0a  to copy from */.
7ea0: 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20    int p2;       
7eb0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
7ec0: 6f 20 63 6f 70 79 20 74 6f 20 2a 2f 0a 0a 20 20  o copy to */..  
7ed0: 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70  n = pOp->p3;.  p
7ee0: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  1 = pOp->p1;.  p
7ef0: 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61  2 = pOp->p2;.  a
7f00: 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20 70 31  ssert( n>0 && p1
7f10: 3e 30 20 26 26 20 70 32 3e 30 20 29 3b 0a 20 20  >0 && p2>0 );.  
7f20: 61 73 73 65 72 74 28 20 70 31 2b 6e 3c 3d 70 32  assert( p1+n<=p2
7f30: 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31 20 29 3b 0a   || p2+n<=p1 );.
7f40: 0a 20 20 70 49 6e 31 20 3d 20 26 70 2d 3e 61 4d  .  pIn1 = &p->aM
7f50: 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  em[p1];.  pOut =
7f60: 20 26 70 2d 3e 61 4d 65 6d 5b 70 32 5d 3b 0a 20   &p->aMem[p2];. 
7f70: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20   while( n-- ){. 
7f80: 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 3c     assert( pOut<
7f90: 3d 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d 65  =&p->aMem[p->nMe
7fa0: 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  m] );.    assert
7fb0: 28 20 70 49 6e 31 3c 3d 26 70 2d 3e 61 4d 65 6d  ( pIn1<=&p->aMem
7fc0: 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20  [p->nMem] );.   
7fd0: 20 7a 4d 61 6c 6c 6f 63 20 3d 20 70 4f 75 74 2d   zMalloc = pOut-
7fe0: 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4f  >zMalloc;.    pO
7ff0: 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  ut->zMalloc = 0;
8000: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8010: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49  MemMove(pOut, pI
8020: 6e 31 29 3b 0a 20 20 20 20 70 49 6e 31 2d 3e 7a  n1);.    pIn1->z
8030: 4d 61 6c 6c 6f 63 20 3d 20 7a 4d 61 6c 6c 6f 63  Malloc = zMalloc
8040: 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
8050: 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29  RACE(p2++, pOut)
8060: 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20  ;.    pIn1++;.  
8070: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20    pOut++;.  }.  
8080: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
8090: 6f 64 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20  ode: Copy P1 P2 
80a0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65  * * *.**.** Make
80b0: 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73   a copy of regis
80c0: 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69  ter P1 into regi
80d0: 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  ster P2..**.** T
80e0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
80f0: 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63 6f 70  makes a deep cop
8100: 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20  y of the value. 
8110: 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20   A duplicate.** 
8120: 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79 20 73  is made of any s
8130: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f  tring or blob co
8140: 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61 6c 73  nstant.  See als
8150: 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63  o OP_SCopy..*/.c
8160: 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b 20 20  ase OP_Copy: {  
8170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
8180: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  1 */.  assert( p
8190: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73  Op->p2>0 );.  as
81a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70  sert( pOp->p2<=p
81b0: 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75 74  ->nMem );.  pOut
81c0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d   = &p->aMem[pOp-
81d0: 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
81e0: 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20  pOut!=pIn1 );.  
81f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
8200: 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20  allowCopy(pOut, 
8210: 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  pIn1, MEM_Ephem)
8220: 3b 0a 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ;.  Deephemerali
8230: 7a 65 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49  ze(pOut);.  REGI
8240: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
8250: 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65  p2, pOut);.  bre
8260: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8270: 3a 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20  : SCopy P1 P2 * 
8280: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61  * *.**.** Make a
8290: 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66   shallow copy of
82a0: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74   register P1 int
82b0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
82c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
82d0: 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68  ction makes a sh
82e0: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68  allow copy of th
82f0: 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65  e value.  If the
8300: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73   value.** is a s
8310: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74  tring or blob, t
8320: 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73 20  hen the copy is 
8330: 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  only a pointer t
8340: 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  o the.** origina
8350: 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20 74  l and hence if t
8360: 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e  he original chan
8370: 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65 20  ges so will the 
8380: 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20  copy..** Worse, 
8390: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
83a0: 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20  is deallocated, 
83b0: 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65 73  the copy becomes
83c0: 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75   invalid..** Thu
83d0: 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d 75  s the program mu
83e0: 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
83f0: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 77  t the original w
8400: 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a  ill not change.*
8410: 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66  * during the lif
8420: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 70  etime of the cop
8430: 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79 20  y.  Use OP_Copy 
8440: 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65  to make a comple
8450: 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63  te.** copy..*/.c
8460: 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20  ase OP_SCopy: { 
8470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
8480: 31 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f  1 */.  REGISTER_
8490: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
84a0: 49 6e 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  In1);.  assert( 
84b0: 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61  pOp->p2>0 );.  a
84c0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d  ssert( pOp->p2<=
84d0: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75  p->nMem );.  pOu
84e0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  t = &p->aMem[pOp
84f0: 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
8500: 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20   pOut!=pIn1 );. 
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
8520: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
8530: 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d   pIn1, MEM_Ephem
8540: 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
8550: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
8560: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
8570: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c  /* Opcode: Resul
8580: 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a  tRow P1 P2 * * *
8590: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73  .**.** The regis
85a0: 74 65 72 73 20 50 31 20 74 68 72 6f 75 67 68 20  ters P1 through 
85b0: 50 31 2b 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20  P1+P2-1 contain 
85c0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a  a single row of.
85d0: 2a 2a 20 72 65 73 75 6c 74 73 2e 20 54 68 69 73  ** results. This
85e0: 20 6f 70 63 6f 64 65 20 63 61 75 73 65 73 20 74   opcode causes t
85f0: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  he sqlite3_step(
8600: 29 20 63 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e  ) call to termin
8610: 61 74 65 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53  ate.** with an S
8620: 51 4c 49 54 45 5f 52 4f 57 20 72 65 74 75 72 6e  QLITE_ROW return
8630: 20 63 6f 64 65 20 61 6e 64 20 69 74 20 73 65 74   code and it set
8640: 73 20 75 70 20 74 68 65 20 73 71 6c 69 74 65 33  s up the sqlite3
8650: 5f 73 74 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75  _stmt.** structu
8660: 72 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 63  re to provide ac
8670: 63 65 73 73 20 74 6f 20 74 68 65 20 74 6f 70 20  cess to the top 
8680: 50 31 20 76 61 6c 75 65 73 20 61 73 20 74 68 65  P1 values as the
8690: 20 72 65 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e 0a   result.** row..
86a0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c  */.case OP_Resul
86b0: 74 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70  tRow: {.  Mem *p
86c0: 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Mem;.  int i;.  
86d0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43  assert( p->nResC
86e0: 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29  olumn==pOp->p2 )
86f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
8700: 3e 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  >p1>0 );.  asser
8710: 74 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  t( pOp->p1+pOp->
8720: 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  p2<=p->nMem+1 );
8730: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  ..  /* If the SQ
8740: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 66  LITE_CountRows f
8750: 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 73 71  lag is set in sq
8760: 6c 69 74 65 33 2e 66 6c 61 67 73 20 6d 61 73 6b  lite3.flags mask
8770: 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20 44 4d 4c  , then .  ** DML
8780: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
8790: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74  ke this opcode t
87a0: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  o return the num
87b0: 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a  ber of rows .  *
87c0: 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 74 68  * modified to th
87d0: 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73 20  e user. This is 
87e0: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61  the only way tha
87f0: 74 20 61 20 56 4d 20 74 68 61 74 0a 20 20 2a 2a  t a VM that.  **
8800: 20 6f 70 65 6e 73 20 61 20 73 74 61 74 65 6d 65   opens a stateme
8810: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
8820: 61 79 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f  ay invoke this o
8830: 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pcode..  **.  **
8840: 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 69 73   In case this is
8850: 20 73 75 63 68 20 61 20 73 74 61 74 65 6d 65 6e   such a statemen
8860: 74 2c 20 63 6c 6f 73 65 20 61 6e 79 20 73 74 61  t, close any sta
8870: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
8880: 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62  on.  ** opened b
8890: 79 20 74 68 69 73 20 56 4d 20 62 65 66 6f 72 65  y this VM before
88a0: 20 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e 74 72   returning contr
88b0: 6f 6c 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ol to the user. 
88c0: 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20  This is to.  ** 
88d0: 65 6e 73 75 72 65 20 74 68 61 74 20 73 74 61 74  ensure that stat
88e0: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
88f0: 6e 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65  ns are always ne
8900: 73 74 65 64 2c 20 6e 6f 74 20 6f 76 65 72 6c 61  sted, not overla
8910: 70 70 69 6e 67 2e 0a 20 20 2a 2a 20 49 66 20 74  pping..  ** If t
8920: 68 65 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e  he open statemen
8930: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t-transaction is
8940: 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68 65 72 65   not closed here
8950: 2c 20 74 68 65 6e 20 74 68 65 20 75 73 65 72 0a  , then the user.
8960: 20 20 2a 2a 20 6d 61 79 20 73 74 65 70 20 61 6e    ** may step an
8970: 6f 74 68 65 72 20 56 4d 20 74 68 61 74 20 6f 70  other VM that op
8980: 65 6e 73 20 69 74 73 20 6f 77 6e 20 73 74 61 74  ens its own stat
8990: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
89a0: 6e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 79  n. This.  ** may
89b0: 20 6c 65 61 64 20 74 6f 20 6f 76 65 72 6c 61 70   lead to overlap
89c0: 70 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 74  ping statement t
89d0: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
89e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
89f0: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20  Statement==0 || 
8a00: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
8a10: 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20  _CountRows );.  
8a20: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
8a30: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
8a40: 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
8a50: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
8a60: 41 53 45 29 29 20 29 7b 0a 20 20 20 20 62 72 65  ASE)) ){.    bre
8a70: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ak;.  }..  /* In
8a80: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68  validate all eph
8a90: 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f  emeral cursor ro
8aa0: 77 20 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d  w caches */.  p-
8ab0: 3e 63 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e  >cacheCtr = (p->
8ac0: 63 61 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b  cacheCtr + 2)|1;
8ad0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
8ae0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
8af0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
8b00: 61 72 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  are \000 termina
8b10: 74 65 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76  ted.  ** and hav
8b20: 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79  e an assigned ty
8b30: 70 65 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  pe.  The results
8b40: 20 61 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61   are de-ephemera
8b50: 6c 69 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 73  lized as.  ** as
8b60: 20 73 69 64 65 20 65 66 66 65 63 74 2e 0a 20 20   side effect..  
8b70: 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70  */.  pMem = p->p
8b80: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
8b90: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
8ba0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 2d   for(i=0; i<pOp-
8bb0: 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  >p2; i++){.    s
8bc0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c  qlite3VdbeMemNul
8bd0: 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b  Terminate(&pMem[
8be0: 69 5d 29 3b 0a 20 20 20 20 73 74 6f 72 65 54 79  i]);.    storeTy
8bf0: 70 65 49 6e 66 6f 28 26 70 4d 65 6d 5b 69 5d 2c  peInfo(&pMem[i],
8c00: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
8c10: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
8c20: 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d 5b  Op->p1+i, &pMem[
8c30: 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  i]);.  }.  if( d
8c40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8c50: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 0a  ) goto no_mem;..
8c60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 53 51 4c 49    /* Return SQLI
8c70: 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a 20 20 70 2d  TE_ROW.  */.  p-
8c80: 3e 70 63 20 3d 20 70 63 20 2b 20 31 3b 0a 20 20  >pc = pc + 1;.  
8c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
8ca0: 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74  .  goto vdbe_ret
8cb0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  urn;.}../* Opcod
8cc0: 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50 32 20  e: Concat P1 P2 
8cd0: 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 64  P3 * *.**.** Add
8ce0: 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 65 67   the text in reg
8cf0: 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74 68  ister P1 onto th
8d00: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 78  e end of the tex
8d10: 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72  t in.** register
8d20: 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74 68   P2 and store th
8d30: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
8d40: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
8d50: 69 74 68 65 72 20 74 68 65 20 50 31 20 6f 72 20  ither the P1 or 
8d60: 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c 4c  P2 text are NULL
8d70: 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c 4c   then store NULL
8d80: 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20 20   in P3..**.**   
8d90: 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a 2a  P3 = P2 || P1.**
8da0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
8db0: 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33 20  l for P1 and P3 
8dc0: 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 72  to be the same r
8dd0: 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69 6d  egister. Sometim
8de0: 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73 20  es,.** if P3 is 
8df0: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
8e00: 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d 70  r as P2, the imp
8e10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61  lementation is a
8e20: 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20  ble.** to avoid 
8e30: 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a 63  a memcpy()..*/.c
8e40: 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20 7b  ase OP_Concat: {
8e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
8e60: 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54 2c  me as TK_CONCAT,
8e70: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
8e80: 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b 0a  */.  i64 nByte;.
8e90: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 21  .  assert( pIn1!
8ea0: 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28 20 28  =pOut );.  if( (
8eb0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
8ec0: 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  n2->flags) & MEM
8ed0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  _Null ){.    sql
8ee0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
8ef0: 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72  ll(pOut);.    br
8f00: 65 61 6b 3b 0a 20 20 7d 0a 20 20 45 78 70 61 6e  eak;.  }.  Expan
8f10: 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 53  dBlob(pIn1);.  S
8f20: 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20 65  tringify(pIn1, e
8f30: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 45 78 70 61  ncoding);.  Expa
8f40: 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20  ndBlob(pIn2);.  
8f50: 53 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20  Stringify(pIn2, 
8f60: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79  encoding);.  nBy
8f70: 74 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70  te = pIn1->n + p
8f80: 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42  In2->n;.  if( nB
8f90: 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  yte>db->aLimit[S
8fa0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
8fb0: 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TH] ){.    goto 
8fc0: 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 4d  too_big;.  }.  M
8fd0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
8fe0: 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20  ut, MEM_Str);.  
8ff0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
9000: 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e  emGrow(pOut, (in
9010: 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d  t)nByte+2, pOut=
9020: 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f  =pIn2) ){.    go
9030: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20  to no_mem;.  }. 
9040: 20 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20   if( pOut!=pIn2 
9050: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ){.    memcpy(pO
9060: 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20  ut->z, pIn2->z, 
9070: 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20  pIn2->n);.  }.  
9080: 6d 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b  memcpy(&pOut->z[
9090: 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e  pIn2->n], pIn1->
90a0: 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70  z, pIn1->n);.  p
90b0: 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 20 3d 20  Out->z[nByte] = 
90c0: 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79  0;.  pOut->z[nBy
90d0: 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75  te+1] = 0;.  pOu
90e0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  t->flags |= MEM_
90f0: 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  Term;.  pOut->n 
9100: 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20  = (int)nByte;.  
9110: 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  pOut->enc = enco
9120: 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d  ding;.  UPDATE_M
9130: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74  AX_BLOBSIZE(pOut
9140: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
9150: 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20 50 31  * Opcode: Add P1
9160: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
9170: 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 69   Add the value i
9180: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
9190: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
91a0: 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64  gister P2.** and
91b0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
91c0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
91d0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
91e0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
91f0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
9200: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
9210: 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20 50  Multiply P1 P2 P
9220: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d  3 * *.**.**.** M
9230: 75 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75  ultiply the valu
9240: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
9250: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e   by the value in
9260: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
9270: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
9280: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
9290: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
92a0: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
92b0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
92c0: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
92d0: 65 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50  e: Subtract P1 P
92e0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  2 P3 * *.**.** S
92f0: 75 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  ubtract the valu
9300: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
9310: 20 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20   from the value 
9320: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
9330: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
9340: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
9350: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
9360: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
9370: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
9380: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
9390: 6f 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50  ode: Divide P1 P
93a0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44  2 P3 * *.**.** D
93b0: 69 76 69 64 65 20 74 68 65 20 76 61 6c 75 65 20  ivide the value 
93c0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 62  in register P1 b
93d0: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
93e0: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
93f0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
9400: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
9410: 33 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65  3.  If the value
9420: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a   in register P2.
9430: 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ** is zero, then
9440: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9450: 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65  ULL..** If eithe
9460: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
9470: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9480: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
9490: 65 3a 20 52 65 6d 61 69 6e 64 65 72 20 50 31 20  e: Remainder P1 
94a0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
94b0: 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 6d 61  Compute the rema
94c0: 69 6e 64 65 72 20 61 66 74 65 72 20 69 6e 74 65  inder after inte
94d0: 67 65 72 20 64 69 76 69 73 69 6f 6e 20 6f 66 20  ger division of 
94e0: 74 68 65 20 76 61 6c 75 65 20 69 6e 0a 2a 2a 20  the value in.** 
94f0: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74  register P1 by t
9500: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
9510: 73 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72  ster P2 and stor
9520: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
9530: 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 76  P3. .** If the v
9540: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
9550: 20 50 32 20 69 73 20 7a 65 72 6f 20 74 68 65 20   P2 is zero the 
9560: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9570: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70 65  ** If either ope
9580: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68  rand is NULL, th
9590: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
95a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64  ..*/.case OP_Add
95b0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
95c0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
95d0: 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e 32  K_PLUS, in1, in2
95e0: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
95f0: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 20  P_Subtract:     
9600: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
9610: 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69 6e   as TK_MINUS, in
9620: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9630: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
9640: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
9650: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 41  * same as TK_STA
9660: 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
9670: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69 76  3 */.case OP_Div
9680: 69 64 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ide:            
9690: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
96a0: 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69 6e  K_SLASH, in1, in
96b0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
96c0: 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b 20  OP_Remainder: { 
96d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
96e0: 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e 31  e as TK_REM, in1
96f0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
9700: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
9710: 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d   /* Combined MEM
9720: 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f  _* flags from bo
9730: 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 69  th inputs */.  i
9740: 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f  64 iA;         /
9750: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
9760: 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  of left operand 
9770: 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20  */.  i64 iB;    
9780: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9790: 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f  value of right o
97a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62  perand */.  doub
97b0: 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52  le rA;      /* R
97c0: 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  eal value of lef
97d0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64  t operand */.  d
97e0: 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f  ouble rB;      /
97f0: 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20  * Real value of 
9800: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
9810: 0a 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ..  applyNumeric
9820: 41 66 66 69 6e 69 74 79 28 70 49 6e 31 29 3b 0a  Affinity(pIn1);.
9830: 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
9840: 66 69 6e 69 74 79 28 70 49 6e 32 29 3b 0a 20 20  finity(pIn2);.  
9850: 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e 66 6c  flags = pIn1->fl
9860: 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67  ags | pIn2->flag
9870: 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  s;.  if( (flags 
9880: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
9890: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
98a0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
98b0: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
98c0: 61 67 73 20 26 20 70 49 6e 32 2d 3e 66 6c 61 67  ags & pIn2->flag
98d0: 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 4d 45  s & MEM_Int)==ME
98e0: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 69 41 20  M_Int ){.    iA 
98f0: 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn1->u.i;.   
9900: 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b   iB = pIn2->u.i;
9910: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
9920: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
9930: 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20    case OP_Add:  
9940: 20 20 20 20 20 20 20 69 42 20 2b 3d 20 69 41 3b         iB += iA;
9950: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9960: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74      case OP_Subt
9970: 72 61 63 74 3a 20 20 20 20 69 42 20 2d 3d 20 69  ract:    iB -= i
9980: 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A;       break;.
9990: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
99a0: 6c 74 69 70 6c 79 3a 20 20 20 20 69 42 20 2a 3d  ltiply:    iB *=
99b0: 20 69 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   iA;       break
99c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
99d0: 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20  Divide: {.      
99e0: 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f    if( iA==0 ) go
99f0: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
9a00: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
9a10: 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 69 6e        /* Dividin
9a20: 67 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 6f  g the largest po
9a30: 73 73 69 62 6c 65 20 6e 65 67 61 74 69 76 65 20  ssible negative 
9a40: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 28  64-bit integer (
9a50: 31 3c 3c 36 33 29 20 62 79 20 0a 20 20 20 20 20  1<<63) by .     
9a60: 20 20 20 2a 2a 20 2d 31 20 72 65 74 75 72 6e 73     ** -1 returns
9a70: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 6f 20   an integer too 
9a80: 6c 61 72 67 65 20 74 6f 20 73 74 6f 72 65 20 69  large to store i
9a90: 6e 20 61 20 36 34 2d 62 69 74 20 64 61 74 61 2d  n a 64-bit data-
9aa0: 74 79 70 65 2e 20 4f 6e 0a 20 20 20 20 20 20 20  type. On.       
9ab0: 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
9ac0: 63 74 75 72 65 73 2c 20 74 68 65 20 76 61 6c 75  ctures, the valu
9ad0: 65 20 6f 76 65 72 66 6c 6f 77 73 20 74 6f 20 28  e overflows to (
9ae0: 31 3c 3c 36 33 29 2e 20 4f 6e 20 6f 74 68 65 72  1<<63). On other
9af0: 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  s,.        ** a 
9b00: 53 49 47 46 50 45 20 69 73 20 69 73 73 75 65 64  SIGFPE is issued
9b10: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
9b20: 73 74 61 74 65 6d 65 6e 74 20 6e 6f 72 6d 61 6c  statement normal
9b30: 69 7a 65 73 20 74 68 69 73 0a 20 20 20 20 20 20  izes this.      
9b40: 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 73 6f    ** behavior so
9b50: 20 74 68 61 74 20 61 6c 6c 20 61 72 63 68 69 74   that all archit
9b60: 65 63 74 75 72 65 73 20 62 65 68 61 76 65 20 61  ectures behave a
9b70: 73 20 69 66 20 69 6e 74 65 67 65 72 20 0a 20 20  s if integer .  
9b80: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
9b90: 77 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  w occurred..    
9ba0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
9bb0: 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69 42 3d  f( iA==-1 && iB=
9bc0: 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
9bd0: 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20 20  ) iA = 1;.      
9be0: 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20 20    iB /= iA;.    
9bf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9c00: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
9c10: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
9c20: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
9c30: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
9c40: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
9c50: 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20  if( iA==-1 ) iA 
9c60: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20  = 1;.        iB 
9c70: 25 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62  %= iA;.        b
9c80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9c90: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e    }.    pOut->u.
9ca0: 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d 53  i = iB;.    MemS
9cb0: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
9cc0: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c   MEM_Int);.  }el
9cd0: 73 65 7b 0a 20 20 20 20 72 41 20 3d 20 73 71 6c  se{.    rA = sql
9ce0: 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
9cf0: 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72 42 20  e(pIn1);.    rB 
9d00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
9d10: 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20 20  lValue(pIn2);.  
9d20: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
9d30: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
9d40: 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20  ase OP_Add:     
9d50: 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20 20 20      rB += rA;   
9d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9d70: 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63   case OP_Subtrac
9d80: 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41 3b 20  t:    rB -= rA; 
9d90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9da0: 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69     case OP_Multi
9db0: 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20 72 41  ply:    rB *= rA
9dc0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9dd0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76       case OP_Div
9de0: 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  ide: {.        /
9df0: 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
9e00: 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
9e10: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
9e20: 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  T... */.        
9e30: 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c 65 29  if( rA==(double)
9e40: 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65  0 ) goto arithme
9e50: 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75  tic_result_is_nu
9e60: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42 20 2f  ll;.        rB /
9e70: 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = rA;.        br
9e80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9e90: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
9ea0: 20 20 20 20 20 20 69 41 20 3d 20 28 69 36 34 29        iA = (i64)
9eb0: 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42 20 3d  rA;.        iB =
9ec0: 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20 20 20   (i64)rB;.      
9ed0: 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67 6f    if( iA==0 ) go
9ee0: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
9ef0: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
9f00: 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d 31        if( iA==-1
9f10: 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20 20   ) iA = 1;.     
9f20: 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c 65 29     rB = (double)
9f30: 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20 20 20  (iB % iA);.     
9f40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9f50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9f60: 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42 29  sqlite3IsNaN(rB)
9f70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61   ){.      goto a
9f80: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
9f90: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  _is_null;.    }.
9fa0: 20 20 20 20 70 4f 75 74 2d 3e 72 20 3d 20 72 42      pOut->r = rB
9fb0: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
9fc0: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 52  Flag(pOut, MEM_R
9fd0: 65 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28 66  eal);.    if( (f
9fe0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
9ff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
a000: 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41  ite3VdbeIntegerA
a010: 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a 20  ffinity(pOut);. 
a020: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
a030: 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f 72 65  ;..arithmetic_re
a040: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20  sult_is_null:.  
a050: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
a060: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 62  tNull(pOut);.  b
a070: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
a080: 64 65 3a 20 43 6f 6c 6c 53 65 71 20 2a 20 2a 20  de: CollSeq * * 
a090: 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  P4.**.** P4 is a
a0a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 6f   pointer to a Co
a0b0: 6c 6c 53 65 71 20 73 74 72 75 63 74 2e 20 49 66  llSeq struct. If
a0c0: 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
a0d0: 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  o a user functio
a0e0: 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67 61 74  n.** or aggregat
a0f0: 65 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 47  e calls sqlite3G
a100: 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c  etFuncCollSeq(),
a110: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
a120: 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a  sequence will.**
a130: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
a140: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
a150: 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
a160: 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c  , max() and null
a170: 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  if().** function
a180: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
a190: 65 72 66 61 63 65 20 75 73 65 64 20 62 79 20 74  erface used by t
a1a0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
a1b0: 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65  n of the aforeme
a1c0: 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e  ntioned function
a1d0: 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65  s.** to retrieve
a1e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
a1f0: 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74  equence set by t
a200: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
a210: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70  t available.** p
a220: 75 62 6c 69 63 6c 79 2c 20 6f 6e 6c 79 20 74 6f  ublicly, only to
a230: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 20   user functions 
a240: 64 65 66 69 6e 65 64 20 69 6e 20 66 75 6e 63 2e  defined in func.
a250: 63 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  c..*/.case OP_Co
a260: 6c 6c 53 65 71 3a 20 7b 0a 20 20 61 73 73 65 72  llSeq: {.  asser
a270: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
a280: 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  P4_COLLSEQ );.  
a290: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
a2a0: 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50 31  ode: Function P1
a2b0: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
a2c0: 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75 73 65 72  ** Invoke a user
a2d0: 20 66 75 6e 63 74 69 6f 6e 20 28 50 34 20 69 73   function (P4 is
a2e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a2f0: 46 75 6e 63 74 69 6f 6e 20 73 74 72 75 63 74 75  Function structu
a300: 72 65 20 74 68 61 74 0a 2a 2a 20 64 65 66 69 6e  re that.** defin
a310: 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 29  es the function)
a320: 20 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e   with P5 argumen
a330: 74 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65  ts taken from re
a340: 67 69 73 74 65 72 20 50 32 20 61 6e 64 0a 2a 2a  gister P2 and.**
a350: 20 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68   successors.  Th
a360: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
a370: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72  function is stor
a380: 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
a390: 33 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  3..** Register P
a3a0: 33 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e  3 must not be on
a3b0: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
a3c0: 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20  n inputs..**.** 
a3d0: 50 31 20 69 73 20 61 20 33 32 2d 62 69 74 20 62  P1 is a 32-bit b
a3e0: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
a3f0: 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  g whether or not
a400: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74   each argument t
a410: 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69  o the .** functi
a420: 6f 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65  on was determine
a430: 64 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  d to be constant
a440: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
a450: 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a  . If the first.*
a460: 2a 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63  * argument was c
a470: 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74  onstant then bit
a480: 20 30 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e   0 of P1 is set.
a490: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
a4a0: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
a4b0: 65 74 68 65 72 20 6d 65 74 61 20 64 61 74 61 20  ether meta data 
a4c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
a4d0: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  a user function 
a4e0: 61 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74  argument using t
a4f0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65  he.** sqlite3_se
a500: 74 5f 61 75 78 64 61 74 61 28 29 20 41 50 49 20  t_auxdata() API 
a510: 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 72 65  may be safely re
a520: 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65  tained until the
a530: 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74   next.** invocat
a540: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f  ion of this opco
a550: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  de..**.** See al
a560: 73 6f 3a 20 41 67 67 53 74 65 70 20 61 6e 64 20  so: AggStep and 
a570: 41 67 67 46 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65  AggFinal.*/.case
a580: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a   OP_Function: {.
a590: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
a5a0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
a5b0: 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73  context ctx;.  s
a5c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a5d0: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  pVal;.  int n;..
a5e0: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20    n = pOp->p5;. 
a5f0: 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70 41 72   apVal = p->apAr
a600: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 56  g;.  assert( apV
a610: 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 0a 20  al || n==0 );.. 
a620: 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c 7c   assert( n==0 ||
a630: 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70   (pOp->p2>0 && p
a640: 4f 70 2d 3e 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65  Op->p2+n<=p->nMe
a650: 6d 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  m+1) );.  assert
a660: 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70  ( pOp->p3<pOp->p
a670: 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f  2 || pOp->p3>=pO
a680: 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70 41 72  p->p2+n );.  pAr
a690: 67 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  g = &p->aMem[pOp
a6a0: 2d 3e 70 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ->p2];.  for(i=0
a6b0: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 41 72 67  ; i<n; i++, pArg
a6c0: 2b 2b 29 7b 0a 20 20 20 20 61 70 56 61 6c 5b 69  ++){.    apVal[i
a6d0: 5d 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 73 74  ] = pArg;.    st
a6e0: 6f 72 65 54 79 70 65 49 6e 66 6f 28 70 41 72 67  oreTypeInfo(pArg
a6f0: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
a700: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
a710: 70 4f 70 2d 3e 70 32 2c 20 70 41 72 67 29 3b 0a  pOp->p2, pArg);.
a720: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
a730: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46  Op->p4type==P4_F
a740: 55 4e 43 44 45 46 20 7c 7c 20 70 4f 70 2d 3e 70  UNCDEF || pOp->p
a750: 34 74 79 70 65 3d 3d 50 34 5f 56 44 42 45 46 55  4type==P4_VDBEFU
a760: 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  NC );.  if( pOp-
a770: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
a780: 44 45 46 20 29 7b 0a 20 20 20 20 63 74 78 2e 70  DEF ){.    ctx.p
a790: 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Func = pOp->p4.p
a7a0: 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e 70 56  Func;.    ctx.pV
a7b0: 64 62 65 46 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  dbeFunc = 0;.  }
a7c0: 65 6c 73 65 7b 0a 20 20 20 20 63 74 78 2e 70 56  else{.    ctx.pV
a7d0: 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46  dbeFunc = (VdbeF
a7e0: 75 6e 63 2a 29 70 4f 70 2d 3e 70 34 2e 70 56 64  unc*)pOp->p4.pVd
a7f0: 62 65 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e  beFunc;.    ctx.
a800: 70 46 75 6e 63 20 3d 20 63 74 78 2e 70 56 64 62  pFunc = ctx.pVdb
a810: 65 46 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a 20 20  eFunc->pFunc;.  
a820: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  }..  assert( pOp
a830: 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p3>0 && pOp->p
a840: 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  3<=p->nMem );.  
a850: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
a860: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 63 74 78 2e  pOp->p3];.  ctx.
a870: 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  s.flags = MEM_Nu
a880: 6c 6c 3b 0a 20 20 63 74 78 2e 73 2e 64 62 20 3d  ll;.  ctx.s.db =
a890: 20 64 62 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65   db;.  ctx.s.xDe
a8a0: 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 7a  l = 0;.  ctx.s.z
a8b0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 0a 20 20 2f  Malloc = 0;..  /
a8c0: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63 65 6c  * The output cel
a8d0: 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20 68 61  l may already ha
a8e0: 76 65 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  ve a buffer allo
a8f0: 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a  cated. Move.  **
a900: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
a910: 63 74 78 2e 73 20 73 6f 20 69 6e 20 63 61 73 65  ctx.s so in case
a920: 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69   the user-functi
a930: 6f 6e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  on can use.  ** 
a940: 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  the already allo
a950: 63 61 74 65 64 20 62 75 66 66 65 72 20 69 6e 73  cated buffer ins
a960: 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74 69  tead of allocati
a970: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  ng a new one..  
a980: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
a990: 4d 65 6d 4d 6f 76 65 28 26 63 74 78 2e 73 2c 20  MemMove(&ctx.s, 
a9a0: 70 4f 75 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54  pOut);.  MemSetT
a9b0: 79 70 65 46 6c 61 67 28 26 63 74 78 2e 73 2c 20  ypeFlag(&ctx.s, 
a9c0: 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20 63 74  MEM_Null);..  ct
a9d0: 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20  x.isError = 0;. 
a9e0: 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e   if( ctx.pFunc->
a9f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
aa00: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
aa10: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e      assert( pOp>
aa20: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  p->aOp );.    as
aa30: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34  sert( pOp[-1].p4
aa40: 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
aa50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
aa60: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
aa70: 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20  OP_CollSeq );.  
aa80: 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f    ctx.pColl = pO
aa90: 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a  p[-1].p4.pColl;.
aaa0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
aab0: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 20 29  3SafetyOff(db) )
aac0: 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
aad0: 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 28 2a 63  to_misuse;.  (*c
aae0: 74 78 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63 29  tx.pFunc->xFunc)
aaf0: 28 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29  (&ctx, n, apVal)
ab00: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
ab10: 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b 0a 20  afetyOn(db) ){. 
ab20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
ab30: 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29  mRelease(&ctx.s)
ab40: 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
ab50: 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a  _due_to_misuse;.
ab60: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
ab70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
ab80: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
ab90: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20   a malloc() has 
aba0: 66 61 69 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c  failed, the impl
abb0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
abc0: 65 0a 20 20 20 20 2a 2a 20 75 73 65 72 20 66 75  e.    ** user fu
abd0: 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20  nction may have 
abe0: 63 61 6c 6c 65 64 20 61 6e 20 73 71 6c 69 74 65  called an sqlite
abf0: 33 5f 72 65 73 75 6c 74 5f 58 58 58 28 29 20 66  3_result_XXX() f
ac00: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  unction.    ** t
ac10: 6f 20 72 65 74 75 72 6e 20 61 20 76 61 6c 75 65  o return a value
ac20: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
ac30: 63 61 6c 6c 20 72 65 6c 65 61 73 65 73 20 61 6e  call releases an
ac40: 79 20 72 65 73 6f 75 72 63 65 73 0a 20 20 20 20  y resources.    
ac50: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
ac60: 74 68 20 73 75 63 68 20 61 20 76 61 6c 75 65 2e  th such a value.
ac70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
ac80: 6f 74 65 3a 20 4d 61 79 62 65 20 4d 65 6d 52 65  ote: Maybe MemRe
ac90: 6c 65 61 73 65 28 29 20 73 68 6f 75 6c 64 20 62  lease() should b
aca0: 65 20 63 61 6c 6c 65 64 20 69 66 20 73 71 6c 69  e called if sqli
acb0: 74 65 33 53 61 66 65 74 79 4f 6e 28 29 0a 20 20  te3SafetyOn().  
acc0: 20 20 2a 2a 20 66 61 69 6c 73 20 61 6c 73 6f 20    ** fails also 
acd0: 28 74 68 65 20 69 66 28 2e 2e 2e 29 20 73 74 61  (the if(...) sta
ace0: 74 65 6d 65 6e 74 20 61 62 6f 76 65 29 2e 20 42  tement above). B
acf0: 75 74 20 69 66 20 70 65 6f 70 6c 65 20 61 72 65  ut if people are
ad00: 0a 20 20 20 20 2a 2a 20 6d 69 73 75 73 69 6e 67  .    ** misusing
ad10: 20 73 71 6c 69 74 65 2c 20 74 68 65 79 20 68 61   sqlite, they ha
ad20: 76 65 20 62 69 67 67 65 72 20 70 72 6f 62 6c 65  ve bigger proble
ad30: 6d 73 20 74 68 61 6e 20 61 20 6c 65 61 6b 65 64  ms than a leaked
ad40: 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
ad50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
ad60: 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29  mRelease(&ctx.s)
ad70: 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ;.    goto no_me
ad80: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
ad90: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
ada0: 74 61 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  ta functions hav
adb0: 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 62 79  e been called by
adc0: 20 74 68 69 73 20 75 73 65 72 20 66 75 6e 63 74   this user funct
add0: 69 6f 6e 2c 0a 20 20 2a 2a 20 69 6d 6d 65 64 69  ion,.  ** immedi
ade0: 61 74 65 6c 79 20 63 61 6c 6c 20 74 68 65 20 64  ately call the d
adf0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e  estructor for an
ae00: 79 20 6e 6f 6e 2d 73 74 61 74 69 63 20 76 61 6c  y non-static val
ae10: 75 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ues..  */.  if( 
ae20: 63 74 78 2e 70 56 64 62 65 46 75 6e 63 20 29 7b  ctx.pVdbeFunc ){
ae30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ae40: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 63 74  DeleteAuxData(ct
ae50: 78 2e 70 56 64 62 65 46 75 6e 63 2c 20 70 4f 70  x.pVdbeFunc, pOp
ae60: 2d 3e 70 31 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  ->p1);.    pOp->
ae70: 70 34 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 63  p4.pVdbeFunc = c
ae80: 74 78 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20 20  tx.pVdbeFunc;.  
ae90: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
aea0: 50 34 5f 56 44 42 45 46 55 4e 43 3b 0a 20 20 7d  P4_VDBEFUNC;.  }
aeb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 75  ..  /* If the fu
aec0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
aed0: 61 6e 20 65 72 72 6f 72 2c 20 74 68 72 6f 77 20  an error, throw 
aee0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 2a 2f 0a  an exception */.
aef0: 20 20 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f    if( ctx.isErro
af00: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
af10: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
af20: 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
af30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
af40: 65 78 74 28 26 63 74 78 2e 73 29 29 3b 0a 20 20  ext(&ctx.s));.  
af50: 20 20 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72    rc = ctx.isErr
af60: 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  or;.  }..  /* Co
af70: 70 79 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  py the result of
af80: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e   the function in
af90: 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 20 2a  to register P3 *
afa0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  /.  sqlite3VdbeC
afb0: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 63  hangeEncoding(&c
afc0: 74 78 2e 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  tx.s, encoding);
afd0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
afe0: 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 26 63 74 78  mMove(pOut, &ctx
aff0: 2e 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  .s);.  if( sqlit
b000: 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28  e3VdbeMemTooBig(
b010: 70 4f 75 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  pOut) ){.    got
b020: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
b030: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
b040: 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a  pOp->p3, pOut);.
b050: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
b060: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
b070: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
b080: 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20 50 32  de: BitAnd P1 P2
b090: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
b0a0: 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65 20  ke the bit-wise 
b0b0: 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75 65  AND of the value
b0c0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
b0d0: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
b0e0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b0f0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b100: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b110: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b120: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b130: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  */./* Opcode: Bi
b140: 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a  tOr P1 P2 P3 * *
b150: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
b160: 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20 74  bit-wise OR of t
b170: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
b180: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
b190: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
b1a0: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
b1b0: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
b1c0: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
b1d0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
b1e0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
b1f0: 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74 20  code: ShiftLeft 
b200: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
b210: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
b220: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
b230: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
b240: 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a 2a 20   left by the.** 
b250: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73  number of bits s
b260: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
b270: 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 73  integer in regis
b280: 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20  er P1..** Store 
b290: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b2a0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
b2b0: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
b2c0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
b2d0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
b2e0: 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 52 69   Opcode: ShiftRi
b2f0: 67 68 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ght P1 P2 P3 * *
b300: 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68 65  .**.** Shift the
b310: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
b320: 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 74 6f  n register P2 to
b330: 20 74 68 65 20 72 69 67 68 74 20 62 79 20 74 68   the right by th
b340: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62  e.** number of b
b350: 69 74 73 20 73 70 65 63 69 66 69 65 64 20 62 79  its specified by
b360: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20   the integer in 
b370: 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20  register P1..** 
b380: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
b390: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
b3a0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
b3b0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
b3c0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b3d0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 41  .*/.case OP_BitA
b3e0: 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd:             
b3f0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b400: 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20 69  K_BITAND, in1, i
b410: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
b420: 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20 20 20   OP_BitOr:      
b430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b440: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4f 52 2c  ame as TK_BITOR,
b450: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b460: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74  */.case OP_Shift
b470: 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20 20 20  Left:           
b480: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
b490: 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e  _LSHIFT, in1, in
b4a0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b4b0: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3a 20 7b  OP_ShiftRight: {
b4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b4d0: 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 46 54 2c  me as TK_RSHIFT,
b4e0: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b4f0: 2a 2f 0a 20 20 69 36 34 20 61 3b 0a 20 20 69 36  */.  i64 a;.  i6
b500: 34 20 62 3b 0a 0a 20 20 69 66 28 20 28 70 49 6e  4 b;..  if( (pIn
b510: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
b520: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75  >flags) & MEM_Nu
b530: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
b540: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
b550: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  pOut);.    break
b560: 3b 0a 20 20 7d 0a 20 20 61 20 3d 20 73 71 6c 69  ;.  }.  a = sqli
b570: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
b580: 70 49 6e 32 29 3b 0a 20 20 62 20 3d 20 73 71 6c  pIn2);.  b = sql
b590: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
b5a0: 28 70 49 6e 31 29 3b 0a 20 20 73 77 69 74 63 68  (pIn1);.  switch
b5b0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b  ( pOp->opcode ){
b5c0: 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 42 69 74  .    case OP_Bit
b5d0: 41 6e 64 3a 20 20 20 20 20 20 61 20 26 3d 20 62  And:      a &= b
b5e0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b5f0: 20 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20   case OP_BitOr: 
b600: 20 20 20 20 20 20 61 20 7c 3d 20 62 3b 20 20 20        a |= b;   
b610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b620: 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20  e OP_ShiftLeft: 
b630: 20 20 61 20 3c 3c 3d 20 62 3b 20 20 20 20 62 72    a <<= b;    br
b640: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
b650: 3a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  :  assert( pOp->
b660: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 68 69 66 74  opcode==OP_Shift
b670: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20  Right );.       
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 61 20 3e 3e 3d 20 62 3b 20 20 20 20 62 72    a >>= b;    br
b6a0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d  eak;.  }.  pOut-
b6b0: 3e 75 2e 69 20 3d 20 61 3b 0a 20 20 4d 65 6d 53  >u.i = a;.  MemS
b6c0: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
b6d0: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65   MEM_Int);.  bre
b6e0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
b6f0: 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20  : AddImm  P1 P2 
b700: 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64  * * *.** .** Add
b710: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32   the constant P2
b720: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
b730: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
b740: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
b750: 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72  lways an integer
b760: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65  ..**.** To force
b770: 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f   any register to
b780: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   be an integer, 
b790: 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63  just add 0..*/.c
b7a0: 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b  ase OP_AddImm: {
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
b7c0: 6e 31 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  n1 */.  sqlite3V
b7d0: 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
b7e0: 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e  (pIn1);.  pIn1->
b7f0: 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  u.i += pOp->p2;.
b800: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
b810: 70 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e 74  pcode: MustBeInt
b820: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
b830: 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61  .** Force the va
b840: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b850: 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65  P1 to be an inte
b860: 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c  ger.  If the val
b870: 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 6e  ue.** in P1 is n
b880: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  ot an integer an
b890: 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  d cannot be conv
b8a0: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e  erted into an in
b8b0: 74 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75 74  teger.** without
b8c0: 20 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65 6e   data loss, then
b8d0: 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
b8e0: 79 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20 50  y to P2, or if P
b8f0: 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61 6e  2==0.** raise an
b900: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
b910: 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63   exception..*/.c
b920: 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  ase OP_MustBeInt
b930: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
b940: 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
b950: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
b960: 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In1, SQLITE_AFF_
b970: 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
b980: 67 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  g);.  if( (pIn1-
b990: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
b9a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
b9b0: 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20  pOp->p2==0 ){.  
b9c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b9d0: 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  MISMATCH;.      
b9e0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
b9f0: 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  o_error;.    }el
ba00: 73 65 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70  se{.      pc = p
ba10: 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
ba20: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d  }.  }else{.    M
ba30: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 49  emSetTypeFlag(pI
ba40: 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20  n1, MEM_Int);.  
ba50: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
ba60: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66   Opcode: RealAff
ba70: 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a  inity P1 * * * *
ba80: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .**.** If regist
ba90: 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69  er P1 holds an i
baa0: 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69  nteger convert i
bab0: 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75  t to a real valu
bac0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
bad0: 63 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65  code is used whe
bae0: 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66  n extracting inf
baf0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
bb00: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
bb10: 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
bb20: 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76  .  Such column v
bb30: 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20  alues may still 
bb40: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
bb50: 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70  integers, for sp
bb60: 61 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20  ace efficiency, 
bb70: 62 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63  but after extrac
bb80: 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65  tion we want the
bb90: 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c  m.** to have onl
bba0: 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  y a real value..
bbb0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41  */.case OP_RealA
bbc0: 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20  ffinity: {      
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
bbe0: 6e 31 20 2a 2f 0a 20 20 69 66 28 20 70 49 6e 31  n1 */.  if( pIn1
bbf0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
bc00: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
bc10: 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70  VdbeMemRealify(p
bc20: 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  In1);.  }.  brea
bc30: 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  k;.}..#ifndef SQ
bc40: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f  LITE_OMIT_CAST./
bc50: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65 78 74  * Opcode: ToText
bc60: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
bc70: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
bc80: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
bc90: 20 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a 2a 20   to be text..** 
bca0: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
bcb0: 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74  numeric, convert
bcc0: 20 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20   it to a string 
bcd0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
bce0: 69 76 61 6c 65 6e 74 20 6f 66 20 70 72 69 6e 74  ivalent of print
bcf0: 66 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c 75 65  f().  Blob value
bd00: 73 20 61 72 65 20 75 6e 63 68 61 6e 67 65 64 20  s are unchanged 
bd10: 61 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74 65 72  and.** are after
bd20: 77 61 72 64 73 20 73 69 6d 70 6c 79 20 69 6e 74  wards simply int
bd30: 65 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74  erpreted as text
bd40: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
bd50: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
bd60: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
bd70: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
bd80: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
bd90: 50 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20 20 20  P_ToText: {     
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bdb0: 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45  same as TK_TO_TE
bdc0: 58 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28  XT, in1 */.  if(
bdd0: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn1->flags & M
bde0: 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b  EM_Null ) break;
bdf0: 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 5f 53  .  assert( MEM_S
be00: 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e 3e 33  tr==(MEM_Blob>>3
be10: 29 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  ) );.  pIn1->fla
be20: 67 73 20 7c 3d 20 28 70 49 6e 31 2d 3e 66 6c 61  gs |= (pIn1->fla
be30: 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33 3b  gs&MEM_Blob)>>3;
be40: 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79  .  applyAffinity
be50: 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46  (pIn1, SQLITE_AF
be60: 46 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e 67  F_TEXT, encoding
be70: 29 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64  );.  rc = Expand
be80: 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 61 73  Blob(pIn1);.  as
be90: 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67  sert( pIn1->flag
bea0: 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64  s & MEM_Str || d
beb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bec0: 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  );.  pIn1->flags
bed0: 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45   &= ~(MEM_Int|ME
bee0: 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 42 6c 6f 62 7c  M_Real|MEM_Blob|
bef0: 4d 45 4d 5f 5a 65 72 6f 29 3b 0a 20 20 55 50 44  MEM_Zero);.  UPD
bf00: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
bf10: 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b  (pIn1);.  break;
bf20: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  .}../* Opcode: T
bf30: 6f 42 6c 6f 62 20 50 31 20 2a 20 2a 20 2a 20 2a  oBlob P1 * * * *
bf40: 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65  .**.** Force the
bf50: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
bf60: 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 42 4c  er P1 to be a BL
bf70: 4f 42 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  OB..** If the va
bf80: 6c 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c 20  lue is numeric, 
bf90: 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 20  convert it to a 
bfa0: 73 74 72 69 6e 67 20 66 69 72 73 74 2e 0a 2a 2a  string first..**
bfb0: 20 53 74 72 69 6e 67 73 20 61 72 65 20 73 69 6d   Strings are sim
bfc0: 70 6c 79 20 72 65 69 6e 74 65 72 70 72 65 74 65  ply reinterprete
bfd0: 64 20 61 73 20 62 6c 6f 62 73 20 77 69 74 68 20  d as blobs with 
bfe0: 6e 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 6f 20  no change.** to 
bff0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
c000: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  ata..**.** A NUL
c010: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
c020: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
c030: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
c040: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
c050: 65 20 4f 50 5f 54 6f 42 6c 6f 62 3a 20 7b 20 20  e OP_ToBlob: {  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f  /* same as TK_TO
c080: 5f 42 4c 4f 42 2c 20 69 6e 31 20 2a 2f 0a 20 20  _BLOB, in1 */.  
c090: 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
c0a0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65  & MEM_Null ) bre
c0b0: 61 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d  ak;.  if( (pIn1-
c0c0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
c0d0: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70  b)==0 ){.    app
c0e0: 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c  lyAffinity(pIn1,
c0f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
c100: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  , encoding);.   
c110: 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
c120: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c  lags & MEM_Str |
c130: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c140: 65 64 20 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74  ed );.    MemSet
c150: 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d  TypeFlag(pIn1, M
c160: 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65 6c 73  EM_Blob);.  }els
c170: 65 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61  e{.    pIn1->fla
c180: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65  gs &= ~(MEM_Type
c190: 4d 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b  Mask&~MEM_Blob);
c1a0: 0a 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41  .  }.  UPDATE_MA
c1b0: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29  X_BLOBSIZE(pIn1)
c1c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
c1d0: 20 4f 70 63 6f 64 65 3a 20 54 6f 4e 75 6d 65 72   Opcode: ToNumer
c1e0: 69 63 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ic P1 * * * *.**
c1f0: 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61  .** Force the va
c200: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
c210: 50 31 20 74 6f 20 62 65 20 6e 75 6d 65 72 69 63  P1 to be numeric
c220: 20 28 65 69 74 68 65 72 20 61 6e 0a 2a 2a 20 69   (either an.** i
c230: 6e 74 65 67 65 72 20 6f 72 20 61 20 66 6c 6f 61  nteger or a floa
c240: 74 69 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d 62 65  ting-point numbe
c250: 72 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 76 61  r.).** If the va
c260: 6c 75 65 20 69 73 20 74 65 78 74 20 6f 72 20 62  lue is text or b
c270: 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76  lob, try to conv
c280: 65 72 74 20 69 74 20 74 6f 20 61 6e 20 75 73 69  ert it to an usi
c290: 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61  ng the.** equiva
c2a0: 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 6f  lent of atoi() o
c2b0: 72 20 61 74 6f 66 28 29 20 61 6e 64 20 73 74 6f  r atof() and sto
c2c0: 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20  re 0 if no such 
c2d0: 63 6f 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a 20 69  conversion .** i
c2e0: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a  s possible..**.*
c2f0: 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69  * A NULL value i
c300: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79  s not changed by
c310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
c320: 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e  It remains NULL.
c330: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 4e 75  .*/.case OP_ToNu
c340: 6d 65 72 69 63 3a 20 7b 20 20 20 20 20 20 20 20  meric: {        
c350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
c360: 65 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52  e as TK_TO_NUMER
c370: 49 43 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28  IC, in1 */.  if(
c380: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
c390: 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 49 6e  (MEM_Null|MEM_In
c3a0: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d 3d 30 20  t|MEM_Real))==0 
c3b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c3c0: 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 49  beMemNumerify(pI
c3d0: 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  n1);.  }.  break
c3e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c3f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
c400: 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f  /../* Opcode: To
c410: 49 6e 74 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  Int P1 * * * *.*
c420: 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76  *.** Force the v
c430: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
c440: 20 50 31 20 62 65 20 61 6e 20 69 6e 74 65 67 65   P1 be an intege
c450: 72 2e 20 20 49 66 0a 2a 2a 20 54 68 65 20 76 61  r.  If.** The va
c460: 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  lue is currently
c470: 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20   a real number, 
c480: 64 72 6f 70 20 69 74 73 20 66 72 61 63 74 69 6f  drop its fractio
c490: 6e 61 6c 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20  nal part..** If 
c4a0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78  the value is tex
c4b0: 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74  t or blob, try t
c4c0: 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  o convert it to 
c4d0: 61 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e 67  an integer using
c4e0: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
c4f0: 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e 64  nt of atoi() and
c500: 20 73 74 6f 72 65 20 30 20 69 66 20 6e 6f 20 73   store 0 if no s
c510: 75 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  uch conversion i
c520: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a  s possible..**.*
c530: 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69  * A NULL value i
c540: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79  s not changed by
c550: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
c560: 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e  It remains NULL.
c570: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 49 6e  .*/.case OP_ToIn
c580: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
c590: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
c5a0: 20 54 4b 5f 54 4f 5f 49 4e 54 2c 20 69 6e 31 20   TK_TO_INT, in1 
c5b0: 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  */.  if( (pIn1->
c5c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
c5d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
c5e0: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
c5f0: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  rify(pIn1);.  }.
c600: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e    break;.}..#ifn
c610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c620: 43 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  CAST./* Opcode: 
c630: 54 6f 52 65 61 6c 20 50 31 20 2a 20 2a 20 2a 20  ToReal P1 * * * 
c640: 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68  *.**.** Force th
c650: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
c660: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 20 66  ter P1 to be a f
c670: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
c680: 6d 62 65 72 2e 0a 2a 2a 20 49 66 20 54 68 65 20  mber..** If The 
c690: 76 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e 74  value is current
c6a0: 6c 79 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 63  ly an integer, c
c6b0: 6f 6e 76 65 72 74 20 69 74 2e 0a 2a 2a 20 49 66  onvert it..** If
c6c0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65   the value is te
c6d0: 78 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20  xt or blob, try 
c6e0: 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f  to convert it to
c6f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 75 73 69 6e   an integer usin
c700: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
c710: 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 61 6e  ent of atoi() an
c720: 64 20 73 74 6f 72 65 20 30 2e 30 20 69 66 20 6e  d store 0.0 if n
c730: 6f 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f  o such conversio
c740: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
c750: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75  *.** A NULL valu
c760: 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
c770: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
c780: 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55  .  It remains NU
c790: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 54  LL..*/.case OP_T
c7a0: 6f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  oReal: {        
c7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
c7c0: 65 20 61 73 20 54 4b 5f 54 4f 5f 52 45 41 4c 2c  e as TK_TO_REAL,
c7d0: 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20 28 70   in1 */.  if( (p
c7e0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
c7f0: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  _Null)==0 ){.   
c800: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
c810: 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20  ealify(pIn1);.  
c820: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
c830: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c840: 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f  IT_CAST */../* O
c850: 70 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32 20  pcode: Lt P1 P2 
c860: 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43  P3 P4 P5.**.** C
c870: 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
c880: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
c890: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67   and P3.  If reg
c8a0: 28 50 33 29 3c 72 65 67 28 50 31 29 20 74 68 65  (P3)<reg(P1) the
c8b0: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
c8c0: 72 65 73 73 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a  ress P2.  .**.**
c8d0: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a   If the SQLITE_J
c8e0: 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f 66  UMPIFNULL bit of
c8f0: 20 50 35 20 69 73 20 73 65 74 20 61 6e 64 20 65   P5 is set and e
c900: 69 74 68 65 72 20 72 65 67 28 50 31 29 20 6f 72  ither reg(P1) or
c910: 0a 2a 2a 20 72 65 67 28 50 33 29 20 69 73 20 4e  .** reg(P3) is N
c920: 55 4c 4c 20 74 68 65 6e 20 74 61 6b 65 20 74 68  ULL then take th
c930: 65 20 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20  e jump.  If the 
c940: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
c950: 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65  L .** bit is cle
c960: 61 72 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  ar then fall thr
c970: 75 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  u if either oper
c980: 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  and is NULL..**.
c990: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46  ** The SQLITE_AF
c9a0: 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f  F_MASK portion o
c9b0: 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20  f P5 must be an 
c9c0: 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74  affinity charact
c9d0: 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  er -.** SQLITE_A
c9e0: 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f  FF_TEXT, SQLITE_
c9f0: 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64  AFF_INTEGER, and
ca00: 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74   so forth. An at
ca10: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a  tempt is made .*
ca20: 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68  * to coerce both
ca30: 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e   inputs accordin
ca40: 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69  g to this affini
ca50: 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ty before the.**
ca60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
ca70: 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49  ade. If the SQLI
ca80: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30  TE_AFF_MASK is 0
ca90: 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  x00, then numeri
caa0: 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73  c.** affinity is
cab0: 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74   used. Note that
cac0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f   the affinity co
cad0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74  nversions are st
cae0: 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74  ored.** back int
caf0: 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69  o the input regi
cb00: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e  sters P1 and P3.
cb10: 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65    So this opcode
cb20: 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65   can cause.** pe
cb30: 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73  rsistent changes
cb40: 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31   to registers P1
cb50: 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f   and P3..**.** O
cb60: 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69  nce any conversi
cb70: 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ons have taken p
cb80: 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65  lace, and neithe
cb90: 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  r value is NULL,
cba0: 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20   .** the values 
cbb0: 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66  are compared. If
cbc0: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
cbd0: 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63   blobs then memc
cbe0: 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20  mp() is.** used 
cbf0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
cc00: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
cc10: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20  comparison.  If 
cc20: 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61  both values.** a
cc30: 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68  re text, then th
cc40: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
cc50: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
cc60: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a   specified in.**
cc70: 20 50 34 20 69 73 20 20 75 73 65 64 20 74 6f 20   P4 is  used to 
cc80: 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  do the compariso
cc90: 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74  n.  If P4 is not
cca0: 20 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a   specified then.
ccb0: 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75  ** memcmp() is u
ccc0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
ccd0: 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20  ext string.  If 
cce0: 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a  both values are.
ccf0: 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e  ** numeric, then
cd00: 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61   a numeric compa
cd10: 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49  rison is used. I
cd20: 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  f the two values
cd30: 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65  .** are of diffe
cd40: 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e  rent types, then
cd50: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e   numbers are con
cd60: 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61  sidered less tha
cd70: 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64  n.** strings and
cd80: 20 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e   strings are con
cd90: 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61  sidered less tha
cda0: 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49  n blobs..**.** I
cdb0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f  f the SQLITE_STO
cdc0: 52 45 50 32 20 62 69 74 20 6f 66 20 50 35 20 69  REP2 bit of P5 i
cdd0: 73 20 73 65 74 2c 20 74 68 65 6e 20 64 6f 20 6e  s set, then do n
cde0: 6f 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61  ot jump.  Instea
cdf0: 64 2c 0a 2a 2a 20 73 74 6f 72 65 20 61 20 62 6f  d,.** store a bo
ce00: 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 28 65 69  olean result (ei
ce10: 74 68 65 72 20 30 2c 20 6f 72 20 31 2c 20 6f 72  ther 0, or 1, or
ce20: 20 4e 55 4c 4c 29 20 69 6e 20 72 65 67 69 73 74   NULL) in regist
ce30: 65 72 20 50 32 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  er P2..*/./* Opc
ce40: 6f 64 65 3a 20 4e 65 20 50 31 20 50 32 20 50 33  ode: Ne P1 P2 P3
ce50: 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69   P4 P5.**.** Thi
ce60: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
ce70: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
ce80: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
ce90: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
cea0: 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73  .** the operands
ceb0: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31   in registers P1
cec0: 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74 20   and P3 are not 
ced0: 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65 20  equal.  See the 
cee0: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a  Lt opcode for.**
cef0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
cf00: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  rmation..*/./* O
cf10: 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50 32 20  pcode: Eq P1 P2 
cf20: 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54  P3 P4 P5.**.** T
cf30: 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
cf40: 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  ike the Lt opcod
cf50: 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  e except that th
cf60: 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
cf70: 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e  if.** the operan
cf80: 64 73 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ds in registers 
cf90: 50 31 20 61 6e 64 20 50 33 20 61 72 65 20 65 71  P1 and P3 are eq
cfa0: 75 61 6c 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  ual..** See the 
cfb0: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64  Lt opcode for ad
cfc0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
cfd0: 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
cfe0: 64 65 3a 20 4c 65 20 50 31 20 50 32 20 50 33 20  de: Le P1 P2 P3 
cff0: 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
d000: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
d010: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65   the Lt opcode e
d020: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a  xcept that the j
d030: 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a  ump is taken if.
d040: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
d050: 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  f register P3 is
d060: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
d070: 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65  ual to the conte
d080: 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65  nt of.** registe
d090: 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c  r P1.  See the L
d0a0: 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  t opcode for add
d0b0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
d0c0: 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ion..*/./* Opcod
d0d0: 65 3a 20 47 74 20 50 31 20 50 32 20 50 33 20 50  e: Gt P1 P2 P3 P
d0e0: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
d0f0: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
d100: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
d110: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
d120: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
d130: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
d140: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
d150: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d160: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72   content of.** r
d170: 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65  egister P1.  See
d180: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
d190: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
d1a0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
d1b0: 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50   Opcode: Ge P1 P
d1c0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
d1d0: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
d1e0: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
d1f0: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
d200: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
d210: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  n if.** the cont
d220: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
d230: 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
d240: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
d250: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
d260: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
d270: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
d280: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
d290: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
d2a0: 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 20  case OP_Eq:     
d2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
d2c0: 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70  e as TK_EQ, jump
d2d0: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
d2e0: 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20  se OP_Ne:       
d2f0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
d300: 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20  as TK_NE, jump, 
d310: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
d320: 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20 20   OP_Lt:         
d330: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
d340: 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e   TK_LT, jump, in
d350: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
d360: 50 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20 20  P_Le:           
d370: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
d380: 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_LE, jump, in1,
d390: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
d3a0: 47 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Gt:             
d3b0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
d3c0: 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  GT, jump, in1, i
d3d0: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65  n3 */.case OP_Ge
d3e0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
d3f0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 45  /* same as TK_GE
d400: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
d410: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
d420: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 63 68  .  int res;.  ch
d430: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20  ar affinity;..  
d440: 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e 66 6c  flags = pIn1->fl
d450: 61 67 73 7c 70 49 6e 33 2d 3e 66 6c 61 67 73 3b  ags|pIn3->flags;
d460: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
d470: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a  M_Null ){.    /*
d480: 20 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   If either opera
d490: 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  nd is NULL then 
d4a0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  the result is al
d4b0: 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  ways NULL..    *
d4c0: 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61  * The jump is ta
d4d0: 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54  ken if the SQLIT
d4e0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
d4f0: 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a   is set..    */.
d500: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
d510: 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
d520: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d   ){.      pOut =
d530: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
d540: 32 5d 3b 0a 20 20 20 20 20 20 4d 65 6d 53 65 74  2];.      MemSet
d550: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
d560: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  EM_Null);.      
d570: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
d580: 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
d590: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
d5a0: 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55  ->p5 & SQLITE_JU
d5b0: 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  MPIFNULL ){.    
d5c0: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31    pc = pOp->p2-1
d5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
d5e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 69 6e 69  k;.  }..  affini
d5f0: 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53  ty = pOp->p5 & S
d600: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a  QLITE_AFF_MASK;.
d610: 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 20 29    if( affinity )
d620: 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e  {.    applyAffin
d630: 69 74 79 28 70 49 6e 31 2c 20 61 66 66 69 6e 69  ity(pIn1, affini
d640: 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  ty, encoding);. 
d650: 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
d660: 28 70 49 6e 33 2c 20 61 66 66 69 6e 69 74 79 2c  (pIn3, affinity,
d670: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
d680: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d690: 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  iled ) goto no_m
d6a0: 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  em;.  }..  asser
d6b0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
d6c0: 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f  P4_COLLSEQ || pO
d6d0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29  p->p4.pColl==0 )
d6e0: 3b 0a 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  ;.  ExpandBlob(p
d6f0: 49 6e 31 29 3b 0a 20 20 45 78 70 61 6e 64 42 6c  In1);.  ExpandBl
d700: 6f 62 28 70 49 6e 33 29 3b 0a 20 20 72 65 73 20  ob(pIn3);.  res 
d710: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
d720: 61 72 65 28 70 49 6e 33 2c 20 70 49 6e 31 2c 20  are(pIn3, pIn1, 
d730: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 29 3b 0a  pOp->p4.pColl);.
d740: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
d750: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73  pcode ){.    cas
d760: 65 20 4f 50 5f 45 71 3a 20 20 20 20 72 65 73 20  e OP_Eq:    res 
d770: 3d 20 72 65 73 3d 3d 30 3b 20 20 20 20 20 62 72  = res==0;     br
d780: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50  eak;.    case OP
d790: 5f 4e 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65  _Ne:    res = re
d7a0: 73 21 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b  s!=0;     break;
d7b0: 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a  .    case OP_Lt:
d7c0: 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c 30 3b      res = res<0;
d7d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d7e0: 20 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20   case OP_Le:    
d7f0: 72 65 73 20 3d 20 72 65 73 3c 3d 30 3b 20 20 20  res = res<=0;   
d800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
d810: 65 20 4f 50 5f 47 74 3a 20 20 20 20 72 65 73 20  e OP_Gt:    res 
d820: 3d 20 72 65 73 3e 30 3b 20 20 20 20 20 20 62 72  = res>0;      br
d830: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
d840: 3a 20 20 20 20 20 20 20 72 65 73 20 3d 20 72 65  :       res = re
d850: 73 3e 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b  s>=0;     break;
d860: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d  .  }..  if( pOp-
d870: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
d880: 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f 75 74  REP2 ){.    pOut
d890: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d   = &p->aMem[pOp-
d8a0: 3e 70 32 5d 3b 0a 20 20 20 20 4d 65 6d 53 65 74  >p2];.    MemSet
d8b0: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
d8c0: 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75  EM_Int);.    pOu
d8d0: 74 2d 3e 75 2e 69 20 3d 20 72 65 73 3b 0a 20 20  t->u.i = res;.  
d8e0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
d8f0: 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
d900: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73  .  }else if( res
d910: 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
d920: 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72  ->p2-1;.  }.  br
d930: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
d940: 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a  e: Permutation *
d950: 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
d960: 53 65 74 20 74 68 65 20 70 65 72 6d 75 74 61 74  Set the permutat
d970: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
d980: 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61  OP_Compare opera
d990: 74 6f 72 20 74 6f 20 62 65 20 74 68 65 20 61 72  tor to be the ar
d9a0: 72 61 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 67 65  ray.** of intege
d9b0: 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 0a 2a 2a 20  rs in P4..**.** 
d9c0: 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  The permutation 
d9d0: 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75 6e  is only valid un
d9e0: 74 69 6c 20 74 68 65 20 6e 65 78 74 20 4f 50 5f  til the next OP_
d9f0: 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 4f 50 5f  Permutation, OP_
da00: 43 6f 6d 70 61 72 65 2c 0a 2a 2a 20 4f 50 5f 48  Compare,.** OP_H
da10: 61 6c 74 2c 20 6f 72 20 4f 50 5f 52 65 73 75 6c  alt, or OP_Resul
da20: 74 52 6f 77 2e 20 20 54 79 70 69 63 61 6c 6c 79  tRow.  Typically
da30: 20 74 68 65 20 4f 50 5f 50 65 72 6d 75 74 61 74   the OP_Permutat
da40: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ion should occur
da50: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
da60: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 4f 50 5f  prior to the OP_
da70: 43 6f 6d 70 61 72 65 2e 0a 2a 2f 0a 63 61 73 65  Compare..*/.case
da80: 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a   OP_Permutation:
da90: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
daa0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
dab0: 41 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72  ARRAY );.  asser
dac0: 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b  t( pOp->p4.ai );
dad0: 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 70 4f  .  aPermute = pO
dae0: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 62 72 65 61  p->p4.ai;.  brea
daf0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
db00: 20 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50   Compare P1 P2 P
db10: 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d  3 P4 *.**.** Com
db20: 70 61 72 65 20 74 6f 20 76 65 63 74 6f 72 73 20  pare to vectors 
db30: 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  of registers in 
db40: 72 65 67 28 50 31 29 2e 2e 72 65 67 28 50 31 2b  reg(P1)..reg(P1+
db50: 50 33 2d 31 29 20 28 61 6c 6c 20 74 68 69 73 0a  P3-1) (all this.
db60: 2a 2a 20 6f 6e 65 20 22 41 22 29 20 61 6e 64 20  ** one "A") and 
db70: 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
db80: 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
db90: 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
dba0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
dbb0: 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
dbc0: 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
dbd0: 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
dbe0: 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66  * P4 is a KeyInf
dbf0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
dc00: 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69   defines collati
dc10: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64  ng sequences and
dc20: 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20   sort.** orders 
dc30: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
dc40: 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61  on.  The permuta
dc50: 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20  tion applies to 
dc60: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c  registers.** onl
dc70: 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  y.  The KeyInfo 
dc80: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65  elements are use
dc90: 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a  d sequentially..
dca0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72  **.** The compar
dcb0: 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63  ison is a sort c
dcc0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55  omparison, so NU
dcd0: 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61  LLs compare equa
dce0: 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20  l,.** NULLs are 
dcf0: 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72  less than number
dd00: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c  s, numbers are l
dd10: 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73  ess than strings
dd20: 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73  ,.** and strings
dd30: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62   are less than b
dd40: 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  lobs..*/.case OP
dd50: 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e  _Compare: {.  in
dd60: 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
dd70: 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32  int p1;.  int p2
dd80: 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66  ;.  const KeyInf
dd90: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
dda0: 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65  nt idx;.  CollSe
ddb0: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20  q *pColl;    /* 
ddc0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
ddd0: 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69  ce to use on thi
dde0: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
ddf0: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
de00: 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45  * True for DESCE
de10: 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72  NDING sort order
de20: 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e   */..  n = pOp->
de30: 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  p3;.  pKeyInfo =
de40: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
de50: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  o;.  assert( n>0
de60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
de70: 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70  eyInfo!=0 );.  p
de80: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61  1 = pOp->p1;.  a
de90: 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70  ssert( p1>0 && p
dea0: 31 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29  1+n<=p->nMem+1 )
deb0: 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
dec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 32 3e 30  ;.  assert( p2>0
ded0: 20 26 26 20 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d 65   && p2+n<=p->nMe
dee0: 6d 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  m+1 );.  for(i=0
def0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
df00: 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65 20   idx = aPermute 
df10: 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20  ? aPermute[i] : 
df20: 69 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  i;.    REGISTER_
df30: 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26 70  TRACE(p1+idx, &p
df40: 2d 3e 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b  ->aMem[p1+idx]);
df50: 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52  .    REGISTER_TR
df60: 41 43 45 28 70 32 2b 69 64 78 2c 20 26 70 2d 3e  ACE(p2+idx, &p->
df70: 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20  aMem[p2+idx]);. 
df80: 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b 65     assert( i<pKe
df90: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b  yInfo->nField );
dfa0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65  .    pColl = pKe
dfb0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b  yInfo->aColl[i];
dfc0: 0a 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79  .    bRev = pKey
dfd0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
dfe0: 5b 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72  [i];.    iCompar
dff0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  e = sqlite3MemCo
e000: 6d 70 61 72 65 28 26 70 2d 3e 61 4d 65 6d 5b 70  mpare(&p->aMem[p
e010: 31 2b 69 64 78 5d 2c 20 26 70 2d 3e 61 4d 65 6d  1+idx], &p->aMem
e020: 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29  [p2+idx], pColl)
e030: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61  ;.    if( iCompa
e040: 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  re ){.      if( 
e050: 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20  bRev ) iCompare 
e060: 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20  = -iCompare;.   
e070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e080: 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65 20 3d    }.  aPermute =
e090: 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
e0a0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20  /* Opcode: Jump 
e0b0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
e0c0: 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69  ** Jump to the i
e0d0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64  nstruction at ad
e0e0: 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72  dress P1, P2, or
e0f0: 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   P3 depending on
e100: 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74   whether.** in t
e110: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f  he most recent O
e120: 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75  P_Compare instru
e130: 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63  ction the P1 vec
e140: 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74 68 61  tor was less tha
e150: 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  n.** equal to, o
e160: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
e170: 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65  he P2 vector, re
e180: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63  spectively..*/.c
e190: 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20  ase OP_Jump: {  
e1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
e1b0: 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d  mp */.  if( iCom
e1c0: 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20 70 63  pare<0 ){.    pc
e1d0: 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b 0a   = pOp->p1 - 1;.
e1e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6d    }else if( iCom
e1f0: 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pare==0 ){.    p
e200: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
e210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 63  .  }else{.    pc
e220: 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a   = pOp->p3 - 1;.
e230: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
e240: 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
e250: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
e260: 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63  * Take the logic
e270: 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61  al AND of the va
e280: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
e290: 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a  s P1 and P2 and.
e2a0: 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72 65 73  ** write the res
e2b0: 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ult into registe
e2c0: 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
e2d0: 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
e2e0: 73 20 30 20 28 66 61 6c 73 65 29 20 74 68 65 6e  s 0 (false) then
e2f0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
e300: 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20   even if.** the 
e310: 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  other input is N
e320: 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64  ULL.  A NULL and
e330: 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e 55 4c   true or two NUL
e340: 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e 55 4c  Ls give.** a NUL
e350: 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f 2a 20  L output..*/./* 
e360: 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20 50 32  Opcode: Or P1 P2
e370: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
e380: 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f  ke the logical O
e390: 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  R of the values 
e3a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
e3b0: 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f  nd P2 and.** sto
e3c0: 72 65 20 74 68 65 20 61 6e 73 77 65 72 20 69 6e  re the answer in
e3d0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
e3e0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50 31  .** If either P1
e3f0: 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72   or P2 is nonzer
e400: 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20 74 68  o (true) then th
e410: 65 20 72 65 73 75 6c 74 20 69 73 20 31 20 28 74  e result is 1 (t
e420: 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20  rue).** even if 
e430: 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
e440: 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
e450: 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20 74 77   and false or tw
e460: 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20  o NULLs.** give 
e470: 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
e480: 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20  /.case OP_And:  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
e4a0: 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69  ame as TK_AND, i
e4b0: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
e4c0: 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20  .case OP_Or: {  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
e4e0: 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31  me as TK_OR, in1
e4f0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
e500: 20 69 6e 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c   int v1;    /* L
e510: 65 66 74 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d  eft operand:  0=
e520: 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
e530: 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
e540: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b  ULL */.  int v2;
e550: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
e560: 72 61 6e 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20  rand: 0==FALSE, 
e570: 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
e580: 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a  OWN or NULL */..
e590: 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
e5a0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
e5b0: 20 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65      v1 = 2;.  }e
e5c0: 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71  lse{.    v1 = sq
e5d0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
e5e0: 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a  e(pIn1)!=0;.  }.
e5f0: 20 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c 61 67    if( pIn2->flag
e600: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
e610: 20 20 20 20 76 32 20 3d 20 32 3b 0a 20 20 7d 65      v2 = 2;.  }e
e620: 6c 73 65 7b 0a 20 20 20 20 76 32 20 3d 20 73 71  lse{.    v2 = sq
e630: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
e640: 65 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20 7d 0a  e(pIn2)!=0;.  }.
e650: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e660: 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20 20 20  e==OP_And ){.   
e670: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
e680: 73 69 67 6e 65 64 20 63 68 61 72 20 61 6e 64 5f  signed char and_
e690: 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 30  logic[] = { 0, 0
e6a0: 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c  , 0, 0, 1, 2, 0,
e6b0: 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20   2, 2 };.    v1 
e6c0: 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a 33  = and_logic[v1*3
e6d0: 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  +v2];.  }else{. 
e6e0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e6f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 72  unsigned char or
e700: 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20  _logic[] = { 0, 
e710: 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32  1, 2, 1, 1, 1, 2
e720: 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31  , 1, 2 };.    v1
e730: 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a 33   = or_logic[v1*3
e740: 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  +v2];.  }.  if( 
e750: 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d  v1==2 ){.    Mem
e760: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
e770: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  , MEM_Null);.  }
e780: 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  else{.    pOut->
e790: 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65  u.i = v1;.    Me
e7a0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
e7b0: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  t, MEM_Int);.  }
e7c0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
e7d0: 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50  Opcode: Not P1 P
e7e0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
e7f0: 74 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75  terpret the valu
e800: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
e810: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
e820: 6c 75 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a  lue.  Store the.
e830: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c  ** boolean compl
e840: 65 6d 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65  ement in registe
e850: 72 20 50 32 2e 20 20 49 66 20 74 68 65 20 76 61  r P2.  If the va
e860: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
e870: 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20  P1 is .** NULL, 
e880: 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73  then a NULL is s
e890: 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a  tored in P2..*/.
e8a0: 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20  case OP_Not: {  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8c0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c   same as TK_NOT,
e8d0: 20 69 6e 31 20 2a 2f 0a 20 20 70 4f 75 74 20 3d   in1 */.  pOut =
e8e0: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
e8f0: 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  2];.  if( pIn1->
e900: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
e910: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
e920: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
e930: 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
e940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
e950: 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 21  SetInt64(pOut, !
e960: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
e970: 6c 75 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a  lue(pIn1));.  }.
e980: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
e990: 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31  pcode: BitNot P1
e9a0: 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
e9b0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 63 6f  Interpret the co
e9c0: 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
e9d0: 72 20 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67  r P1 as an integ
e9e0: 65 72 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a  er.  Store the.*
e9f0: 2a 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * ones-complemen
ea00: 74 20 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75  t of the P1 valu
ea10: 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
ea20: 50 32 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73  P2.  If P1 holds
ea30: 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20  .** a NULL then 
ea40: 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20  store a NULL in 
ea50: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42  P2..*/.case OP_B
ea60: 69 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20  itNot: {        
ea70: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
ea80: 54 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 20 2a  TK_BITNOT, in1 *
ea90: 2f 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  /.  pOut = &p->a
eaa0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
eab0: 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
eac0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
ead0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
eae0: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
eaf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
eb00: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74  te3VdbeMemSetInt
eb10: 36 34 28 70 4f 75 74 2c 20 7e 73 71 6c 69 74 65  64(pOut, ~sqlite
eb20: 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
eb30: 6e 31 29 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1));.  }.  brea
eb40: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
eb50: 20 49 66 20 50 31 20 50 32 20 50 33 20 2a 20 2a   If P1 P2 P3 * *
eb60: 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
eb70: 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
eb80: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
eb90: 20 74 72 75 65 2e 20 20 54 68 65 20 76 61 6c 75   true.  The valu
eba0: 65 20 69 73 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  e is.** is consi
ebb0: 64 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74  dered true if it
ebc0: 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20   is numeric and 
ebd0: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68  non-zero.  If th
ebe0: 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
ebf0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
ec00: 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50  ke the jump if P
ec10: 33 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 2f 2a  3 is true..*/./*
ec20: 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 20 50   Opcode: IfNot P
ec30: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
ec40: 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
ec50: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
ec60: 69 73 74 65 72 20 50 31 20 69 73 20 46 61 6c 73  ister P1 is Fals
ec70: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  e.  The value is
ec80: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
ec90: 64 20 74 72 75 65 20 69 66 20 69 74 20 68 61 73  d true if it has
eca0: 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65   a numeric value
ecb0: 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68   of zero.  If th
ecc0: 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
ecd0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
ece0: 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50  ke the jump if P
ecf0: 33 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 63 61  3 is true..*/.ca
ed00: 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20  se OP_If:       
ed10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
ed20: 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f  p, in1 */.case O
ed30: 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20  P_IfNot: {      
ed40: 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
ed50: 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20  n1 */.  int c;. 
ed60: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
ed70: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
ed80: 20 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a     c = pOp->p3;.
ed90: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
eda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
edb0: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
edc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
edd0: 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b  tValue(pIn1)!=0;
ede0: 0a 23 65 6c 73 65 0a 20 20 20 20 63 20 3d 20 73  .#else.    c = s
edf0: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
ee00: 6c 75 65 28 70 49 6e 31 29 21 3d 30 2e 30 3b 0a  lue(pIn1)!=0.0;.
ee10: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
ee20: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
ee30: 66 4e 6f 74 20 29 20 63 20 3d 20 21 63 3b 0a 20  fNot ) c = !c;. 
ee40: 20 7d 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20   }.  if( c ){.  
ee50: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31    pc = pOp->p2-1
ee60: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
ee70: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 4e  ../* Opcode: IsN
ee80: 75 6c 6c 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ull P1 P2 P3 * *
ee90: 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
eea0: 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
eeb0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
eec0: 20 4e 55 4c 4c 2e 20 20 49 66 20 50 33 20 69 73   NULL.  If P3 is
eed0: 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
eee0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 63 68 65 63   zero, then chec
eef0: 6b 20 61 6c 6c 20 76 61 6c 75 65 73 20 72 65 67  k all values reg
ef00: 28 50 31 29 2c 20 72 65 67 28 50 31 2b 31 29 2c  (P1), reg(P1+1),
ef10: 20 0a 2a 2a 20 72 65 67 28 50 31 2b 32 29 2c 20   .** reg(P1+2), 
ef20: 2e 2e 2e 2c 20 72 65 67 28 50 31 2b 50 33 2d 31  ..., reg(P1+P3-1
ef30: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73  )..*/.case OP_Is
ef40: 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20  Null: {         
ef50: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
ef60: 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69  _ISNULL, jump, i
ef70: 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 0a 0a  n1 */.  int n;..
ef80: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
ef90: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
efa0: 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 31 3e 30  ==0 || pOp->p1>0
efb0: 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   );.  do{.    if
efc0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
efd0: 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b   MEM_Null)!=0 ){
efe0: 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
eff0: 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 62  >p2 - 1;.      b
f000: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f010: 70 49 6e 31 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  pIn1++;.  }while
f020: 28 20 2d 2d 6e 20 3e 20 30 20 29 3b 0a 20 20 62  ( --n > 0 );.  b
f030: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
f040: 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50  de: NotNull P1 P
f050: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75  2 * * *.**.** Ju
f060: 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
f070: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
f080: 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  r P1 is not NULL
f090: 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  .  .*/.case OP_N
f0a0: 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  otNull: {       
f0b0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
f0c0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70  TK_NOTNULL, jump
f0d0: 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20 28  , in1 */.  if( (
f0e0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
f0f0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
f100: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
f110: 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
f120: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
f130: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 2a 20 50  etNumColumns * P
f140: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
f150: 69 73 20 6f 70 63 6f 64 65 20 73 65 74 73 20 74  is opcode sets t
f160: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
f170: 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 63 75 72  umns for the cur
f180: 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 74 68  sor opened by th
f190: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
f1a0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 50 32  nstruction to P2
f1b0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 50 5f 53 65  ..**.** An OP_Se
f1c0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 69 73 20 6f  tNumColumns is o
f1d0: 6e 6c 79 20 75 73 65 66 75 6c 20 69 66 20 69 74  nly useful if it
f1e0: 20 6f 63 63 75 72 73 20 69 6d 6d 65 64 69 61 74   occurs immediat
f1f0: 65 6c 79 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6f  ely before .** o
f200: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
f210: 69 6e 67 20 6f 70 63 6f 64 65 73 3a 0a 2a 2a 0a  ing opcodes:.**.
f220: 2a 2a 20 20 20 20 20 4f 70 65 6e 52 65 61 64 0a  **     OpenRead.
f230: 2a 2a 20 20 20 20 20 4f 70 65 6e 57 72 69 74 65  **     OpenWrite
f240: 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 50 73 65 75  .**     OpenPseu
f250: 64 6f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  do.**.** If the 
f260: 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
f270: 20 69 73 20 74 6f 20 62 65 20 65 78 65 63 75 74   is to be execut
f280: 65 64 20 6f 6e 20 61 20 63 75 72 73 6f 72 2c 20  ed on a cursor, 
f290: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 6f 70 63  then.** this opc
f2a0: 6f 64 65 20 6d 75 73 74 20 62 65 20 70 72 65 73  ode must be pres
f2b0: 65 6e 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ent immediately 
f2c0: 62 65 66 6f 72 65 20 74 68 65 20 6f 70 63 6f 64  before the opcod
f2d0: 65 20 74 68 61 74 0a 2a 2a 20 6f 70 65 6e 73 20  e that.** opens 
f2e0: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 23  the cursor..*/.#
f2f0: 69 66 20 30 0a 63 61 73 65 20 4f 50 5f 53 65 74  if 0.case OP_Set
f300: 4e 75 6d 43 6f 6c 75 6d 6e 73 3a 20 7b 0a 20 20  NumColumns: {.  
f310: 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  break;.}.#endif.
f320: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75  ./* Opcode: Colu
f330: 6d 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  mn P1 P2 P3 P4 *
f340: 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
f350: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 63   the data that c
f360: 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20  ursor P1 points 
f370: 74 6f 20 61 73 20 61 20 73 74 72 75 63 74 75 72  to as a structur
f380: 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a  e built using.**
f390: 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
f3a0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 28 53  instruction.  (S
f3b0: 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ee the MakeRecor
f3c0: 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  d opcode for add
f3d0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
f3e0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
f3f0: 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 64   format of the d
f400: 61 74 61 2e 29 20 20 45 78 74 72 61 63 74 20 74  ata.)  Extract t
f410: 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a  he P2-th column.
f420: 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72 65 63  ** from this rec
f430: 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65 20 61  ord.  If there a
f440: 72 65 20 6c 65 73 73 20 74 68 61 74 20 28 50 32  re less that (P2
f450: 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69  +1) .** values i
f460: 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20 65 78  n the record, ex
f470: 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a  tract a NULL..**
f480: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 65 78  .** The value ex
f490: 74 72 61 63 74 65 64 20 69 73 20 73 74 6f 72 65  tracted is store
f4a0: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
f4b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
f4c0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 66  olumn contains f
f4d0: 65 77 65 72 20 74 68 61 6e 20 50 32 20 66 69 65  ewer than P2 fie
f4e0: 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72 61 63  lds, then extrac
f4f0: 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a  t a NULL.  Or,.*
f500: 2a 20 69 66 20 74 68 65 20 50 34 20 61 72 67 75  * if the P4 argu
f510: 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d 45 4d  ment is a P4_MEM
f520: 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f   use the value o
f530: 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e  f the P4 argumen
f540: 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  t as.** the resu
f550: 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  lt..*/.case OP_C
f560: 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 75 33 32 20 70  olumn: {.  u32 p
f570: 61 79 6c 6f 61 64 53 69 7a 65 3b 20 20 20 2f 2a  ayloadSize;   /*
f580: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
f590: 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
f5a0: 2f 0a 20 20 69 36 34 20 70 61 79 6c 6f 61 64 53  /.  i64 payloadS
f5b0: 69 7a 65 36 34 3b 20 2f 2a 20 4e 75 6d 62 65 72  ize64; /* Number
f5c0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
f5d0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
f5e0: 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   p1;            
f5f0: 2f 2a 20 50 31 20 76 61 6c 75 65 20 6f 66 20 74  /* P1 value of t
f600: 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  he opcode */.  i
f610: 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20  nt p2;          
f620: 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    /* column numb
f630: 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  er to retrieve *
f640: 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
f650: 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56 44  pC;    /* The VD
f660: 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  BE cursor */.  c
f670: 68 61 72 20 2a 7a 52 65 63 3b 20 20 20 20 20 20  har *zRec;      
f680: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
f690: 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 2d  complete record-
f6a0: 64 61 74 61 20 2a 2f 0a 20 20 42 74 43 75 72 73  data */.  BtCurs
f6b0: 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a 20  or *pCrsr;   /* 
f6c0: 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f 72  The BTree cursor
f6d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 61 54 79 70 65   */.  u32 *aType
f6e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 54 79 70  ;        /* aTyp
f6f0: 65 5b 69 5d 20 68 6f 6c 64 73 20 74 68 65 20 6e  e[i] holds the n
f700: 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 74  umeric type of t
f710: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a  he i-th column *
f720: 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73 65 74  /.  u32 *aOffset
f730: 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66 73 65  ;      /* aOffse
f740: 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74 20 74  t[i] is offset t
f750: 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  o start of data 
f760: 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  for i-th column 
f770: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
f780: 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
f790: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
f7a0: 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
f7b0: 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
f7c0: 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20    /* The length 
f7d0: 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  of the serialize
f7e0: 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  d data for the c
f7f0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
f800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f810: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f820: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 20  .  char *zData; 
f830: 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66        /* Part of
f840: 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e   the record bein
f850: 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 4d  g decoded */.  M
f860: 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20 20 20  em *pDest;      
f870: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
f880: 69 74 65 20 74 68 65 20 65 78 74 72 61 63 74 65  ite the extracte
f890: 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  d value */.  Mem
f8a0: 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   sMem;          
f8b0: 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74  /* For storing t
f8c0: 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
f8d0: 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 75 38 20  decoded */.  u8 
f8e0: 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *zIdx;          
f8f0: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 68 65  /* Index into he
f900: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 45  ader */.  u8 *zE
f910: 6e 64 48 64 72 3b 20 20 20 20 20 20 20 2f 2a 20  ndHdr;       /* 
f920: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
f930: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
f940: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
f950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
f960: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
f970: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 36 34 20  e data */.  u64 
f980: 6f 66 66 73 65 74 36 34 3b 20 20 20 20 20 20 2f  offset64;      /
f990: 2a 20 36 34 2d 62 69 74 20 6f 66 66 73 65 74 2e  * 64-bit offset.
f9a0: 20 20 36 34 20 62 69 74 73 20 6e 65 65 64 65 64    64 bits needed
f9b0: 20 74 6f 20 63 61 74 63 68 20 6f 76 65 72 66 6c   to catch overfl
f9c0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64  ow */.  int szHd
f9d0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  r;         /* Si
f9e0: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
f9f0: 20 73 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73   size field at s
fa00: 74 61 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a  tart of record *
fa10: 2f 0a 20 20 69 6e 74 20 61 76 61 69 6c 3b 20 20  /.  int avail;  
fa20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
fa30: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
fa40: 69 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 0a  ilable data */..
fa50: 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
fa60: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
fa70: 0a 20 20 70 43 20 3d 20 30 3b 0a 20 20 6d 65 6d  .  pC = 0;.  mem
fa80: 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69  set(&sMem, 0, si
fa90: 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 61  zeof(sMem));.  a
faa0: 73 73 65 72 74 28 20 70 31 3c 70 2d 3e 6e 43 75  ssert( p1<p->nCu
fab0: 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
fac0: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
fad0: 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
fae0: 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 70 2d  );.  pDest = &p-
faf0: 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  >aMem[pOp->p3];.
fb00: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
fb10: 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c  (pDest, MEM_Null
fb20: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  );..  /* This bl
fb30: 6f 63 6b 20 73 65 74 73 20 74 68 65 20 76 61 72  ock sets the var
fb40: 69 61 62 6c 65 20 70 61 79 6c 6f 61 64 53 69 7a  iable payloadSiz
fb50: 65 20 74 6f 20 62 65 20 74 68 65 20 74 6f 74 61  e to be the tota
fb60: 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  l number of.  **
fb70: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65   bytes in the re
fb80: 63 6f 72 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cord..  **.  ** 
fb90: 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 62  zRec is set to b
fba0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
fbb0: 65 78 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ext of the recor
fbc0: 64 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  d if it is avail
fbd0: 61 62 6c 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  able..  ** The c
fbe0: 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20 74  omplete record t
fbf0: 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 61 76  ext is always av
fc00: 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 73 65 75  ailable for pseu
fc10: 64 6f 2d 74 61 62 6c 65 73 0a 20 20 2a 2a 20 49  do-tables.  ** I
fc20: 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
fc30: 73 74 6f 72 65 64 20 69 6e 20 61 20 63 75 72 73  stored in a curs
fc40: 6f 72 2c 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  or, the complete
fc50: 20 72 65 63 6f 72 64 20 74 65 78 74 0a 20 20 2a   record text.  *
fc60: 2a 20 6d 69 67 68 74 20 62 65 20 61 76 61 69 6c  * might be avail
fc70: 61 62 6c 65 20 69 6e 20 74 68 65 20 20 70 43 2d  able in the  pC-
fc80: 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20 4f 72  >aRow cache.  Or
fc90: 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65   it might not be
fca0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 64 61  ..  ** If the da
fcb0: 74 61 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ta is unavailabl
fcc0: 65 2c 20 20 7a 52 65 63 20 69 73 20 73 65 74 20  e,  zRec is set 
fcd0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  to NULL..  **.  
fce0: 2a 2a 20 57 65 20 61 6c 73 6f 20 63 6f 6d 70 75  ** We also compu
fcf0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
fd00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
fd10: 72 65 63 6f 72 64 2e 20 20 46 6f 72 20 63 75 72  record.  For cur
fd20: 73 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65 20 6e  sors,.  ** the n
fd30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fd40: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
fd50: 65 20 56 64 62 65 43 75 72 73 6f 72 2e 6e 46 69  e VdbeCursor.nFi
fd60: 65 6c 64 20 65 6c 65 6d 65 6e 74 2e 0a 20 20 2a  eld element..  *
fd70: 2f 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  /.  pC = p->apCs
fd80: 72 5b 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  r[p1];.  assert(
fd90: 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65   pC!=0 );.#ifnde
fda0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
fdb0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 61 73 73  RTUALTABLE.  ass
fdc0: 65 72 74 28 20 70 43 2d 3e 70 56 74 61 62 43 75  ert( pC->pVtabCu
fdd0: 72 73 6f 72 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  rsor==0 );.#endi
fde0: 66 0a 20 20 69 66 28 20 70 43 2d 3e 70 43 75 72  f.  if( pC->pCur
fdf0: 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  sor!=0 ){.    /*
fe00: 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 73   The record is s
fe10: 74 6f 72 65 64 20 69 6e 20 61 20 42 2d 54 72 65  tored in a B-Tre
fe20: 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
fe30: 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
fe40: 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20 69  oveto(pC);.    i
fe50: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
fe60: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
fe70: 0a 20 20 20 20 7a 52 65 63 20 3d 20 30 3b 0a 20  .    zRec = 0;. 
fe80: 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70     pCrsr = pC->p
fe90: 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
fea0: 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  pC->nullRow ){. 
feb0: 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a 65       payloadSize
fec0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
fed0: 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53 74 61  if( pC->cacheSta
fee0: 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43 74 72  tus==p->cacheCtr
fef0: 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61   ){.      payloa
ff00: 64 53 69 7a 65 20 3d 20 70 43 2d 3e 70 61 79 6c  dSize = pC->payl
ff10: 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 20 20 7a  oadSize;.      z
ff20: 52 65 63 20 3d 20 28 63 68 61 72 2a 29 70 43 2d  Rec = (char*)pC-
ff30: 3e 61 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65  >aRow;.    }else
ff40: 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78   if( pC->isIndex
ff50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ff60: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
ff70: 72 73 72 2c 20 26 70 61 79 6c 6f 61 64 53 69 7a  rsr, &payloadSiz
ff80: 65 36 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e64);.      if( 
ff90: 28 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20 26  (payloadSize64 &
ffa0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
ffb0: 21 3d 28 75 36 34 29 70 61 79 6c 6f 61 64 53 69  !=(u64)payloadSi
ffc0: 7a 65 36 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ze64 ){.        
ffd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
ffe0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
fff0: 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
10000 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
10010 20 7d 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64   }.      payload
10020 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 79 6c  Size = (u32)payl
10030 6f 61 64 53 69 7a 65 36 34 3b 0a 20 20 20 20 7d  oadSize64;.    }
10040 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
10050 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
10060 28 70 43 72 73 72 2c 20 26 70 61 79 6c 6f 61 64  (pCrsr, &payload
10070 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
10080 20 6e 46 69 65 6c 64 20 3d 20 70 43 2d 3e 6e 46   nField = pC->nF
10090 69 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ield;.  }else{. 
100a0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70     assert( pC->p
100b0 73 65 75 64 6f 54 61 62 6c 65 20 29 3b 0a 20 20  seudoTable );.  
100c0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
100d0 69 73 20 74 68 65 20 73 6f 6c 65 20 65 6e 74 72  is the sole entr
100e0 79 20 6f 66 20 61 20 70 73 65 75 64 6f 2d 74 61  y of a pseudo-ta
100f0 62 6c 65 20 2a 2f 0a 20 20 20 20 70 61 79 6c 6f  ble */.    paylo
10100 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 6e 44 61  adSize = pC->nDa
10110 74 61 3b 0a 20 20 20 20 7a 52 65 63 20 3d 20 70  ta;.    zRec = p
10120 43 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 70 43  C->pData;.    pC
10130 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
10140 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
10150 20 61 73 73 65 72 74 28 20 70 61 79 6c 6f 61 64   assert( payload
10160 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52 65 63 21  Size==0 || zRec!
10170 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  =0 );.    nField
10180 20 3d 20 70 43 2d 3e 6e 46 69 65 6c 64 3b 0a 20   = pC->nField;. 
10190 20 20 20 70 43 72 73 72 20 3d 20 30 3b 0a 20 20     pCrsr = 0;.  
101a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f  }..  /* If paylo
101b0 61 64 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65  adSize is 0, the
101c0 6e 20 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e  n just store a N
101d0 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 70 61 79  ULL */.  if( pay
101e0 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  loadSize==0 ){. 
101f0 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
10200 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
10210 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 5f   );.    goto op_
10220 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 7d 0a  column_out;.  }.
10230 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 4c    assert( db->aL
10240 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
10250 54 5f 4c 45 4e 47 54 48 5d 3e 3d 30 20 29 3b 0a  T_LENGTH]>=0 );.
10260 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a    if( payloadSiz
10270 65 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69  e > (u32)db->aLi
10280 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10290 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
102a0 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
102b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c  }..  assert( p2<
102c0 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
102d0 52 65 61 64 20 61 6e 64 20 70 61 72 73 65 20 74  Read and parse t
102e0 68 65 20 74 61 62 6c 65 20 68 65 61 64 65 72 2e  he table header.
102f0 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
10300 6c 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65  lts of the parse
10310 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72  .  ** into the r
10320 65 63 6f 72 64 20 68 65 61 64 65 72 20 63 61 63  ecord header cac
10330 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
10340 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20   cursor..  */.  
10350 61 54 79 70 65 20 3d 20 70 43 2d 3e 61 54 79 70  aType = pC->aTyp
10360 65 3b 0a 20 20 69 66 28 20 70 43 2d 3e 63 61 63  e;.  if( pC->cac
10370 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63  heStatus==p->cac
10380 68 65 43 74 72 20 29 7b 0a 20 20 20 20 61 4f 66  heCtr ){.    aOf
10390 66 73 65 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73  fset = pC->aOffs
103a0 65 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  et;.  }else{.   
103b0 20 61 73 73 65 72 74 28 61 54 79 70 65 29 3b 0a   assert(aType);.
103c0 20 20 20 20 61 76 61 69 6c 20 3d 20 30 3b 0a 20      avail = 0;. 
103d0 20 20 20 70 43 2d 3e 61 4f 66 66 73 65 74 20 3d     pC->aOffset =
103e0 20 61 4f 66 66 73 65 74 20 3d 20 26 61 54 79 70   aOffset = &aTyp
103f0 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 70  e[nField];.    p
10400 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d  C->payloadSize =
10410 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20   payloadSize;.  
10420 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
10430 73 20 3d 20 70 2d 3e 63 61 63 68 65 43 74 72 3b  s = p->cacheCtr;
10440 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
10450 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
10460 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 68 65  es are in the he
10470 61 64 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  ader */.    if( 
10480 7a 52 65 63 20 29 7b 0a 20 20 20 20 20 20 7a 44  zRec ){.      zD
10490 61 74 61 20 3d 20 7a 52 65 63 3b 0a 20 20 20 20  ata = zRec;.    
104a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
104b0 20 70 43 2d 3e 69 73 49 6e 64 65 78 20 29 7b 0a   pC->isIndex ){.
104c0 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20          zData = 
104d0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74  (char*)sqlite3Bt
104e0 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 72 73  reeKeyFetch(pCrs
104f0 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20  r, &avail);.    
10500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10510 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29   zData = (char*)
10520 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
10530 46 65 74 63 68 28 70 43 72 73 72 2c 20 26 61 76  Fetch(pCrsr, &av
10540 61 69 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ail);.      }.  
10550 20 20 20 20 2f 2a 20 49 66 20 4b 65 79 46 65 74      /* If KeyFet
10560 63 68 28 29 2f 44 61 74 61 46 65 74 63 68 28 29  ch()/DataFetch()
10570 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
10580 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
10590 61 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76  ad,.      ** sav
105a0 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
105b0 20 74 68 65 20 70 43 2d 3e 61 52 6f 77 20 63 61   the pC->aRow ca
105c0 63 68 65 2e 20 20 54 68 61 74 20 77 69 6c 6c 20  che.  That will 
105d0 73 61 76 65 20 75 73 20 66 72 6f 6d 0a 20 20 20  save us from.   
105e0 20 20 20 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20     ** having to 
105f0 6d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  make additional 
10600 63 61 6c 6c 73 20 74 6f 20 66 65 74 63 68 20 74  calls to fetch t
10610 68 65 20 63 6f 6e 74 65 6e 74 20 70 6f 72 74 69  he content porti
10620 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  on of.      ** t
10630 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20  he record..     
10640 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10650 28 20 61 76 61 69 6c 3e 3d 30 20 29 3b 0a 20 20  ( avail>=0 );.  
10660 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 53      if( payloadS
10670 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76 61 69  ize <= (u32)avai
10680 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  l ){.        zRe
10690 63 20 3d 20 7a 44 61 74 61 3b 0a 20 20 20 20 20  c = zData;.     
106a0 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75     pC->aRow = (u
106b0 38 2a 29 7a 44 61 74 61 3b 0a 20 20 20 20 20 20  8*)zData;.      
106c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
106d0 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20  C->aRow = 0;.   
106e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
106f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10700 61 73 73 65 72 74 20 69 73 20 74 72 75 65 20 69  assert is true i
10710 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 63 63 65  n all cases acce
10720 70 74 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74  pt when.    ** t
10730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10740 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75 70   has been corrup
10750 74 65 64 20 65 78 74 65 72 6e 61 6c 6c 79 2e 0a  ted externally..
10760 20 20 20 20 2a 2a 20 20 20 20 61 73 73 65 72 74      **    assert
10770 28 20 7a 52 65 63 21 3d 30 20 7c 7c 20 61 76 61  ( zRec!=0 || ava
10780 69 6c 3e 3d 70 61 79 6c 6f 61 64 53 69 7a 65 20  il>=payloadSize 
10790 7c 7c 20 61 76 61 69 6c 3e 3d 39 20 29 3b 20 2a  || avail>=9 ); *
107a0 2f 0a 20 20 20 20 73 7a 48 64 72 20 3d 20 67 65  /.    szHdr = ge
107b0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 7a  tVarint32((u8*)z
107c0 44 61 74 61 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Data, offset);..
107d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
107e0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
107f0 61 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65  ase has not give
10800 6e 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65  n us an oversize
10810 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2a 20   header..    ** 
10820 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20 61  Do this now to a
10830 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a 65  void an oversize
10840 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10850 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  on..    **.    *
10860 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 63  * Type entries c
10870 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  an be between 1 
10880 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 68  and 5 bytes each
10890 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 62  .  But 4 and 5 b
108a0 79 74 65 0a 20 20 20 20 2a 2a 20 74 79 70 65 73  yte.    ** types
108b0 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64 61 74   use so much dat
108c0 61 20 73 70 61 63 65 20 74 68 61 74 20 74 68 65  a space that the
108d0 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34  re can only be 4
108e0 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a 20 20  096 and 32 of.  
108f0 20 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70 65    ** them, respe
10900 63 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68 65  ctively.  So the
10910 20 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72 20   maximum header 
10920 6c 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20 66  length results f
10930 72 6f 6d 20 61 0a 20 20 20 20 2a 2a 20 33 2d 62  rom a.    ** 3-b
10940 79 74 65 20 74 79 70 65 20 66 6f 72 20 65 61 63  yte type for eac
10950 68 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  h of the maximum
10960 20 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d 6e   of 32768 column
10970 73 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20 20  s plus three.   
10980 20 2a 2a 20 65 78 74 72 61 20 62 79 74 65 73 20   ** extra bytes 
10990 66 6f 72 20 74 68 65 20 68 65 61 64 65 72 20 6c  for the header l
109a0 65 6e 67 74 68 20 69 74 73 65 6c 66 2e 20 20 33  ength itself.  3
109b0 32 37 36 38 2a 33 20 2b 20 33 20 3d 20 39 38 33  2768*3 + 3 = 983
109c0 30 37 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  07..    */.    i
109d0 66 28 20 6f 66 66 73 65 74 20 3e 20 39 38 33 30  f( offset > 9830
109e0 37 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  7 ){.      rc = 
109f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10a00 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
10a10 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20  op_column_out;. 
10a20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
10a30 70 75 74 65 20 69 6e 20 6c 65 6e 20 74 68 65 20  pute in len the 
10a40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
10a50 6f 66 20 64 61 74 61 20 77 65 20 6e 65 65 64 20  of data we need 
10a60 74 6f 20 72 65 61 64 20 69 6e 20 6f 72 64 65 72  to read in order
10a70 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 6e  .    ** to get n
10a80 46 69 65 6c 64 20 74 79 70 65 20 76 61 6c 75 65  Field type value
10a90 73 2e 20 20 6f 66 66 73 65 74 20 69 73 20 61 6e  s.  offset is an
10aa0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   upper bound on 
10ab0 74 68 69 73 2e 20 20 42 75 74 0a 20 20 20 20 2a  this.  But.    *
10ac0 2a 20 6e 46 69 65 6c 64 20 6d 69 67 68 74 20 62  * nField might b
10ad0 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
10ae0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 74 72  less than the tr
10af0 75 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ue number of col
10b00 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74  umns.    ** in t
10b10 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 69 6e  he table, and in
10b20 20 74 68 61 74 20 63 61 73 65 2c 20 35 2a 6e 46   that case, 5*nF
10b30 69 65 6c 64 2b 33 20 6d 69 67 68 74 20 62 65 20  ield+3 might be 
10b40 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 66 66  smaller than off
10b50 73 65 74 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  set..    ** We w
10b60 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20  ant to minimize 
10b70 6c 65 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  len in order to 
10b80 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
10b90 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20  f the memory.   
10ba0 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20   ** allocation, 
10bb0 65 73 70 65 63 69 61 6c 6c 79 20 69 66 20 61 20  especially if a 
10bc0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
10bd0 20 66 69 6c 65 20 68 61 73 20 63 61 75 73 65 64   file has caused
10be0 20 6f 66 66 73 65 74 0a 20 20 20 20 2a 2a 20 74   offset.    ** t
10bf0 6f 20 62 65 20 6f 76 65 72 73 69 7a 65 64 2e 20  o be oversized. 
10c00 4f 66 66 73 65 74 20 69 73 20 6c 69 6d 69 74 65  Offset is limite
10c10 64 20 74 6f 20 39 38 33 30 37 20 61 62 6f 76 65  d to 98307 above
10c20 2e 20 20 42 75 74 20 39 38 33 30 37 20 6d 69 67  .  But 98307 mig
10c30 68 74 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  ht.    ** still 
10c40 65 78 63 65 65 64 20 52 6f 62 73 6f 6e 20 6d 65  exceed Robson me
10c50 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
10c60 6c 69 6d 69 74 73 20 6f 6e 20 73 6f 6d 65 20 63  limits on some c
10c70 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0a 20  onfigurations.. 
10c80 20 20 20 2a 2a 20 4f 6e 20 73 79 73 74 65 6d 73     ** On systems
10c90 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 74 6f 6c   that cannot tol
10ca0 65 72 61 74 65 20 6c 61 72 67 65 20 6d 65 6d 6f  erate large memo
10cb0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2c 20  ry allocations, 
10cc0 6e 46 69 65 6c 64 2a 35 2b 33 0a 20 20 20 20 2a  nField*5+3.    *
10cd0 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65  * will likely be
10ce0 20 6d 75 63 68 20 73 6d 61 6c 6c 65 72 20 73 69   much smaller si
10cf0 6e 63 65 20 6e 46 69 65 6c 64 20 77 69 6c 6c 20  nce nField will 
10d00 6c 69 6b 65 6c 79 20 62 65 20 6c 65 73 73 20 74  likely be less t
10d10 68 61 6e 0a 20 20 20 20 2a 2a 20 32 30 20 6f 72  han.    ** 20 or
10d20 20 73 6f 2e 20 20 54 68 69 73 20 69 6e 73 75 72   so.  This insur
10d30 65 73 20 74 68 61 74 20 52 6f 62 73 6f 6e 20 6d  es that Robson m
10d40 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
10d50 20 6c 69 6d 69 74 73 20 61 72 65 0a 20 20 20 20   limits are.    
10d60 2a 2a 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20  ** not exceeded 
10d70 65 76 65 6e 20 66 6f 72 20 63 6f 72 72 75 70 74  even for corrupt
10d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
10d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
10da0 3d 20 6e 46 69 65 6c 64 2a 35 20 2b 20 33 3b 0a  = nField*5 + 3;.
10db0 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 69      if( len > (i
10dc0 6e 74 29 6f 66 66 73 65 74 20 29 20 6c 65 6e 20  nt)offset ) len 
10dd0 3d 20 28 69 6e 74 29 6f 66 66 73 65 74 3b 0a 0a  = (int)offset;..
10de0 20 20 20 20 2f 2a 20 54 68 65 20 4b 65 79 46 65      /* The KeyFe
10df0 74 63 68 28 29 20 6f 72 20 44 61 74 61 46 65 74  tch() or DataFet
10e00 63 68 28 29 20 61 62 6f 76 65 20 61 72 65 20 66  ch() above are f
10e10 61 73 74 20 61 6e 64 20 77 69 6c 6c 20 67 65 74  ast and will get
10e20 20 74 68 65 20 65 6e 74 69 72 65 0a 20 20 20 20   the entire.    
10e30 2a 2a 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  ** record header
10e40 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 2e 20   in most cases. 
10e50 20 42 75 74 20 74 68 65 79 20 77 69 6c 6c 20 66   But they will f
10e60 61 69 6c 20 74 6f 20 67 65 74 20 74 68 65 20 63  ail to get the c
10e70 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 72  omplete.    ** r
10e80 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 66 20  ecord header if 
10e90 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64 65  the record heade
10ea0 72 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 6f  r does not fit o
10eb0 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 0a  n a single page.
10ec0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 42 2d      ** in the B-
10ed0 54 72 65 65 2e 20 20 57 68 65 6e 20 74 68 61 74  Tree.  When that
10ee0 20 68 61 70 70 65 6e 73 2c 20 75 73 65 20 73 71   happens, use sq
10ef0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
10f00 42 74 72 65 65 28 29 20 74 6f 0a 20 20 20 20 2a  Btree() to.    *
10f10 2a 20 61 63 71 75 69 72 65 20 74 68 65 20 63 6f  * acquire the co
10f20 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 74 65  mplete header te
10f30 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  xt..    */.    i
10f40 66 28 20 21 7a 52 65 63 20 26 26 20 61 76 61 69  f( !zRec && avai
10f50 6c 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 73  l<len ){.      s
10f60 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  Mem.flags = 0;. 
10f70 20 20 20 20 20 73 4d 65 6d 2e 64 62 20 3d 20 30       sMem.db = 0
10f80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10f90 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
10fa0 74 72 65 65 28 70 43 72 73 72 2c 20 30 2c 20 6c  tree(pCrsr, 0, l
10fb0 65 6e 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c  en, pC->isIndex,
10fc0 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69   &sMem);.      i
10fd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
10ff0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
11000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44        }.      zD
11010 61 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20  ata = sMem.z;.  
11020 20 20 7d 0a 20 20 20 20 7a 45 6e 64 48 64 72 20    }.    zEndHdr 
11030 3d 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 6c  = (u8 *)&zData[l
11040 65 6e 5d 3b 0a 20 20 20 20 7a 49 64 78 20 3d 20  en];.    zIdx = 
11050 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 73 7a 48  (u8 *)&zData[szH
11060 64 72 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 63 61  dr];..    /* Sca
11070 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
11080 20 75 73 65 20 69 74 20 74 6f 20 66 69 6c 6c 20   use it to fill 
11090 69 6e 20 74 68 65 20 61 54 79 70 65 5b 5d 20 61  in the aType[] a
110a0 6e 64 20 61 4f 66 66 73 65 74 5b 5d 0a 20 20 20  nd aOffset[].   
110b0 20 2a 2a 20 61 72 72 61 79 73 2e 20 20 61 54 79   ** arrays.  aTy
110c0 70 65 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61  pe[i] will conta
110d0 69 6e 20 74 68 65 20 74 79 70 65 20 69 6e 74 65  in the type inte
110e0 67 65 72 20 66 6f 72 20 74 68 65 20 69 2d 74 68  ger for the i-th
110f0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 61  .    ** column a
11100 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d 20 77 69  nd aOffset[i] wi
11110 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6f  ll contain the o
11120 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 62  ffset from the b
11130 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eginning.    ** 
11140 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f  of the record to
11150 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
11160 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  e data for the i
11170 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  -th column.    *
11180 2f 0a 20 20 20 20 6f 66 66 73 65 74 36 34 20 3d  /.    offset64 =
11190 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 66 6f 72   offset;.    for
111a0 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
111b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
111c0 7a 49 64 78 3c 7a 45 6e 64 48 64 72 20 29 7b 0a  zIdx<zEndHdr ){.
111d0 20 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b          aOffset[
111e0 69 5d 20 3d 20 28 75 33 32 29 6f 66 66 73 65 74  i] = (u32)offset
111f0 36 34 3b 0a 20 20 20 20 20 20 20 20 7a 49 64 78  64;.        zIdx
11200 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
11210 7a 49 64 78 2c 20 61 54 79 70 65 5b 69 5d 29 3b  zIdx, aType[i]);
11220 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 36  .        offset6
11230 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  4 += sqlite3Vdbe
11240 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 61 54  SerialTypeLen(aT
11250 79 70 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ype[i]);.      }
11260 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11270 20 49 66 20 69 20 69 73 20 6c 65 73 73 20 74 68   If i is less th
11280 61 74 20 6e 46 69 65 6c 64 2c 20 74 68 65 6e 20  at nField, then 
11290 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 66  there are less f
112a0 69 65 6c 64 73 20 69 6e 20 74 68 69 73 0a 20 20  ields in this.  
112b0 20 20 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20        ** record 
112c0 74 68 61 6e 20 53 65 74 4e 75 6d 43 6f 6c 75 6d  than SetNumColum
112d0 6e 73 20 69 6e 64 69 63 61 74 65 64 20 74 68 65  ns indicated the
112e0 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
112f0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
11300 20 74 61 62 6c 65 2e 20 53 65 74 20 74 68 65 20   table. Set the 
11310 6f 66 66 73 65 74 20 66 6f 72 20 61 6e 79 20 65  offset for any e
11320 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74  xtra columns not
11330 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20 20   present in.    
11340 20 20 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72      ** the recor
11350 64 20 74 6f 20 30 2e 20 54 68 69 73 20 74 65 6c  d to 0. This tel
11360 6c 73 20 63 6f 64 65 20 62 65 6c 6f 77 20 74 6f  ls code below to
11370 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 0a 20 20   store a NULL.  
11380 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64        ** instead
11390 20 6f 66 20 64 65 73 65 72 69 61 6c 69 7a 69 6e   of deserializin
113a0 67 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  g a value from t
113b0 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 20  he record..     
113c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 4f     */.        aO
113d0 66 66 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ffset[i] = 0;.  
113e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
113f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
11400 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20  lease(&sMem);.  
11410 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20 3d 20 4d    sMem.flags = M
11420 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20 20 20 2f 2a  EM_Null;..    /*
11430 20 49 66 20 77 65 20 68 61 76 65 20 72 65 61 64   If we have read
11440 20 6d 6f 72 65 20 68 65 61 64 65 72 20 64 61 74   more header dat
11450 61 20 74 68 61 6e 20 77 61 73 20 63 6f 6e 74 61  a than was conta
11460 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
11470 65 72 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  er,.    ** or if
11480 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11490 6c 61 73 74 20 66 69 65 6c 64 20 61 70 70 65 61  last field appea
114a0 72 73 20 74 6f 20 62 65 20 70 61 73 74 20 74 68  rs to be past th
114b0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
114c0 20 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 69   ** record, or i
114d0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
114e0 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70 70 65   last field appe
114f0 61 72 73 20 74 6f 20 62 65 20 62 65 66 6f 72 65  ars to be before
11500 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
11510 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 28 77  of the record (w
11520 68 65 6e 20 61 6c 6c 20 66 69 65 6c 64 73 20 70  hen all fields p
11530 72 65 73 65 6e 74 29 2c 20 74 68 65 6e 20 77 65  resent), then we
11540 20 6d 75 73 74 20 62 65 20 64 65 61 6c 69 6e 67   must be dealing
11550 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 20   .    ** with a 
11560 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
11570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11580 20 28 7a 49 64 78 20 3e 20 7a 45 6e 64 48 64 72   (zIdx > zEndHdr
11590 29 7c 7c 20 28 6f 66 66 73 65 74 36 34 20 3e 20  )|| (offset64 > 
115a0 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20  payloadSize).   
115b0 20 20 7c 7c 20 28 7a 49 64 78 3d 3d 7a 45 6e 64    || (zIdx==zEnd
115c0 48 64 72 20 26 26 20 6f 66 66 73 65 74 36 34 21  Hdr && offset64!
115d0 3d 28 75 36 34 29 70 61 79 6c 6f 61 64 53 69 7a  =(u64)payloadSiz
115e0 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e) ){.      rc =
115f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11600 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
11610 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
11620 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11630 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  Get the column i
11640 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61  nformation. If a
11650 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f  Offset[p2] is no
11660 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20  n-zero, then .  
11670 2a 2a 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74  ** deserialize t
11680 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
11690 65 20 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66  e record. If aOf
116a0 66 73 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f  fset[p2] is zero
116b0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
116c0 65 20 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68  e are not enough
116d0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
116e0 65 63 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79  ecord to satisfy
116f0 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73   the.  ** reques
11700 74 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65  t.  In this case
11710 2c 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  , set the value 
11720 4e 55 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66  NULL or to P4 if
11730 20 50 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f   P4 is.  ** a po
11740 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f  inter to a Mem o
11750 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  bject..  */.  if
11760 28 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b  ( aOffset[p2] ){
11770 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
11780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
11790 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20    if( zRec ){.  
117a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
117b0 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61  emReleaseExterna
117c0 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  l(pDest);.      
117d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
117e0 6c 47 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63  lGet((u8 *)&zRec
117f0 5b 61 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61  [aOffset[p2]], a
11800 54 79 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29  Type[p2], pDest)
11810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11820 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
11830 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
11840 6e 28 61 54 79 70 65 5b 70 32 5d 29 3b 0a 20 20  n(aType[p2]);.  
11850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
11860 65 6d 4d 6f 76 65 28 26 73 4d 65 6d 2c 20 70 44  emMove(&sMem, pD
11870 65 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  est);.      rc =
11880 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
11890 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20  romBtree(pCrsr, 
118a0 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e  aOffset[p2], len
118b0 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26  , pC->isIndex, &
118c0 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  sMem);.      if(
118d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
118e0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f  {.        goto o
118f0 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20  p_column_out;.  
11900 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74      }.      zDat
11910 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20  a = sMem.z;.    
11920 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
11930 69 61 6c 47 65 74 28 28 75 38 2a 29 7a 44 61 74  ialGet((u8*)zDat
11940 61 2c 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44  a, aType[p2], pD
11950 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  est);.    }.    
11960 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63  pDest->enc = enc
11970 6f 64 69 6e 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oding;.  }else{.
11980 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
11990 79 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20  ype==P4_MEM ){. 
119a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
119b0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70  MemShallowCopy(p
119c0 44 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d  Dest, pOp->p4.pM
119d0 65 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b  em, MEM_Static);
119e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
119f0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11a00 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  >flags&MEM_Null 
11a10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11a20 2f 2a 20 49 66 20 77 65 20 64 79 6e 61 6d 69 63  /* If we dynamic
11a30 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ally allocated s
11a40 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
11a50 20 64 61 74 61 20 28 69 6e 20 74 68 65 0a 20 20   data (in the.  
11a60 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ** sqlite3VdbeMe
11a70 6d 46 72 6f 6d 42 74 72 65 65 28 29 20 63 61 6c  mFromBtree() cal
11a80 6c 20 61 62 6f 76 65 29 20 74 68 65 6e 20 74 72  l above) then tr
11a90 61 6e 73 66 65 72 20 63 6f 6e 74 72 6f 6c 20 6f  ansfer control o
11aa0 66 20 74 68 61 74 0a 20 20 2a 2a 20 64 79 6e 61  f that.  ** dyna
11ab0 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
11ac0 64 20 73 70 61 63 65 20 6f 76 65 72 20 74 6f 20  d space over to 
11ad0 74 68 65 20 70 44 65 73 74 20 73 74 72 75 63 74  the pDest struct
11ae0 75 72 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ure..  ** This p
11af0 72 65 76 65 6e 74 73 20 61 20 6d 65 6d 6f 72 79  revents a memory
11b00 20 63 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66   copy..  */.  if
11b10 28 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29  ( sMem.zMalloc )
11b20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 4d  {.    assert( sM
11b30 65 6d 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c  em.z==sMem.zMall
11b40 6f 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oc );.    assert
11b50 28 20 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73  ( !(pDest->flags
11b60 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20   & MEM_Dyn) );. 
11b70 20 20 20 61 73 73 65 72 74 28 20 21 28 70 44 65     assert( !(pDe
11b80 73 74 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  st->flags & (MEM
11b90 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 20  _Blob|MEM_Str)) 
11ba0 7c 7c 20 70 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65  || pDest->z==sMe
11bb0 6d 2e 7a 20 29 3b 0a 20 20 20 20 70 44 65 73 74  m.z );.    pDest
11bc0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
11bd0 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69  _Ephem|MEM_Stati
11be0 63 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66  c);.    pDest->f
11bf0 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
11c00 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d  ;.    pDest->z =
11c10 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70 44 65   sMem.z;.    pDe
11c20 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d  st->zMalloc = sM
11c30 65 6d 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a  em.zMalloc;.  }.
11c40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
11c50 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61  dbeMemMakeWritea
11c60 62 6c 65 28 70 44 65 73 74 29 3b 0a 0a 6f 70 5f  ble(pDest);..op_
11c70 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50  column_out:.  UP
11c80 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
11c90 45 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49  E(pDest);.  REGI
11ca0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
11cb0 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72  p3, pDest);.  br
11cc0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
11cd0 65 3a 20 41 66 66 69 6e 69 74 79 20 50 31 20 50  e: Affinity P1 P
11ce0 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41  2 * P4 *.**.** A
11cf0 70 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20  pply affinities 
11d00 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32  to a range of P2
11d10 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
11d20 69 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a  ing with P1..**.
11d30 2a 2a 20 50 34 20 69 73 20 61 20 73 74 72 69 6e  ** P4 is a strin
11d40 67 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61  g that is P2 cha
11d50 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68  racters long. Th
11d60 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20  e nth character 
11d70 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
11d80 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
11d90 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
11da0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
11db0 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a  ed for the nth.*
11dc0 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  * memory cell in
11dd0 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63   the range..*/.c
11de0 61 73 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a  ase OP_Affinity:
11df0 20 7b 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 69   {.  char *zAffi
11e00 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61  nity;   /* The a
11e10 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70  ffinity to be ap
11e20 70 6c 69 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  plied */.  Mem *
11e30 70 44 61 74 61 30 3b 20 20 20 20 20 20 20 2f 2a  pData0;       /*
11e40 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20   First register 
11e50 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 6c  to which to appl
11e60 79 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20  y affinity */.  
11e70 4d 65 6d 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  Mem *pLast;     
11e80 20 20 20 2f 2a 20 4c 61 73 74 20 72 65 67 69 73     /* Last regis
11e90 74 65 72 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ter to which to 
11ea0 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 2a  apply affinity *
11eb0 2f 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20  /.  Mem *pRec;  
11ec0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
11ed0 74 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  t register */.. 
11ee0 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70   zAffinity = pOp
11ef0 2d 3e 70 34 2e 7a 3b 0a 20 20 70 44 61 74 61 30  ->p4.z;.  pData0
11f00 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d   = &p->aMem[pOp-
11f10 3e 70 31 5d 3b 0a 20 20 70 4c 61 73 74 20 3d 20  >p1];.  pLast = 
11f20 26 70 44 61 74 61 30 5b 70 4f 70 2d 3e 70 32 2d  &pData0[pOp->p2-
11f30 31 5d 3b 0a 20 20 66 6f 72 28 70 52 65 63 3d 70  1];.  for(pRec=p
11f40 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61  Data0; pRec<=pLa
11f50 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  st; pRec++){.   
11f60 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65 63   ExpandBlob(pRec
11f70 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  );.    applyAffi
11f80 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66 66 69  nity(pRec, zAffi
11f90 6e 69 74 79 5b 70 52 65 63 2d 70 44 61 74 61 30  nity[pRec-pData0
11fa0 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  ], encoding);.  
11fb0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
11fc0 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65 63   Opcode: MakeRec
11fd0 6f 72 64 20 50 31 20 50 32 20 50 33 20 50 34 20  ord P1 P2 P3 P4 
11fe0 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  *.**.** Convert 
11ff0 50 32 20 72 65 67 69 73 74 65 72 73 20 62 65 67  P2 registers beg
12000 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 31 20 69  inning with P1 i
12010 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e 74  nto a single ent
12020 72 79 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  ry.** suitable f
12030 6f 72 20 75 73 65 20 61 73 20 61 20 64 61 74 61  or use as a data
12040 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74   record in a dat
12050 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
12060 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e  s a key.** in an
12070 20 69 6e 64 65 78 2e 20 20 54 68 65 20 64 65 74   index.  The det
12080 61 69 6c 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ails of the form
12090 61 74 20 61 72 65 20 69 72 72 65 6c 65 76 61 6e  at are irrelevan
120a0 74 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  t as long as.** 
120b0 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
120c0 63 6f 64 65 20 63 61 6e 20 64 65 63 6f 64 65 20  code can decode 
120d0 74 68 65 20 72 65 63 6f 72 64 20 6c 61 74 65 72  the record later
120e0 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 73 6f  ..** Refer to so
120f0 75 72 63 65 20 63 6f 64 65 20 63 6f 6d 6d 65 6e  urce code commen
12100 74 73 20 66 6f 72 20 74 68 65 20 64 65 74 61 69  ts for the detai
12110 6c 73 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ls of the record
12120 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  .** format..**.*
12130 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74  * P4 may be a st
12140 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20  ring that is P2 
12150 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e  characters long.
12160 20 20 54 68 65 20 6e 74 68 20 63 68 61 72 61 63    The nth charac
12170 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  ter of the.** st
12180 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74  ring indicates t
12190 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
121a0 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
121b0 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e  e used for the n
121c0 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  th.** field of t
121d0 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a  he index key..**
121e0 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67 20  .** The mapping 
121f0 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20 74  from character t
12200 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 67 69  o affinity is gi
12210 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49 54  ven by the SQLIT
12220 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73  E_AFF_.** macros
12230 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
12240 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49  teInt.h..**.** I
12250 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68 65  f P4 is NULL the
12260 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c  n all index fiel
12270 64 73 20 68 61 76 65 20 74 68 65 20 61 66 66 69  ds have the affi
12280 6e 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63 61  nity NONE..*/.ca
12290 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  se OP_MakeRecord
122a0 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52 65  : {.  u8 *zNewRe
122b0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  cord;        /* 
122c0 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
122d0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
122e0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
122f0 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20 20    Mem *pRec;    
12300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12310 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
12320 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20 20  u64 nData;      
12330 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12340 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
12350 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74  a space */.  int
12360 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20 20   nHdr;          
12370 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12380 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   bytes of header
12390 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34 20   space */.  i64 
123a0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
123b0 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63 65     /* Data space
123c0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
123d0 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  is record */.  i
123e0 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20  nt nZero;       
123f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12400 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74  of zero bytes at
12410 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
12420 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
12430 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20 20  nVarint;        
12440 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12450 62 79 74 65 73 20 69 6e 20 61 20 76 61 72 69 6e  bytes in a varin
12460 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  t */.  u32 seria
12470 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  l_type;       /*
12480 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a 20   Type field */. 
12490 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20 20   Mem *pData0;   
124a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
124b0 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f 6d   field to be com
124c0 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 72  bined into the r
124d0 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  ecord */.  Mem *
124e0 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  pLast;          
124f0 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64 20    /* Last field 
12500 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
12510 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
12520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12530 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
12540 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
12550 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79   char *zAffinity
12560 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
12570 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
12580 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  or the record */
12590 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  .  int file_form
125a0 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  at;       /* Fil
125b0 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20  e format to use 
125c0 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  for encoding */.
125d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
125e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
125f0 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65  e used in zNewRe
12600 63 6f 72 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  cord[] */.  int 
12610 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
12620 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
12630 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f 2a  a field */..  /*
12640 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 72 65   Assuming the re
12650 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20  cord contains N 
12660 66 69 65 6c 64 73 2c 20 74 68 65 20 72 65 63 6f  fields, the reco
12670 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a  rd format looks.
12680 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a    ** like this:.
12690 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d    **.  ** ------
126a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126e0 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69  --.  ** | hdr-si
126f0 7a 65 20 7c 20 74 79 70 65 20 30 20 7c 20 74 79  ze | type 0 | ty
12700 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70  pe 1 | ... | typ
12710 65 20 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c 20  e N-1 | data0 | 
12720 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c  ... | data N-1 |
12730 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d   .  ** ---------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12780 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30    **.  ** Data(0
12790 29 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ) is taken from 
127a0 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 44 61  register P1.  Da
127b0 74 61 28 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d  ta(1) comes from
127c0 20 72 65 67 69 73 74 65 72 20 50 31 2b 31 0a 20   register P1+1. 
127d0 20 2a 2a 20 61 6e 64 20 73 6f 20 66 72 6f 74 68   ** and so froth
127e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68  ..  **.  ** Each
127f0 20 74 79 70 65 20 66 69 65 6c 64 20 69 73 20 61   type field is a
12800 20 76 61 72 69 6e 74 20 72 65 70 72 65 73 65 6e   varint represen
12810 74 69 6e 67 20 74 68 65 20 73 65 72 69 61 6c 20  ting the serial 
12820 74 79 70 65 20 6f 66 20 74 68 65 20 0a 20 20 2a  type of the .  *
12830 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
12840 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 28 73 65  data element (se
12850 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  e sqlite3VdbeSer
12860 69 61 6c 54 79 70 65 28 29 29 2e 20 54 68 65 0a  ialType()). The.
12870 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66 69    ** hdr-size fi
12880 65 6c 64 20 69 73 20 61 6c 73 6f 20 61 20 76 61  eld is also a va
12890 72 69 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  rint which is th
128a0 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68  e offset from th
128b0 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
128c0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74   of the record t
128d0 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20  o data0..  */.  
128e0 6e 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20  nData = 0;      
128f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12900 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70  bytes of data sp
12910 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d 20  ace */.  nHdr = 
12920 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  0;          /* N
12930 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
12940 66 20 68 65 61 64 65 72 20 73 70 61 63 65 20 2a  f header space *
12950 2f 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b 20 20  /.  nByte = 0;  
12960 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 73         /* Data s
12970 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
12980 72 20 74 68 69 73 20 72 65 63 6f 72 64 20 2a 2f  r this record */
12990 0a 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  .  nZero = 0;   
129a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
129b0 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74  of zero bytes at
129c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
129d0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 6e 46 69 65  record */.  nFie
129e0 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  ld = pOp->p1;.  
129f0 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
12a00 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
12a10 20 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 4f 70   nField>0 && pOp
12a20 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
12a30 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d 3e 6e 4d 65  2+nField<=p->nMe
12a40 6d 2b 31 20 29 3b 0a 20 20 70 44 61 74 61 30 20  m+1 );.  pData0 
12a50 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 46 69 65 6c  = &p->aMem[nFiel
12a60 64 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  d];.  nField = p
12a70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20  Op->p2;.  pLast 
12a80 3d 20 26 70 44 61 74 61 30 5b 6e 46 69 65 6c 64  = &pData0[nField
12a90 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d  -1];.  file_form
12aa0 61 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65  at = p->minWrite
12ab0 46 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f  FileFormat;..  /
12ac0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
12ad0 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74  he elements that
12ae0 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68   will make up th
12af0 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75  e record to figu
12b00 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20  re.  ** out how 
12b10 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
12b20 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e  quired for the n
12b30 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  ew record..  */.
12b40 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61    for(pRec=pData
12b50 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20  0; pRec<=pLast; 
12b60 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  pRec++){.    if(
12b70 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   zAffinity ){.  
12b80 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
12b90 79 28 70 52 65 63 2c 20 7a 41 66 66 69 6e 69 74  y(pRec, zAffinit
12ba0 79 5b 70 52 65 63 2d 70 44 61 74 61 30 5d 2c 20  y[pRec-pData0], 
12bb0 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 7d  encoding);.    }
12bc0 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66  .    if( pRec->f
12bd0 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 20 26 26  lags&MEM_Zero &&
12be0 20 70 52 65 63 2d 3e 6e 3e 30 20 29 7b 0a 20 20   pRec->n>0 ){.  
12bf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
12c00 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65  emExpandBlob(pRe
12c10 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  c);.    }.    se
12c20 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
12c30 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
12c40 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72  e(pRec, file_for
12c50 6d 61 74 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  mat);.    len = 
12c60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12c70 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
12c80 74 79 70 65 29 3b 0a 20 20 20 20 6e 44 61 74 61  type);.    nData
12c90 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 6e 48 64   += len;.    nHd
12ca0 72 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  r += sqlite3Vari
12cb0 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
12cc0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63  e);.    if( pRec
12cd0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
12ce0 72 6f 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ro ){.      /* O
12cf0 6e 6c 79 20 70 75 72 65 20 7a 65 72 6f 2d 66 69  nly pure zero-fi
12d00 6c 6c 65 64 20 42 4c 4f 42 73 20 63 61 6e 20 62  lled BLOBs can b
12d10 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  e input to this 
12d20 4f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a  Opcode..      **
12d30 20 57 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77   We do not allow
12d40 20 62 6c 6f 62 73 20 77 69 74 68 20 61 20 70 72   blobs with a pr
12d50 65 66 69 78 20 61 6e 64 20 61 20 7a 65 72 6f 2d  efix and a zero-
12d60 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 2a 2f 0a  filled tail. */.
12d70 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20 70        nZero += p
12d80 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rec->u.nZero;.  
12d90 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 20    }else if( len 
12da0 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20 3d  ){.      nZero =
12db0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
12dc0 20 2f 2a 20 41 64 64 20 74 68 65 20 69 6e 69 74   /* Add the init
12dd0 69 61 6c 20 68 65 61 64 65 72 20 76 61 72 69 6e  ial header varin
12de0 74 20 61 6e 64 20 74 6f 74 61 6c 20 74 68 65 20  t and total the 
12df0 73 69 7a 65 20 2a 2f 0a 20 20 6e 48 64 72 20 2b  size */.  nHdr +
12e00 3d 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c 69  = nVarint = sqli
12e10 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64  te3VarintLen(nHd
12e20 72 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 69 6e  r);.  if( nVarin
12e30 74 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  t<sqlite3VarintL
12e40 65 6e 28 6e 48 64 72 29 20 29 7b 0a 20 20 20 20  en(nHdr) ){.    
12e50 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42  nHdr++;.  }.  nB
12e60 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61  yte = nHdr+nData
12e70 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e 42  -nZero;.  if( nB
12e80 79 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  yte>db->aLimit[S
12e90 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
12ea0 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TH] ){.    goto 
12eb0 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20  too_big;.  }..  
12ec0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
12ed0 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
12ee0 20 68 61 73 20 61 20 62 75 66 66 65 72 20 6c 61   has a buffer la
12ef0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74  rge enough to st
12f00 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65  ore .  ** the ne
12f10 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75  w record. The ou
12f20 74 70 75 74 20 72 65 67 69 73 74 65 72 20 28 70  tput register (p
12f30 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61  Op->p3) is not a
12f40 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62  llowed to.  ** b
12f50 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70  e one of the inp
12f60 75 74 20 72 65 67 69 73 74 65 72 73 20 28 62 65  ut registers (be
12f70 63 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77  cause the follow
12f80 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  ing call to.  **
12f90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
12fa0 72 6f 77 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62  row() could clob
12fb0 62 65 72 20 74 68 65 20 76 61 6c 75 65 20 62 65  ber the value be
12fc0 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 29  fore it is used)
12fd0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12fe0 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31   pOp->p3<pOp->p1
12ff0 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70   || pOp->p3>=pOp
13000 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a  ->p1+pOp->p2 );.
13010 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65    pOut = &p->aMe
13020 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66  m[pOp->p3];.  if
13030 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
13040 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29  Grow(pOut, (int)
13050 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20  nByte, 0) ){.   
13060 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
13070 7d 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d  }.  zNewRecord =
13080 20 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a   (u8 *)pOut->z;.
13090 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
130a0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20  record */.  i = 
130b0 70 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77  putVarint32(zNew
130c0 52 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20  Record, nHdr);. 
130d0 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30   for(pRec=pData0
130e0 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70  ; pRec<=pLast; p
130f0 52 65 63 2b 2b 29 7b 0a 20 20 20 20 73 65 72 69  Rec++){.    seri
13100 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
13110 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
13120 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pRec, file_forma
13130 74 29 3b 0a 20 20 20 20 69 20 2b 3d 20 70 75 74  t);.    i += put
13140 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52 65  Varint32(&zNewRe
13150 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f  cord[i], serial_
13160 74 79 70 65 29 3b 20 20 20 20 20 20 2f 2a 20 73  type);      /* s
13170 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20  erial type */.  
13180 7d 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61  }.  for(pRec=pDa
13190 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74  ta0; pRec<=pLast
131a0 3b 20 70 52 65 63 2b 2b 29 7b 20 20 2f 2a 20 73  ; pRec++){  /* s
131b0 65 72 69 61 6c 20 64 61 74 61 20 2a 2f 0a 20 20  erial data */.  
131c0 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    i += sqlite3Vd
131d0 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e 65  beSerialPut(&zNe
131e0 77 52 65 63 6f 72 64 5b 69 5d 2c 20 28 69 6e 74  wRecord[i], (int
131f0 29 28 6e 42 79 74 65 2d 69 29 2c 20 70 52 65 63  )(nByte-i), pRec
13200 2c 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20  ,file_format);. 
13210 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d   }.  assert( i==
13220 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73 65  nByte );..  asse
13230 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
13240 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
13250 6d 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  m );.  pOut->n =
13260 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
13270 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
13280 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e 3b  _Blob | MEM_Dyn;
13290 0a 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20 3d 20  .  pOut->xDel = 
132a0 30 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29  0;.  if( nZero )
132b0 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a  {.    pOut->u.nZ
132c0 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20  ero = nZero;.   
132d0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20   pOut->flags |= 
132e0 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  MEM_Zero;.  }.  
132f0 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pOut->enc = SQLI
13300 54 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20  TE_UTF8;  /* In 
13310 63 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73  case the blob is
13320 20 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64 20   ever converted 
13330 74 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45 47  to text */.  REG
13340 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
13350 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50  >p3, pOut);.  UP
13360 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
13370 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
13380 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
13390 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  Count P1 P2 * * 
133a0 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68  *.**.** Store th
133b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
133c0 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72 20  ies (an integer 
133d0 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74 61  value) in the ta
133e0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a  ble or index .**
133f0 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f   opened by curso
13400 72 20 50 31 20 69 6e 20 72 65 67 69 73 74 65 72  r P1 in register
13410 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53   P2.*/.#ifndef S
13420 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
13430 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f  COUNT.case OP_Co
13440 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  unt: {         /
13450 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
13460 65 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72  e */.  i64 nEntr
13470 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  y;.  BtCursor *p
13480 43 72 73 72 3b 0a 0a 20 20 70 43 72 73 72 20 3d  Crsr;..  pCrsr =
13490 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
134a0 31 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  1]->pCursor;.  i
134b0 66 28 20 70 43 72 73 72 20 29 7b 0a 20 20 20 20  f( pCrsr ){.    
134c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
134d0 65 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e  eCount(pCrsr, &n
134e0 45 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  Entry);.  }else{
134f0 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b  .    nEntry = 0;
13500 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  .  }.  pOut->fla
13510 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
13520 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74  pOut->u.i = nEnt
13530 72 79 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  ry;.  break;.}.#
13540 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65  endif../* Opcode
13550 3a 20 53 74 61 74 65 6d 65 6e 74 20 50 31 20 2a  : Statement P1 *
13560 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67   * * *.**.** Beg
13570 69 6e 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c  in an individual
13580 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
13590 61 63 74 69 6f 6e 20 77 68 69 63 68 20 69 73 20  action which is 
135a0 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
135b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
135c0 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64    This is needed
135d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 74 61   so that the sta
135e0 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
135f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
13600 65 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68  er an error with
13610 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
13620 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 65  ll back the.** e
13630 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
13640 6e 2e 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  n.  The statemen
13650 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  t transaction wi
13660 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
13670 0a 2a 2a 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20  .** commit when 
13680 74 68 65 20 56 44 42 45 20 68 61 6c 74 73 2e 0a  the VDBE halts..
13690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
136a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
136b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
136c0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
136d0 20 28 74 68 61 74 20 0a 2a 2a 20 69 73 20 74 6f   (that .** is to
136e0 20 73 61 79 2c 20 69 66 20 69 74 20 69 73 20 69   say, if it is i
136f0 6e 20 62 65 74 77 65 65 6e 20 42 45 47 49 4e 20  n between BEGIN 
13700 61 6e 64 20 43 4f 4d 4d 49 54 29 0a 2a 2a 20 61  and COMMIT).** a
13710 6e 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20  nd if there are 
13720 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  no other active 
13730 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
13740 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
13750 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74  ** connection, t
13760 68 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69  hen this operati
13770 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
13780 4e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  No statement tra
13790 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6e  nsaction.** is n
137a0 65 65 64 65 64 20 73 69 6e 63 65 20 61 6e 79 20  eeded since any 
137b0 65 72 72 6f 72 20 63 61 6e 20 75 73 65 20 74 68  error can use th
137c0 65 20 6e 6f 72 6d 61 6c 20 52 4f 4c 4c 42 41 43  e normal ROLLBAC
137d0 4b 20 70 72 6f 63 65 73 73 20 74 6f 0a 2a 2a 20  K process to.** 
137e0 75 6e 64 6f 20 63 68 61 6e 67 65 73 2e 0a 2a 2a  undo changes..**
137f0 0a 2a 2a 20 49 66 20 61 20 73 74 61 74 65 6d 65  .** If a stateme
13800 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
13810 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20  s started, then 
13820 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  a statement jour
13830 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 77 69 6c 6c  nal file.** will
13840 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   be allocated an
13850 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  d initialized..*
13860 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65  *.** The stateme
13870 6e 74 20 69 73 20 62 65 67 75 6e 20 6f 6e 20 74  nt is begun on t
13880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13890 20 77 69 74 68 20 69 6e 64 65 78 20 50 31 2e 20   with index P1. 
138a0 20 54 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 61 74   The main.** dat
138b0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
138c0 6e 20 69 6e 64 65 78 20 6f 66 20 30 20 61 6e 64  n index of 0 and
138d0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
138e0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  or temporary tab
138f0 6c 65 73 0a 2a 2a 20 68 61 73 20 61 6e 20 69 6e  les.** has an in
13900 64 65 78 20 6f 66 20 31 2e 0a 2a 2f 0a 63 61 73  dex of 1..*/.cas
13910 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a 20  e OP_Statement: 
13920 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 72  {.  int i;.  Btr
13930 65 65 20 2a 70 42 74 3b 0a 20 20 69 66 28 20 64  ee *pBt;.  if( d
13940 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
13950 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76 65 56 64   || db->activeVd
13960 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 69  beCnt>1 ){.    i
13970 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = pOp->p1;.    
13980 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
13990 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  i<db->nDb );.   
139a0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
139b0 5b 69 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20  [i].pBt!=0 );.  
139c0 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
139d0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  i].pBt;.    asse
139e0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
139f0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
13a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
13a10 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31  ->btreeMask & (1
13a20 3c 3c 69 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  <<i))!=0 );.    
13a30 69 66 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  if( p->iStatemen
13a40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  t==0 ){.      as
13a50 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
13a60 6d 65 6e 74 3e 3d 30 20 26 26 20 64 62 2d 3e 6e  ment>=0 && db->n
13a70 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a  Savepoint>=0 );.
13a80 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
13a90 6d 65 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 70  ment++; .      p
13aa0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64  ->iStatement = d
13ab0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20  b->nSavepoint + 
13ac0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a  db->nStatement;.
13ad0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13ae0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
13af0 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69 53 74  Stmt(pBt, p->iSt
13b00 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  atement);.  }.  
13b10 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
13b20 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e 74 20 50  ode: Savepoint P
13b30 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
13b40 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   Open, release o
13b50 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  r rollback the s
13b60 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64 20 62  avepoint named b
13b70 79 20 70 61 72 61 6d 65 74 65 72 20 50 34 2c 20  y parameter P4, 
13b80 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
13b90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 31 2e  the value of P1.
13ba0 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 73   To open a new s
13bb0 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 30 2e  avepoint, P1==0.
13bc0 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   To release (com
13bd0 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69 73 74  mit) an.** exist
13be0 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c 20 50  ing savepoint, P
13bf0 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f 6c 6c  1==1, or to roll
13c00 62 61 63 6b 20 61 6e 20 65 78 69 73 74 69 6e 67  back an existing
13c10 20 73 61 76 65 70 6f 69 6e 74 20 50 31 3d 3d 32   savepoint P1==2
13c20 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 61 76  ..*/.case OP_Sav
13c30 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20  epoint: {.  int 
13c40 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
13c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13c60 61 6c 75 65 20 6f 66 20 50 31 20 6f 70 65 72 61  alue of P1 opera
13c70 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  nd */.  char *zN
13c80 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
13c90 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
13ca0 6f 66 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  of savepoint */.
13cb0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 53    int nName;.  S
13cc0 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65 77 3b 0a  avepoint *pNew;.
13cd0 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61    Savepoint *pSa
13ce0 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61 76 65 70  vepoint;.  Savep
13cf0 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20 20 69 6e  oint *pTmp;.  in
13d00 74 20 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  t iSavepoint;.  
13d10 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31 20 3d 20  int ii;..  p1 = 
13d20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e 61 6d 65  pOp->p1;.  zName
13d30 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 0a 20   = pOp->p4.z;.. 
13d40 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
13d50 74 68 65 20 70 31 20 70 61 72 61 6d 65 74 65 72  the p1 parameter
13d60 20 69 73 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20   is valid. Also 
13d70 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
13d80 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72   no open.  ** tr
13d90 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
13da0 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62 65 20  there cannot be 
13db0 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  any savepoints. 
13dc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13dd0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d  db->pSavepoint==
13de0 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
13df0 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
13e00 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e  rt( p1==SAVEPOIN
13e10 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56  T_BEGIN||p1==SAV
13e20 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c  EPOINT_RELEASE||
13e30 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p1==SAVEPOINT_RO
13e40 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
13e50 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  rt( db->pSavepoi
13e60 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e  nt || db->isTran
13e70 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
13e80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
13e90 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43   checkSavepointC
13ea0 6f 75 6e 74 28 64 62 29 20 29 3b 0a 0a 20 20 69  ount(db) );..  i
13eb0 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
13ec0 5f 42 45 47 49 4e 20 29 7b 0a 20 20 20 20 69 66  _BEGIN ){.    if
13ed0 28 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  ( db->writeVdbeC
13ee0 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  nt>0 ){.      /*
13ef0 20 41 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74   A new savepoint
13f00 20 63 61 6e 6e 6f 74 20 62 65 20 63 72 65 61 74   cannot be creat
13f10 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ed if there are 
13f20 61 63 74 69 76 65 20 77 72 69 74 65 20 0a 20 20  active write .  
13f30 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
13f40 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20 72 65 61  s (i.e. open rea
13f50 64 2f 77 72 69 74 65 20 69 6e 63 72 65 6d 65 6e  d/write incremen
13f60 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73  tal blob handles
13f70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
13f80 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
13f90 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
13fa0 64 62 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  db, "cannot open
13fb0 20 73 61 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20   savepoint - ". 
13fc0 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
13fd0 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
13fe0 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
13ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
14000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
14010 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
14020 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 0a  rlen30(zName);..
14030 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
14040 61 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20  a new savepoint 
14050 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
14060 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
14070 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
14080 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69  , sizeof(Savepoi
14090 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  nt)+nName+1);.  
140a0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
140b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e          pNew->zN
140c0 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ame = (char *)&p
140d0 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
140e0 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61  memcpy(pNew->zNa
140f0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
14100 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  +1);.    .      
14110 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
14120 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   no open transac
14130 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20  tion, then mark 
14140 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
14150 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72  l.        ** "tr
14160 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
14170 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20  int". */.       
14180 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
14190 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
141a0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
141b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
141c0 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
141d0 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20  Savepoint = 1;. 
141e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
141f0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
14200 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  epoint++;.      
14210 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 20    }.    .       
14220 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
14230 20 73 61 76 65 70 6f 69 6e 74 20 69 6e 74 6f 20   savepoint into 
14240 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
14250 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 20  dle's list. */. 
14260 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65         pNew->pNe
14270 78 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  xt = db->pSavepo
14280 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  int;.        db-
14290 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 4e  >pSavepoint = pN
142a0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
142b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
142c0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a  Savepoint = 0;..
142d0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
142e0 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  named savepoint.
142f0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
14300 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 2c 20  such savepoint, 
14310 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61  then an.    ** a
14320 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
14330 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14340 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20    */.    for(.  
14350 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d      pSavepoint =
14360 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
14370 20 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69   .      pSavepoi
14380 6e 74 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  nt && sqlite3Str
14390 49 43 6d 70 28 70 53 61 76 65 70 6f 69 6e 74 2d  ICmp(pSavepoint-
143a0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
143b0 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
143c0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
143d0 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20 20 20  Next.    ){.    
143e0 20 20 69 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a    iSavepoint++;.
143f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
14400 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
14410 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
14420 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
14430 20 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 73 61   db, "no such sa
14440 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e  vepoint: %s", zN
14450 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ame);.      rc =
14460 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14470 20 20 20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20     }else if( .  
14480 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56        db->writeV
14490 64 62 65 43 6e 74 3e 30 20 7c 7c 20 28 70 31 3d  dbeCnt>0 || (p1=
144a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
144b0 41 43 4b 20 26 26 20 64 62 2d 3e 61 63 74 69 76  ACK && db->activ
144c0 65 56 64 62 65 43 6e 74 3e 31 29 20 0a 20 20 20  eVdbeCnt>1) .   
144d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
144e0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
144f0 74 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  to release (comm
14500 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20  it) a savepoint 
14510 69 66 20 74 68 65 72 65 20 61 72 65 20 0a 20 20  if there are .  
14520 20 20 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72      ** active wr
14530 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ite statements. 
14540 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
14550 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  le to rollback a
14560 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
14570 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
14580 20 61 6e 79 20 61 63 74 69 76 65 20 73 74 61 74   any active stat
14590 65 6d 65 6e 74 73 20 61 74 20 61 6c 6c 2e 0a 20  ements at all.. 
145a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
145b0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
145c0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
145d0 0a 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74  .        "cannot
145e0 20 25 73 20 73 61 76 65 70 6f 69 6e 74 20 2d 20   %s savepoint - 
145f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
14600 6e 20 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20  n progress",.   
14610 20 20 20 20 20 28 70 31 3d 3d 53 41 56 45 50 4f       (p1==SAVEPO
14620 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 3f 20 22  INT_ROLLBACK ? "
14630 72 6f 6c 6c 62 61 63 6b 22 3a 20 22 72 65 6c 65  rollback": "rele
14640 61 73 65 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  ase").      );. 
14650 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14660 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
14670 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  {..      /* Dete
14680 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
14690 20 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74   not this is a t
146a0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
146b0 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20  oint. If so,.   
146c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69     ** and this i
146d0 73 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d  s a RELEASE comm
146e0 61 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  and, then the cu
146f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
14700 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  n .      ** is c
14710 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20  ommitted. .     
14720 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
14730 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53  Transaction = pS
14740 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d  avepoint->pNext=
14750 3d 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e  =0 && db->isTran
14760 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
14770 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
14780 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d  ansaction && p1=
14790 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
147a0 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62  SE ){.        db
147b0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
147c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
147d0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
147e0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
147f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63  .          p->pc
14800 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 20 20 20   = pc;.         
14810 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14820 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14830 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49  ->rc = rc = SQLI
14840 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
14850 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
14860 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
14870 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
14880 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
14890 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
148a0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  c = p->rc;.     
148b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
148c0 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  iSavepoint = db-
148d0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53  >nSavepoint - iS
148e0 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20  avepoint - 1;.  
148f0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
14900 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
14910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14920 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
14930 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  vepoint(db->aDb[
14940 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61  ii].pBt, p1, iSa
14950 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
14960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14980 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
14990 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
149a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
149b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
149c0 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p1==SAVEPOINT_RO
149d0 4c 4c 42 41 43 4b 20 26 26 20 28 64 62 2d 3e 66  LLBACK && (db->f
149e0 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
149f0 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 29 7b  rnChanges)!=0 ){
14a00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14a10 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
14a20 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
14a30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14a40 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
14a50 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
14a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14a70 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61 72   .      /* Regar
14a80 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
14a90 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
14aa0 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20  SE or ROLLBACK, 
14ab0 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20 20  destroy all .   
14ac0 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73     ** savepoints
14ad0 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20 6f   nested inside o
14ae0 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
14af0 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20 6f  being operated o
14b00 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  n. */.      whil
14b10 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  e( db->pSavepoin
14b20 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  t!=pSavepoint ){
14b30 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d 20  .        pTmp = 
14b40 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
14b50 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
14b60 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
14b70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
14b80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14b90 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64  pTmp);.        d
14ba0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b  b->nSavepoint--;
14bb0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14bc0 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52 45  /* If it is a RE
14bd0 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74  LEASE, then dest
14be0 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
14bf0 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
14c00 20 6f 6e 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20   on too */.     
14c10 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49   if( p1==SAVEPOI
14c20 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
14c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
14c40 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53  avepoint==db->pS
14c50 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20  avepoint );.    
14c60 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
14c70 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt = pSavepoint-
14c80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
14c90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14ca0 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
14cb0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72         if( !isTr
14cc0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
14cd0 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
14ce0 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20  point--;.       
14cf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14d00 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  .  }..  break;.}
14d10 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74  ../* Opcode: Aut
14d20 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a 20  oCommit P1 P2 * 
14d30 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  * *.**.** Set th
14d40 65 20 64 61 74 61 62 61 73 65 20 61 75 74 6f 2d  e database auto-
14d50 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 50  commit flag to P
14d60 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20 50  1 (1 or 0). If P
14d70 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a  2 is true, roll.
14d80 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72 72  ** back any curr
14d90 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74 72  ently active btr
14da0 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ee transactions.
14db0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
14dc0 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20  y active.** VMs 
14dd0 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73  (apart from this
14de0 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20 52 4f   one), then a RO
14df0 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20 20 41  LLBACK fails.  A
14e00 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20 69 66   COMMIT fails if
14e10 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 63  .** there are ac
14e20 74 69 76 65 20 77 72 69 74 69 6e 67 20 56 4d 73  tive writing VMs
14e30 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73 20 74   or active VMs t
14e40 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
14e50 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
14e60 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75   instruction cau
14e70 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61  ses the VM to ha
14e80 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  lt..*/.case OP_A
14e90 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69  utoCommit: {.  i
14ea0 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  nt desiredAutoCo
14eb0 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c  mmit;.  int iRol
14ec0 6c 62 61 63 6b 3b 0a 20 20 69 6e 74 20 74 75 72  lback;.  int tur
14ed0 6e 4f 6e 41 43 3b 0a 0a 20 20 64 65 73 69 72 65  nOnAC;..  desire
14ee0 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f  dAutoCommit = pO
14ef0 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61  p->p1;.  iRollba
14f00 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  ck = pOp->p2;.  
14f10 74 75 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69 72  turnOnAC = desir
14f20 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20  edAutoCommit && 
14f30 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b  !db->autoCommit;
14f40 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72  .  assert( desir
14f50 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20  edAutoCommit==1 
14f60 7c 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  || desiredAutoCo
14f70 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  mmit==0 );.  ass
14f80 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f  ert( desiredAuto
14f90 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f  Commit==1 || iRo
14fa0 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  llback==0 );.  a
14fb0 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76  ssert( db->activ
14fc0 65 56 64 62 65 43 6e 74 3e 30 20 29 3b 20 20 2f  eVdbeCnt>0 );  /
14fd0 2a 20 41 74 20 6c 65 61 73 74 20 74 68 69 73 20  * At least this 
14fe0 6f 6e 65 20 56 4d 20 69 73 20 61 63 74 69 76 65  one VM is active
14ff0 20 2a 2f 0a 0a 20 20 69 66 28 20 74 75 72 6e 4f   */..  if( turnO
15000 6e 41 43 20 26 26 20 69 52 6f 6c 6c 62 61 63 6b  nAC && iRollback
15010 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
15020 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f  beCnt>1 ){.    /
15030 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74 72 75  * If this instru
15040 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
15050 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
15060 6f 74 68 65 72 20 56 4d 73 20 61 72 65 0a 20 20  other VMs are.  
15070 20 20 2a 2a 20 73 74 69 6c 6c 20 72 75 6e 6e 69    ** still runni
15080 6e 67 2c 20 61 6e 64 20 61 20 74 72 61 6e 73 61  ng, and a transa
15090 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
150a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
150b0 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
150c0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  ** that the othe
150d0 72 20 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c  r VMs must compl
150e0 65 74 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20  ete first. .    
150f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  */.    sqlite3Se
15100 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
15110 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74  Msg, db, "cannot
15120 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
15130 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20  ction - ".      
15140 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74    "SQL statement
15150 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b  s in progress");
15160 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15170 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69  _BUSY;.  }else i
15180 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26 20 21  f( turnOnAC && !
15190 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d  iRollback && db-
151a0 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3e 31 20  >writeVdbeCnt>1 
151b0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
151c0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d  s instruction im
151d0 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49  plements a COMMI
151e0 54 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20  T and other VMs 
151f0 61 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20  are writing.    
15200 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ** return an err
15210 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  or indicating th
15220 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73  at the other VMs
15230 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66   must complete f
15240 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  irst. .    */.  
15250 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
15260 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
15270 64 62 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  db, "cannot comm
15280 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d  it transaction -
15290 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20   ".        "SQL 
152a0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
152b0 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63  ogress");.    rc
152c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
152d0 20 20 7d 65 6c 73 65 20 69 66 28 20 64 65 73 69    }else if( desi
152e0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64  redAutoCommit!=d
152f0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
15300 0a 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61  .    if( iRollba
15310 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ck ){.      asse
15320 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
15330 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20  ommit==1 );.    
15340 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
15350 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
15360 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15370 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
15380 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
15390 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69 72 65  mit = (u8)desire
153a0 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20  dAutoCommit;.   
153b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
153c0 62 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54  beHalt(p)==SQLIT
153d0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
153e0 20 20 70 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20    p->pc = pc;.  
153f0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
15400 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65  mmit = (u8)(1-de
15410 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29  siredAutoCommit)
15420 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  ;.        p->rc 
15430 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  = rc = SQLITE_BU
15440 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
15450 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
15460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15470 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
15480 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20  tement==0 );.   
15490 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
154a0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
154b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
154c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
154d0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
154e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
154f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15500 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  ROR;.    }.    g
15510 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
15520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
15530 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
15540 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a  p->zErrMsg, db,.
15550 20 20 20 20 20 20 20 20 28 21 64 65 73 69 72 65          (!desire
15560 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61  dAutoCommit)?"ca
15570 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61  nnot start a tra
15580 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nsaction within 
15590 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28  a transaction":(
155a0 0a 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62  .        (iRollb
155b0 61 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c  ack)?"cannot rol
155c0 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73  lback - no trans
155d0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
155e0 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
155f0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f        "cannot co
15600 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61  mmit - no transa
15610 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22  ction is active"
15620 29 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20  ));.         .  
15630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15640 52 4f 52 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  ROR;.  }.  break
15650 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
15660 54 72 61 6e 73 61 63 74 69 6f 6e 20 50 31 20 50  Transaction P1 P
15670 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65  2 * * *.**.** Be
15680 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
15690 6e 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63 74  n.  The transact
156a0 69 6f 6e 20 65 6e 64 73 20 77 68 65 6e 20 61 20  ion ends when a 
156b0 43 6f 6d 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61  Commit or Rollba
156c0 63 6b 0a 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20  ck.** opcode is 
156d0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 20 44 65  encountered.  De
156e0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f  pending on the O
156f0 4e 20 43 4f 4e 46 4c 49 43 54 20 73 65 74 74 69  N CONFLICT setti
15700 6e 67 2c 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ng, the.** trans
15710 61 63 74 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73  action might als
15720 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
15730 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
15740 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
15750 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64  ** P1 is the ind
15760 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
15770 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68  se file on which
15780 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15790 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20   is.** started. 
157a0 20 49 6e 64 65 78 20 30 20 69 73 20 74 68 65 20   Index 0 is the 
157b0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
157c0 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69  le and index 1 i
157d0 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73  s the.** file us
157e0 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
157f0 20 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65   tables.  Indice
15800 73 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61  s of 2 or more a
15810 72 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61  re used for.** a
15820 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
15830 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69  s..**.** If P2 i
15840 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
15850 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
15860 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2e  tion is started.
15870 20 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63    A RESERVED loc
15880 6b 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  k is.** obtained
15890 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
158a0 20 66 69 6c 65 20 77 68 65 6e 20 61 20 77 72 69   file when a wri
158b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
158c0 73 20 73 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a  s started.  No.*
158d0 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
158e0 63 61 6e 20 73 74 61 72 74 20 61 6e 6f 74 68 65  can start anothe
158f0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
15900 69 6f 6e 20 77 68 69 6c 65 20 74 68 69 73 20 74  ion while this t
15910 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
15920 20 75 6e 64 65 72 77 61 79 2e 20 20 53 74 61 72   underway.  Star
15930 74 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ting a write tra
15940 6e 73 61 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72  nsaction also cr
15950 65 61 74 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  eates a rollback
15960 20 6a 6f 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77   journal. A.** w
15970 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
15980 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
15990 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
159a0 67 65 73 20 63 61 6e 20 62 65 20 6d 61 64 65 20  ges can be made 
159b0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
159c0 73 65 2e 20 20 49 66 20 50 32 20 69 73 20 32 20  se.  If P2 is 2 
159d0 6f 72 20 67 72 65 61 74 65 72 20 74 68 65 6e 20  or greater then 
159e0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
159f0 6b 20 69 73 20 61 6c 73 6f 20 6f 62 74 61 69 6e  k is also obtain
15a00 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c  ed.** on the fil
15a10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69  e..**.** If P2 i
15a20 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 72  s zero, then a r
15a30 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
15a40 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ined on the data
15a50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 61  base file..*/.ca
15a60 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
15a70 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n: {.  int i;.  
15a80 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 69  Btree *pBt;..  i
15a90 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73   = pOp->p1;.  as
15aa0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
15ab0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
15ac0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
15ad0 73 6b 20 26 20 28 31 3c 3c 69 29 29 21 3d 30 20  sk & (1<<i))!=0 
15ae0 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61  );.  pBt = db->a
15af0 44 62 5b 69 5d 2e 70 42 74 3b 0a 0a 20 20 69 66  Db[i].pBt;..  if
15b00 28 20 70 42 74 20 29 7b 0a 20 20 20 20 72 63 20  ( pBt ){.    rc 
15b10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
15b20 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 70 4f  ginTrans(pBt, pO
15b30 70 2d 3e 70 32 29 3b 0a 20 20 20 20 69 66 28 20  p->p2);.    if( 
15b40 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
15b50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d  ){.      p->pc =
15b60 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63   pc;.      p->rc
15b70 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
15b80 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  USY;.      goto 
15b90 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
15ba0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
15bb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
15bc0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
15bd0 2f 2a 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  /* && rc!=SQLITE
15be0 5f 42 55 53 59 20 2a 2f 20 29 7b 0a 20 20 20 20  _BUSY */ ){.    
15bf0 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
15c00 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
15c10 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
15c20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 64  ./* Opcode: Read
15c30 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20  Cookie P1 P2 P3 
15c40 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63  * *.**.** Read c
15c50 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50 33 20  ookie number P3 
15c60 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 50 31  from database P1
15c70 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e   and write it in
15c80 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
15c90 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68 65 20  ** P3==1 is the 
15ca0 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20  schema version. 
15cb0 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20 64 61   P3==2 is the da
15cc0 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a  tabase format..*
15cd0 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65 20 72  * P3==3 is the r
15ce0 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72  ecommended pager
15cf0 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61 6e 64   cache size, and
15d00 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d   so forth.  P1==
15d10 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69 6e  0 is.** the main
15d20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
15d30 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20  nd P1==1 is the 
15d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
15d50 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
15d60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15d70 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
15d80 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  t be a read-lock
15d90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15da0 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e 73   (either a trans
15db0 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62  action.** must b
15dc0 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68 65  e started or the
15dd0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
15de0 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f 72  en cursor) befor
15df0 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74  e.** executing t
15e00 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  his instruction.
15e10 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 64  .*/.case OP_Read
15e20 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20  Cookie: {       
15e30 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
15e40 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
15e50 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e 74  int iMeta;.  int
15e60 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f 6f   iDb;.  int iCoo
15e70 6b 69 65 3b 0a 0a 20 20 69 44 62 20 3d 20 70 4f  kie;..  iDb = pO
15e80 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69 65  p->p1;.  iCookie
15e90 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
15ea0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53 51  sert( pOp->p3<SQ
15eb0 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
15ec0 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  A );.  assert( i
15ed0 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
15ee0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
15ef0 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
15f00 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
15f10 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
15f20 20 26 20 28 31 3c 3c 69 44 62 29 29 21 3d 30 20   & (1<<iDb))!=0 
15f30 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
15f40 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 64  e3BtreeGetMeta(d
15f50 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c  b->aDb[iDb].pBt,
15f60 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a   iCookie, (u32 *
15f70 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74  )&iMeta);.  pOut
15f80 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20  ->u.i = iMeta;. 
15f90 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
15fa0 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
15fb0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
15fc0 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65  pcode: SetCookie
15fd0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
15fe0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f  .** Write the co
15ff0 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
16000 72 20 50 33 20 28 69 6e 74 65 72 70 72 65 74 65  r P3 (interprete
16010 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29  d as an integer)
16020 0a 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20  .** into cookie 
16030 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
16040 61 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31  abase P1.  P2==1
16050 20 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76   is the schema v
16060 65 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d  ersion.  .** P2=
16070 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
16080 73 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33  se format. P2==3
16090 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e   is the recommen
160a0 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65 20  ded pager cache 
160b0 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f  .** size, and so
160c0 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69   forth.  P1==0 i
160d0 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
160e0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
160f0 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61  =1 is the .** da
16100 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
16110 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72   to store tempor
16120 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ary tables..**.*
16130 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
16140 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
16150 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67  before executing
16160 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f   this opcode..*/
16170 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b  .case OP_SetCook
16180 69 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69  ie: {       /* i
16190 6e 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  n3 */.  Db *pDb;
161a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
161b0 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  p2<SQLITE_N_BTRE
161c0 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65  E_META );.  asse
161d0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
161e0 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
161f0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  b );.  assert( (
16200 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
16210 31 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20  1<<pOp->p1))!=0 
16220 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
16230 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  aDb[pOp->p1];.  
16240 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74  assert( pDb->pBt
16250 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
16260 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
16270 79 28 70 49 6e 33 29 3b 0a 20 20 2f 2a 20 53 65  y(pIn3);.  /* Se
16280 65 20 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64  e note about ind
16290 65 78 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f  ex shifting on O
162a0 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a  P_ReadCookie */.
162b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
162c0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 44  reeUpdateMeta(pD
162d0 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c  b->pBt, pOp->p2,
162e0 20 28 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 29   (int)pIn3->u.i)
162f0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d  ;.  if( pOp->p2=
16300 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45  =BTREE_SCHEMA_VE
16310 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f 2a 20  RSION ){.    /* 
16320 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  When the schema 
16330 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 2c 20  cookie changes, 
16340 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 63  record the new c
16350 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ookie internally
16360 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63   */.    pDb->pSc
16370 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
16380 6b 69 65 20 3d 20 28 69 6e 74 29 70 49 6e 33 2d  kie = (int)pIn3-
16390 3e 75 2e 69 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  >u.i;.    db->fl
163a0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
163b0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
163c0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 32  else if( pOp->p2
163d0 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  ==BTREE_FILE_FOR
163e0 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  MAT ){.    /* Re
163f0 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e 20  cord changes in 
16400 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
16410 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  */.    pDb->pSch
16420 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
16430 20 3d 20 28 75 38 29 70 49 6e 33 2d 3e 75 2e 69   = (u8)pIn3->u.i
16440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
16450 3e 70 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  >p1==1 ){.    /*
16460 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
16470 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16480 6e 74 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  nts whenever the
16490 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 0a 20   TEMP database. 
164a0 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20     ** schema is 
164b0 63 68 61 6e 67 65 64 2e 20 20 54 69 63 6b 65 74  changed.  Ticket
164c0 20 23 31 36 34 34 20 2a 2f 0a 20 20 20 20 73 71   #1644 */.    sq
164d0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
164e0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
164f0 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
16500 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 65  }../* Opcode: Ve
16510 72 69 66 79 43 6f 6f 6b 69 65 20 50 31 20 50 32  rifyCookie P1 P2
16520 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74   *.**.** Check t
16530 68 65 20 76 61 6c 75 65 20 6f 66 20 67 6c 6f 62  he value of glob
16540 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 72 61  al database para
16550 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 30 20 28  meter number 0 (
16560 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 76 65  the.** schema ve
16570 72 73 69 6f 6e 29 20 61 6e 64 20 6d 61 6b 65 20  rsion) and make 
16580 73 75 72 65 20 69 74 20 69 73 20 65 71 75 61 6c  sure it is equal
16590 20 74 6f 20 50 32 2e 20 20 0a 2a 2a 20 50 31 20   to P2.  .** P1 
165a0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
165b0 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
165c0 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  0 for the main d
165d0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
165e0 61 6e 64 20 31 20 66 6f 72 20 74 68 65 20 66 69  and 1 for the fi
165f0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f  le holding tempo
16600 72 61 72 79 20 74 61 62 6c 65 73 20 61 6e 64 20  rary tables and 
16610 73 6f 6d 65 20 68 69 67 68 65 72 20 6e 75 6d 62  some higher numb
16620 65 72 0a 2a 2a 20 66 6f 72 20 61 75 78 69 6c 69  er.** for auxili
16630 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
16640 2a 0a 2a 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20  *.** The cookie 
16650 63 68 61 6e 67 65 73 20 69 74 73 20 76 61 6c 75  changes its valu
16660 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64  e whenever the d
16670 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63  atabase schema c
16680 68 61 6e 67 65 73 2e 0a 2a 2a 20 54 68 69 73 20  hanges..** This 
16690 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 75 73 65  operation is use
166a0 64 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e  d to detect when
166b0 20 74 68 61 74 20 74 68 65 20 63 6f 6f 6b 69 65   that the cookie
166c0 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20   has changed.** 
166d0 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 75 72  and that the cur
166e0 72 65 6e 74 20 70 72 6f 63 65 73 73 20 6e 65 65  rent process nee
166f0 64 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  ds to reread the
16700 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 45   schema..**.** E
16710 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74  ither a transact
16720 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 68 61 76  ion needs to hav
16730 65 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 6f  e been started o
16740 72 20 61 6e 20 4f 50 5f 4f 70 65 6e 20 6e 65 65  r an OP_Open nee
16750 64 73 0a 2a 2a 20 74 6f 20 62 65 20 65 78 65 63  ds.** to be exec
16760 75 74 65 64 20 28 74 6f 20 65 73 74 61 62 6c 69  uted (to establi
16770 73 68 20 61 20 72 65 61 64 20 6c 6f 63 6b 29 20  sh a read lock) 
16780 62 65 66 6f 72 65 20 74 68 69 73 20 6f 70 63 6f  before this opco
16790 64 65 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  de is.** invoked
167a0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 65 72  ..*/.case OP_Ver
167b0 69 66 79 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20 69  ifyCookie: {.  i
167c0 6e 74 20 69 4d 65 74 61 3b 0a 20 20 42 74 72 65  nt iMeta;.  Btre
167d0 65 20 2a 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e *pBt;.  assert
167e0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
167f0 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
16800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
16810 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
16820 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b  <pOp->p1))!=0 );
16830 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
16840 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
16850 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
16860 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16870 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42 54  eGetMeta(pBt, BT
16880 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
16890 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74  ON, (u32 *)&iMet
168a0 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
168b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
168c0 0a 20 20 20 20 69 4d 65 74 61 20 3d 20 30 3b 0a  .    iMeta = 0;.
168d0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
168e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4d 65 74 61  LITE_OK && iMeta
168f0 21 3d 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20  !=pOp->p2 ){.   
16900 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16910 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
16920 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
16930 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
16940 28 64 62 2c 20 22 64 61 74 61 62 61 73 65 20 73  (db, "database s
16950 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
16960 64 22 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d");.    /* If t
16970 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  he schema-cookie
16980 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16990 73 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73 20  se file matches 
169a0 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20 20  the cookie .    
169b0 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68 20 74  ** stored with t
169c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
169d0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
169e0 68 65 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20 20  he schema, do.  
169f0 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64 20    ** not reload 
16a00 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20  the schema from 
16a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16a20 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
16a30 20 49 66 20 76 69 72 74 75 61 6c 2d 74 61 62 6c   If virtual-tabl
16a40 65 73 20 61 72 65 20 69 6e 20 75 73 65 2c 20 74  es are in use, t
16a50 68 69 73 20 69 73 20 6e 6f 74 20 6a 75 73 74 20  his is not just 
16a60 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
16a70 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 76  .    ** Often, v
16a80 2d 74 61 62 6c 65 73 20 73 74 6f 72 65 20 74 68  -tables store th
16a90 65 69 72 20 64 61 74 61 20 69 6e 20 6f 74 68 65  eir data in othe
16aa0 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c  r SQLite tables,
16ab0 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 61 72   which.    ** ar
16ac0 65 20 71 75 65 72 69 65 64 20 66 72 6f 6d 20 77  e queried from w
16ad0 69 74 68 69 6e 20 78 4e 65 78 74 28 29 20 61 6e  ithin xNext() an
16ae0 64 20 6f 74 68 65 72 20 76 2d 74 61 62 6c 65 20  d other v-table 
16af0 6d 65 74 68 6f 64 73 20 75 73 69 6e 67 0a 20 20  methods using.  
16b00 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20 71 75    ** prepared qu
16b10 65 72 69 65 73 2e 20 49 66 20 73 75 63 68 20 61  eries. If such a
16b20 20 71 75 65 72 79 20 69 73 20 6f 75 74 2d 6f 66   query is out-of
16b30 2d 64 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f 74  -date, we do not
16b40 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 20   want to.    ** 
16b50 64 69 73 63 61 72 64 20 74 68 65 20 64 61 74 61  discard the data
16b60 62 61 73 65 20 73 63 68 65 6d 61 2c 20 61 73 20  base schema, as 
16b70 74 68 65 20 75 73 65 72 20 63 6f 64 65 20 69 6d  the user code im
16b80 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a 20  plementing the. 
16b90 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77 6f     ** v-table wo
16ba0 75 6c 64 20 68 61 76 65 20 74 6f 20 62 65 20 72  uld have to be r
16bb0 65 61 64 79 20 66 6f 72 20 74 68 65 20 73 71 6c  eady for the sql
16bc0 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
16bd0 75 72 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ure itself.    *
16be0 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  * to be invalida
16bf0 74 65 64 20 77 68 65 6e 65 76 65 72 20 73 71 6c  ted whenever sql
16c00 69 74 65 33 5f 73 74 65 70 28 29 20 69 73 20 63  ite3_step() is c
16c10 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
16c20 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74 61  n .    ** a v-ta
16c30 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20  ble method..    
16c40 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
16c50 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68  Db[pOp->p1].pSch
16c60 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
16c70 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20 20  ie!=iMeta ){.   
16c80 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
16c90 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
16ca0 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
16cb0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  }..    sqlite3Ex
16cc0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
16cd0 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
16ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
16cf0 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  MA;.  }.  break;
16d00 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
16d10 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50 33  penRead P1 P2 P3
16d20 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65   P4 P5.**.** Ope
16d30 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
16d40 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
16d50 61 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73  abase table whos
16d60 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a  e root page is.*
16d70 2a 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61  * P2 in a databa
16d80 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61  se file.  The da
16d90 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64  tabase file is d
16da0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e  etermined by P3.
16db0 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73   .** P3==0 means
16dc0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
16dd0 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20  se, P3==1 means 
16de0 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
16df0 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72  d for .** tempor
16e00 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20  ary tables, and 
16e10 50 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20  P3>1 means used 
16e20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16e30 67 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61  g attached.** da
16e40 74 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68  tabase.  Give th
16e50 65 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20  e new cursor an 
16e60 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31  identifier of P1
16e70 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c  .  The P1.** val
16e80 75 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  ues need not be 
16e90 63 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61  contiguous but a
16ea0 6c 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f  ll P1 values sho
16eb0 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74  uld be small int
16ec0 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20  egers..** It is 
16ed0 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20  an error for P1 
16ee0 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a  to be negative..
16ef0 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74  **.** If P5!=0 t
16f00 68 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74  hen use the cont
16f10 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
16f20 50 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70  P2 as the root p
16f30 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  age, not.** the 
16f40 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65  value of P2 itse
16f50 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  lf..**.** There 
16f60 77 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c  will be a read l
16f70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16f80 61 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ase whenever the
16f90 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e  re is an.** open
16fa0 20 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65   cursor.  If the
16fb0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e   database was un
16fc0 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  locked prior to 
16fd0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
16fe0 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20  .** then a read 
16ff0 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64  lock is acquired
17000 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
17010 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41   instruction.  A
17020 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c   read.** lock al
17030 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65  lows other proce
17040 73 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65  sses to read the
17050 20 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72   database but pr
17060 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f  ohibits.** any o
17070 74 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f  ther process fro
17080 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  m modifying the 
17090 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
170a0 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72  ead lock is.** r
170b0 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c  eleased when all
170c0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f   cursors are clo
170d0 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e  sed.  If this in
170e0 73 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70  struction attemp
170f0 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72  ts.** to get a r
17100 65 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69  ead lock but fai
17110 6c 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74  ls, the script t
17120 65 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61  erminates with a
17130 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  n.** SQLITE_BUSY
17140 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
17150 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20  ** The P4 value 
17160 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e  may be either an
17170 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54   integer (P4_INT
17180 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  32) or a pointer
17190 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f   to.** a KeyInfo
171a0 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b   structure (P4_K
171b0 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69  EYINFO). If it i
171c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
171d0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
171e0 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69  ucture, then sai
171f0 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  d structure defi
17200 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nes the content 
17210 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a  and collating .*
17220 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  * sequence of th
17230 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70  e index being op
17240 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
17250 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74   if P4 is an int
17260 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20  eger .** value, 
17270 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  it is set to the
17280 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
17290 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ns in the table.
172a0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
172b0 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a 2f 2a  OpenWrite..*/./*
172c0 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69   Opcode: OpenWri
172d0 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
172e0 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  5.**.** Open a r
172f0 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
17300 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68 65   named P1 on the
17310 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17320 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  whose root.** pa
17330 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69 66  ge is P2.  Or if
17340 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20 63   P5!=0 use the c
17350 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
17360 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74 68  er P2 to find th
17370 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a  e.** root page..
17380 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
17390 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  ue may be either
173a0 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f   an integer (P4_
173b0 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e  INT32) or a poin
173c0 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49  ter to.** a KeyI
173d0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28 50  nfo structure (P
173e0 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69  4_KEYINFO). If i
173f0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
17400 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  o a KeyInfo .** 
17410 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20  structure, then 
17420 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20 64  said structure d
17430 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65  efines the conte
17440 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  nt and collating
17450 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66   .** sequence of
17460 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
17470 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
17480 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20  se, if P4 is an 
17490 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75  integer .** valu
174a0 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  e, it is set to 
174b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
174c0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
174d0 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a 2a  le, or to the.**
174e0 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20 6f   largest index o
174f0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  f any column of 
17500 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
17510 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 2e  s actually used.
17520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
17530 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75  ruction works ju
17540 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64  st like OpenRead
17550 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
17560 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
17570 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74  .** in read/writ
17580 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20 67  e mode.  For a g
17590 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65 72  iven table, ther
175a0 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20  e can be one or 
175b0 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  more read-only.*
175c0 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20 73  * cursors or a s
175d0 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74 65  ingle read/write
175e0 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74 20   cursor but not 
175f0 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  both..**.** See 
17600 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a  also OpenRead..*
17610 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65  /.case OP_OpenRe
17620 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  ad:.case OP_Open
17630 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20 6e  Write: {.  int n
17640 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f  Field;.  KeyInfo
17650 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
17660 74 20 69 3b 0a 20 20 69 6e 74 20 70 32 3b 0a 20  t i;.  int p2;. 
17670 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20   int iDb;.  int 
17680 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65 20  wrFlag;.  Btree 
17690 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  *pX;.  VdbeCurso
176a0 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a 70  r *pCur;.  Db *p
176b0 44 62 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b  Db;.  int flags;
176c0 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  ..  nField = 0;.
176d0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a    pKeyInfo = 0;.
176e0 20 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20    i = pOp->p1;. 
176f0 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20   p2 = pOp->p2;. 
17700 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   iDb = pOp->p3;.
17710 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
17720 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
17730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
17740 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
17750 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20 70  <iDb))!=0 );.  p
17760 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
17770 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44 62 2d 3e  b];.  pX = pDb->
17780 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
17790 58 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  X!=0 );.  if( pO
177a0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  p->opcode==OP_Op
177b0 65 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20 77  enWrite ){.    w
177c0 72 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 69  rFlag = 1;.    i
177d0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
177e0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c 20 70  >file_format < p
177f0 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
17800 72 6d 61 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  rmat ){.      p-
17810 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
17820 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53 63 68 65  mat = pDb->pSche
17830 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3b  ma->file_format;
17840 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
17850 20 20 20 20 77 72 46 6c 61 67 20 3d 20 30 3b 0a      wrFlag = 0;.
17860 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70    }.  if( pOp->p
17870 35 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  5 ){.    assert(
17880 20 70 32 3e 30 20 29 3b 0a 20 20 20 20 61 73 73   p2>0 );.    ass
17890 65 72 74 28 20 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  ert( p2<=p->nMem
178a0 20 29 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20 26   );.    pIn2 = &
178b0 70 2d 3e 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20  p->aMem[p2];.   
178c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
178d0 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b  ntegerify(pIn2);
178e0 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29 70  .    p2 = (int)p
178f0 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 66  In2->u.i;.    if
17900 28 20 70 32 3c 32 20 29 20 7b 0a 20 20 20 20 20  ( p2<2 ) {.     
17910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
17920 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
17930 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
17940 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
17950 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3e    }.  assert( i>
17960 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  =0 );.  if( pOp-
17970 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49  >p4type==P4_KEYI
17980 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49  NFO ){.    pKeyI
17990 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
179a0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
179b0 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
179c0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 6e 46 69 65  p->db);.    nFie
179d0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
179e0 46 69 65 6c 64 2b 31 3b 0a 20 20 7d 65 6c 73 65  Field+1;.  }else
179f0 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
17a00 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
17a10 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
17a20 70 34 2e 69 3b 0a 20 20 7d 0a 20 20 70 43 75 72  p4.i;.  }.  pCur
17a30 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
17a40 72 28 70 2c 20 69 2c 20 6e 46 69 65 6c 64 2c 20  r(p, i, nField, 
17a50 69 44 62 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  iDb, 1);.  if( p
17a60 43 75 72 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  Cur==0 ) goto no
17a70 5f 6d 65 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75  _mem;.  pCur->nu
17a80 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 63 20  llRow = 1;.  rc 
17a90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
17aa0 72 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46  rsor(pX, p2, wrF
17ab0 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
17ac0 43 75 72 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  Cur->pCursor);. 
17ad0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
17ae0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 73  = pKeyInfo;..  s
17af0 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
17b00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
17b10 59 3a 20 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63  Y: {.      p->pc
17b20 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e   = pc;.      p->
17b30 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45  rc = rc = SQLITE
17b40 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74  _BUSY;.      got
17b50 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
17b60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
17b70 4c 49 54 45 5f 4f 4b 3a 20 7b 0a 20 20 20 20 20  LITE_OK: {.     
17b80 20 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33   flags = sqlite3
17b90 42 74 72 65 65 46 6c 61 67 73 28 70 43 75 72 2d  BtreeFlags(pCur-
17ba0 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >pCursor);.     
17bb0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
17bc0 69 6e 67 2e 20 20 4f 6e 6c 79 20 74 68 65 20 6c  ing.  Only the l
17bd0 6f 77 65 72 20 66 6f 75 72 20 62 69 74 73 20 6f  ower four bits o
17be0 66 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  f the flags byte
17bf0 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 2a 2a   should.      **
17c00 20 62 65 20 75 73 65 64 2e 20 20 42 69 74 20 33   be used.  Bit 3
17c10 20 28 6d 61 73 6b 20 30 78 30 38 29 20 69 73 20   (mask 0x08) is 
17c20 75 6e 70 72 65 64 69 63 74 61 62 6c 65 2e 20 20  unpredictable.  
17c30 54 68 65 20 6c 6f 77 65 72 20 33 20 62 69 74 73  The lower 3 bits
17c40 0a 20 20 20 20 20 20 2a 2a 20 28 6d 61 73 6b 20  .      ** (mask 
17c50 30 78 30 37 29 20 73 68 6f 75 6c 64 20 62 65 20  0x07) should be 
17c60 65 69 74 68 65 72 20 35 20 28 69 6e 74 6b 65 79  either 5 (intkey
17c70 2b 6c 65 61 66 64 61 74 61 20 66 6f 72 20 74 61  +leafdata for ta
17c80 62 6c 65 73 29 20 6f 72 0a 20 20 20 20 20 20 2a  bles) or.      *
17c90 2a 20 32 20 28 7a 65 72 6f 64 61 74 61 20 66 6f  * 2 (zerodata fo
17ca0 72 20 69 6e 64 69 63 65 73 29 2e 20 20 49 66 20  r indices).  If 
17cb0 74 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  these conditions
17cc0 20 61 72 65 20 6e 6f 74 20 6d 65 74 20 69 74 20   are not met it 
17cd0 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 6c  can.      ** onl
17ce0 79 20 6d 65 61 6e 20 74 68 61 74 20 77 65 20 61  y mean that we a
17cf0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
17d00 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
17d10 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2f  se file.      */
17d20 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67  .      if( (flag
17d30 73 20 26 20 30 78 66 30 29 21 3d 30 20 7c 7c 20  s & 0xf0)!=0 || 
17d40 28 28 66 6c 61 67 73 20 26 20 30 78 30 37 29 21  ((flags & 0x07)!
17d50 3d 35 20 26 26 20 28 66 6c 61 67 73 20 26 20 30  =5 && (flags & 0
17d60 78 30 37 29 21 3d 32 29 20 29 7b 0a 20 20 20 20  x07)!=2) ){.    
17d70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17d80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17d90 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
17da0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
17db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
17dc0 72 2d 3e 69 73 54 61 62 6c 65 20 3d 20 28 66 6c  r->isTable = (fl
17dd0 61 67 73 20 26 20 42 54 52 45 45 5f 49 4e 54 4b  ags & BTREE_INTK
17de0 45 59 29 21 3d 30 20 3f 31 3a 30 3b 0a 20 20 20  EY)!=0 ?1:0;.   
17df0 20 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78     pCur->isIndex
17e00 20 3d 20 28 66 6c 61 67 73 20 26 20 42 54 52 45   = (flags & BTRE
17e10 45 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 20 3f  E_ZERODATA)!=0 ?
17e20 31 3a 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1:0;.      /* If
17e30 20 50 34 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20   P4==0 it means 
17e40 77 65 20 61 72 65 20 65 78 70 65 63 74 65 64 20  we are expected 
17e50 74 6f 20 6f 70 65 6e 20 61 20 74 61 62 6c 65 2e  to open a table.
17e60 20 20 49 66 20 50 34 21 3d 30 20 74 68 65 6e 0a    If P4!=0 then.
17e70 20 20 20 20 20 20 2a 2a 20 77 65 20 65 78 70 65        ** we expe
17e80 63 74 20 74 6f 20 62 65 20 6f 70 65 6e 69 6e 67  ct to be opening
17e90 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 74   an index.  If t
17ea0 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61 74 20  his is not what 
17eb0 68 61 70 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  happened,.      
17ec0 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  ** then the data
17ed0 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 0a  base is corrupt.
17ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17ef0 66 28 20 28 70 43 75 72 2d 3e 69 73 54 61 62 6c  f( (pCur->isTabl
17f00 65 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65  e && pOp->p4type
17f10 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 29 0a 20 20  ==P4_KEYINFO).  
17f20 20 20 20 20 20 7c 7c 20 28 70 43 75 72 2d 3e 69       || (pCur->i
17f30 73 49 6e 64 65 78 20 26 26 20 70 4f 70 2d 3e 70  sIndex && pOp->p
17f40 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46  4type!=P4_KEYINF
17f50 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  O) ){.        rc
17f60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
17f70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
17f80 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
17f90 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
17fa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17fb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
17fc0 49 54 45 5f 45 4d 50 54 59 3a 20 7b 0a 20 20 20  ITE_EMPTY: {.   
17fd0 20 20 20 70 43 75 72 2d 3e 69 73 54 61 62 6c 65     pCur->isTable
17fe0 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65 21 3d   = pOp->p4type!=
17ff0 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20  P4_KEYINFO;.    
18000 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78 20    pCur->isIndex 
18010 3d 20 21 70 43 75 72 2d 3e 69 73 54 61 62 6c 65  = !pCur->isTable
18020 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 43  ;.      pCur->pC
18030 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  ursor = 0;.     
18040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18060 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
18070 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62   {.      goto ab
18080 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
18090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
180a0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
180b0 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  e: OpenEphemeral
180c0 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
180d0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
180e0 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 74 72  ursor P1 to a tr
180f0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a 2a  ansient table..*
18100 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  * The cursor is 
18110 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20 72 65  always opened re
18120 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20 69 66  ad/write even if
18130 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61   .** the main da
18140 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f  tabase is read-o
18150 6e 6c 79 2e 20 20 54 68 65 20 74 72 61 6e 73 69  nly.  The transi
18160 65 6e 74 20 6f 72 20 76 69 72 74 75 61 6c 0a 2a  ent or virtual.*
18170 2a 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65 74  * table is delet
18180 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
18190 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   when the cursor
181a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
181b0 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62  * P2 is the numb
181c0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
181d0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
181e0 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  le..** The curso
181f0 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54  r points to a BT
18200 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d  ree table if P4=
18210 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65  =0 and to a BTre
18220 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34  e index.** if P4
18230 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50   is not 0.  If P
18240 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  4 is not NULL, i
18250 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  t points to a Ke
18260 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
18270 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  ** that defines 
18280 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65  the format of ke
18290 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ys in the index.
182a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
182b0 64 65 20 77 61 73 20 6f 6e 63 65 20 63 61 6c 6c  de was once call
182c0 65 64 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42 75  ed OpenTemp.  Bu
182d0 74 20 74 68 61 74 20 63 72 65 61 74 65 64 0a 2a  t that created.*
182e0 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63 61  * confusion beca
182f0 75 73 65 20 74 68 65 20 74 65 72 6d 20 22 74 65  use the term "te
18300 6d 70 20 74 61 62 6c 65 22 2c 20 6d 69 67 68 74  mp table", might
18310 20 72 65 66 65 72 20 65 69 74 68 65 72 0a 2a 2a   refer either.**
18320 20 74 6f 20 61 20 54 45 4d 50 20 74 61 62 6c 65   to a TEMP table
18330 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76 65   at the SQL leve
18340 6c 2c 20 6f 72 20 74 6f 20 61 20 74 61 62 6c 65  l, or to a table
18350 20 6f 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74 68   opened by.** th
18360 69 73 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 6e  is opcode.  Then
18370 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 61 73   this opcode was
18380 20 63 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75 61   call OpenVirtua
18390 6c 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20  l.  But.** that 
183a0 63 72 65 61 74 65 64 20 63 6f 6e 66 75 73 69 6f  created confusio
183b0 6e 20 77 69 74 68 20 74 68 65 20 77 68 6f 6c 65  n with the whole
183c0 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 69   virtual-table i
183d0 64 65 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  dea..*/.case OP_
183e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b  OpenEphemeral: {
183f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
18400 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 73  Cursor *pCx;.  s
18410 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
18420 6f 70 65 6e 46 6c 61 67 73 20 3d 20 0a 20 20 20  openFlags = .   
18430 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
18440 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20  EADWRITE |.     
18450 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18460 41 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49  ATE |.      SQLI
18470 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
18480 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
18490 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
184a0 4f 53 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49  OSE |.      SQLI
184b0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
184c0 54 5f 44 42 3b 0a 0a 20 20 69 20 3d 20 70 4f 70  T_DB;..  i = pOp
184d0 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p1;.  assert( 
184e0 69 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20  i>=0 );.  pCx = 
184f0 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
18500 2c 20 69 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31  , i, pOp->p2, -1
18510 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  , 1);.  if( pCx=
18520 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
18530 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77  ;.  pCx->nullRow
18540 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
18550 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
18560 28 64 62 2c 20 30 2c 20 31 2c 20 53 51 4c 49 54  (db, 0, 1, SQLIT
18570 45 5f 44 45 46 41 55 4c 54 5f 54 45 4d 50 5f 43  E_DEFAULT_TEMP_C
18580 41 43 48 45 5f 53 49 5a 45 2c 20 6f 70 65 6e 46  ACHE_SIZE, openF
18590 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 26 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 69   &pCx->pBt);.  i
185c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
185d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
185e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
185f0 61 6e 73 28 70 43 78 2d 3e 70 42 74 2c 20 31 29  ans(pCx->pBt, 1)
18600 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
18610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18620 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65   /* If a transie
18630 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65 71 75  nt index is requ
18640 69 72 65 64 2c 20 63 72 65 61 74 65 20 69 74 20  ired, create it 
18650 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a  by calling.    *
18660 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  * sqlite3BtreeCr
18670 65 61 74 65 54 61 62 6c 65 28 29 20 77 69 74 68  eateTable() with
18680 20 74 68 65 20 42 54 52 45 45 5f 5a 45 52 4f 44   the BTREE_ZEROD
18690 41 54 41 20 66 6c 61 67 20 62 65 66 6f 72 65 0a  ATA flag before.
186a0 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69      ** opening i
186b0 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e  t. If a transien
186c0 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69  t table is requi
186d0 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68  red, just use th
186e0 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  e.    ** automat
186f0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74  ically created t
18700 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
18710 61 67 65 20 31 20 28 61 6e 20 49 4e 54 4b 45 59  age 1 (an INTKEY
18720 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a   table)..    */.
18730 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 2e      if( pOp->p4.
18740 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
18750 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
18760 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
18770 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
18780 4f 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  O );.      rc = 
18790 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
187a0 74 65 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74  teTable(pCx->pBt
187b0 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45 5f 5a  , &pgno, BTREE_Z
187c0 45 52 4f 44 41 54 41 29 3b 20 0a 20 20 20 20 20  ERODATA); .     
187d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
187e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
187f0 73 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54  sert( pgno==MAST
18800 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20  ER_ROOT+1 );.   
18810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18820 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43 78  3BtreeCursor(pCx
18830 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 31 2c 20  ->pBt, pgno, 1, 
18840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e   (KeyInfo*)pOp->
18870 70 34 2e 7a 2c 20 70 43 78 2d 3e 70 43 75 72 73  p4.z, pCx->pCurs
18880 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 70 43 78  or);.        pCx
18890 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70  ->pKeyInfo = pOp
188a0 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
188b0 20 20 20 20 20 20 20 70 43 78 2d 3e 70 4b 65 79         pCx->pKey
188c0 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
188d0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  p->db);.      }.
188e0 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62        pCx->isTab
188f0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  le = 0;.    }els
18900 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
18910 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
18920 28 70 43 78 2d 3e 70 42 74 2c 20 4d 41 53 54 45  (pCx->pBt, MASTE
18930 52 5f 52 4f 4f 54 2c 20 31 2c 20 30 2c 20 70 43  R_ROOT, 1, 0, pC
18940 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  x->pCursor);.   
18950 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20     pCx->isTable 
18960 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
18970 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20   pCx->isIndex = 
18980 21 70 43 78 2d 3e 69 73 54 61 62 6c 65 3b 0a 20  !pCx->isTable;. 
18990 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
189a0 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f  code: OpenPseudo
189b0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
189c0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
189d0 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  ursor that point
189e0 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c  s to a fake tabl
189f0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
18a00 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20  a single.** row 
18a10 6f 66 20 64 61 74 61 2e 20 20 41 6e 79 20 61 74  of data.  Any at
18a20 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
18a30 20 73 65 63 6f 6e 64 20 72 6f 77 20 6f 66 20 64   second row of d
18a40 61 74 61 20 63 61 75 73 65 73 20 74 68 65 0a 2a  ata causes the.*
18a50 2a 20 66 69 72 73 74 20 72 6f 77 20 74 6f 20 62  * first row to b
18a60 65 20 64 65 6c 65 74 65 64 2e 20 20 41 6c 6c 20  e deleted.  All 
18a70 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
18a80 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
18a90 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2a  is.** closed..**
18aa0 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62  .** A pseudo-tab
18ab0 6c 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  le created by th
18ac0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
18ad0 66 75 6c 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ful for holding 
18ae0 74 68 65 0a 2a 2a 20 4e 45 57 20 6f 72 20 4f 4c  the.** NEW or OL
18af0 44 20 74 61 62 6c 65 73 20 69 6e 20 61 20 74 72  D tables in a tr
18b00 69 67 67 65 72 2e 20 20 41 6c 73 6f 20 75 73 65  igger.  Also use
18b10 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 20  d to hold the a 
18b20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75  single.** row ou
18b30 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f  tput from the so
18b40 72 74 65 72 20 73 6f 20 74 68 61 74 20 74 68 65  rter so that the
18b50 20 72 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f   row can be deco
18b60 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69  mposed into.** i
18b70 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e  ndividual column
18b80 73 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43  s using the OP_C
18b90 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  olumn opcode..**
18ba0 0a 2a 2a 20 57 68 65 6e 20 4f 50 5f 49 6e 73 65  .** When OP_Inse
18bb0 72 74 20 69 73 20 65 78 65 63 75 74 65 64 20 74  rt is executed t
18bc0 6f 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20 69  o insert a row i
18bd0 6e 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f 20  n to the pseudo 
18be0 74 61 62 6c 65 2c 0a 2a 2a 20 74 68 65 20 70 73  table,.** the ps
18bf0 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f  eudo-table curso
18c00 72 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  r may or may not
18c10 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63   make it's own c
18c20 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 72  opy of the.** or
18c30 69 67 69 6e 61 6c 20 72 6f 77 20 64 61 74 61 2e  iginal row data.
18c40 20 49 66 20 50 32 20 69 73 20 30 2c 20 74 68 65   If P2 is 0, the
18c50 6e 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  n the pseudo-tab
18c60 6c 65 20 77 69 6c 6c 20 63 6f 70 79 20 74 68 65  le will copy the
18c70 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77  .** original row
18c80 20 64 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65   data. Otherwise
18c90 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
18ca0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 65 6d 6f  he original memo
18cb0 72 79 20 63 65 6c 6c 0a 2a 2a 20 69 73 20 73 74  ry cell.** is st
18cc0 6f 72 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ored. In this ca
18cd0 73 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  se, the vdbe pro
18ce0 67 72 61 6d 20 6d 75 73 74 20 65 6e 73 75 72 65  gram must ensure
18cf0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 6d 65   that the .** me
18d00 6d 6f 72 79 20 63 65 6c 6c 20 63 6f 6e 74 61 69  mory cell contai
18d10 6e 69 6e 67 20 74 68 65 20 72 6f 77 20 64 61 74  ning the row dat
18d20 61 20 69 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  a is not overwri
18d30 74 74 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  tten until the.*
18d40 2a 20 70 73 65 75 64 6f 20 74 61 62 6c 65 20 69  * pseudo table i
18d50 73 20 63 6c 6f 73 65 64 20 28 6f 72 20 61 20 6e  s closed (or a n
18d60 65 77 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  ew row is insert
18d70 65 64 20 69 6e 74 6f 20 69 74 29 2e 0a 2a 2a 0a  ed into it)..**.
18d80 2a 2a 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d  ** P3 is the num
18d90 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
18da0 20 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61   the records tha
18db0 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
18dc0 20 62 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64   by.** the pseud
18dd0 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  o-table..*/.case
18de0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20   OP_OpenPseudo: 
18df0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
18e00 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20  eCursor *pCx;.. 
18e10 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
18e20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
18e30 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
18e40 43 75 72 73 6f 72 28 70 2c 20 69 2c 20 70 4f 70  Cursor(p, i, pOp
18e50 2d 3e 70 33 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ->p3, -1, 0);.  
18e60 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74  if( pCx==0 ) got
18e70 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d  o no_mem;.  pCx-
18e80 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
18e90 70 43 78 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65  pCx->pseudoTable
18ea0 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 65 70 68   = 1;.  pCx->eph
18eb0 65 6d 50 73 65 75 64 6f 54 61 62 6c 65 20 3d 20  emPseudoTable = 
18ec0 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  (u8)pOp->p2;.  p
18ed0 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b  Cx->isTable = 1;
18ee0 0a 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20  .  pCx->isIndex 
18ef0 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  = 0;.  break;.}.
18f00 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73  ./* Opcode: Clos
18f10 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  e P1 * * * *.**.
18f20 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
18f30 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  r previously ope
18f40 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20 50  ned as P1.  If P
18f50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72  1 is not.** curr
18f60 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73  ently open, this
18f70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
18f80 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
18f90 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 69   OP_Close: {.  i
18fa0 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 4f 70 2d  nt i;.  i = pOp-
18fb0 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69  >p1;.  assert( i
18fc0 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72  >=0 && i<p->nCur
18fd0 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  sor );.  sqlite3
18fe0 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
18ff0 2c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a  , p->apCsr[i]);.
19000 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
19010 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  0;.  break;.}../
19020 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 65  * Opcode: SeekGe
19030 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
19040 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
19050 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
19060 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
19070 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
19080 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
19090 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
190a0 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74 68  egister P3 as th
190b0 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f  e key.  If curso
190c0 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20  r P1 refers .** 
190d0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c  to an SQL index,
190e0 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20   then P3 is the 
190f0 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
19100 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  y of P4 register
19110 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75  s .** that are u
19120 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b  sed as an unpack
19130 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a  ed index key. .*
19140 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20  *.** Reposition 
19150 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61  cursor P1 so tha
19160 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  t  it points to 
19170 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74  the smallest ent
19180 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67  ry that .** is g
19190 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
191a0 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
191b0 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
191c0 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a  are no records .
191d0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
191e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
191f0 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f  key and P2 is no
19200 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d  t zero, then jum
19210 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53  p to P2..**.** S
19220 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
19230 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e  NotFound, Distin
19240 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b  ct, SeekLt, Seek
19250 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Gt, SeekLe.*/./*
19260 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 74 20   Opcode: SeekGt 
19270 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
19280 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
19290 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
192a0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
192b0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
192c0 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
192d0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
192e0 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
192f0 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
19300 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
19310 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
19320 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
19330 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
19340 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
19350 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
19360 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
19370 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
19380 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
19390 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20 69  or P1 so that  i
193a0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
193b0 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20 74  smallest entry t
193c0 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61 74  hat .** is great
193d0 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20  er than the key 
193e0 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
193f0 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 67  are no records g
19400 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
19410 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
19420 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
19430 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
19440 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
19450 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69  nd, NotFound, Di
19460 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20  stinct, SeekLt, 
19470 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a  SeekGe, SeekLe.*
19480 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  /./* Opcode: See
19490 6b 4c 74 20 50 31 20 50 32 20 50 33 20 50 34 20  kLt P1 P2 P3 P4 
194a0 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  * .**.** If curs
194b0 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
194c0 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
194d0 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
194e0 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
194f0 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
19500 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
19510 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
19520 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
19530 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
19540 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
19550 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
19560 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
19570 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
19580 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
19590 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
195a0 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
195b0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
195c0 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
195d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
195e0 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c  ry that .** is l
195f0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ess than the key
19600 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
19610 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
19620 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68  less than .** th
19630 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
19640 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
19650 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
19660 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64   See also: Found
19670 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74  , NotFound, Dist
19680 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20 53 65  inct, SeekGt, Se
19690 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a  ekGe, SeekLe.*/.
196a0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c  /* Opcode: SeekL
196b0 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
196c0 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
196d0 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
196e0 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
196f0 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
19700 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
19710 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
19720 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61  register P3 as a
19730 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20   key. If cursor 
19740 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
19750 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
19760 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
19770 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
19780 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
19790 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
197a0 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
197b0 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
197c0 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
197d0 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
197e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
197f0 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 74   largest entry t
19800 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20  hat .** is less 
19810 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19820 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
19830 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
19840 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73  records .** less
19850 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
19860 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  o the key and P2
19870 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
19880 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
19890 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
198a0 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
198b0 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47 74  Distinct, SeekGt
198c0 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74  , SeekGe, SeekLt
198d0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
198e0 4c 74 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  Lt:         /* j
198f0 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
19900 20 4f 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20 20   OP_SeekLe:     
19910 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
19920 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b   */.case OP_Seek
19930 47 65 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  Ge:         /* j
19940 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
19950 20 4f 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20 20   OP_SeekGt: {   
19960 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
19970 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
19980 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6f 63  nt res;.  int oc
19990 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
199a0 70 43 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  pC;.  UnpackedRe
199b0 63 6f 72 64 20 72 3b 0a 20 20 69 6e 74 20 6e 46  cord r;.  int nF
199c0 69 65 6c 64 3b 0a 20 20 69 36 34 20 69 4b 65 79  ield;.  i64 iKey
199d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ;      /* The ro
199e0 77 69 64 20 77 65 20 61 72 65 20 74 6f 20 73 65  wid we are to se
199f0 65 6b 20 74 6f 20 2a 2f 0a 0a 20 20 69 20 3d 20  ek to */..  i = 
19a00 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72  pOp->p1;.  asser
19a10 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
19a20 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  nCursor );.  ass
19a30 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20  ert( pOp->p2!=0 
19a40 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
19a50 73 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72 74 28  sr[i];.  assert(
19a60 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   pC!=0 );.  if( 
19a70 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  pC->pCursor!=0 )
19a80 7b 0a 20 20 20 20 6f 63 20 3d 20 70 4f 70 2d 3e  {.    oc = pOp->
19a90 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 43 2d 3e  opcode;.    pC->
19aa0 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
19ab0 20 69 66 28 20 70 43 2d 3e 69 73 54 61 62 6c 65   if( pC->isTable
19ac0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
19ad0 20 69 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20   input value in 
19ae0 50 33 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61  P3 might be of a
19af0 6e 79 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72  ny type: integer
19b00 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a  , real, string,.
19b10 20 20 20 20 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f        ** blob, o
19b20 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20 69 74 20  r NULL.  But it 
19b30 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 20 69  needs to be an i
19b40 6e 74 65 67 65 72 20 62 65 66 6f 72 65 20 77 65  nteger before we
19b50 20 63 61 6e 20 64 6f 0a 20 20 20 20 20 20 2a 2a   can do.      **
19b60 20 74 68 65 20 73 65 65 6b 2c 20 73 6f 20 63 6f   the seek, so co
19b70 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20 20 20 20  vert it. */.    
19b80 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
19b90 66 69 6e 69 74 79 28 70 49 6e 33 29 3b 0a 20 20  finity(pIn3);.  
19ba0 20 20 20 20 69 4b 65 79 20 3d 20 73 71 6c 69 74      iKey = sqlit
19bb0 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
19bc0 49 6e 33 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e  In3);.      pC->
19bd0 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
19be0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
19bf0 68 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c  he P3 value coul
19c00 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  d not be convert
19c10 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
19c20 65 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20  er without.     
19c30 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f   ** loss of info
19c40 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70  rmation, then sp
19c50 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
19c60 20 69 73 20 72 65 71 75 69 72 65 64 2e 2e 2e 20   is required... 
19c70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  */.      if( (pI
19c80 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
19c90 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Int)==0 ){.     
19ca0 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
19cb0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d  ags & MEM_Real)=
19cc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
19cd0 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76 61 6c  /* If the P3 val
19ce0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  ue cannot be con
19cf0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 79 20  verted into any 
19d00 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62 65 72  kind of a number
19d10 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  ,.          ** t
19d20 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20  hen the seek is 
19d30 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f  not possible, so
19d40 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
19d50 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 70 4f           pc = pO
19d60 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
19d70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
19d90 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
19da0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
19db0 65 20 50 33 20 76 61 6c 75 65 20 6d 75 73 74 20  e P3 value must 
19dc0 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 0a 20 20  be a floating.  
19dd0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6e        ** point n
19de0 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  umber. */.      
19df0 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 33 2d    assert( (pIn3-
19e00 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
19e10 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  l)!=0 );..      
19e20 20 20 69 66 28 20 69 4b 65 79 3d 3d 53 4d 41 4c    if( iKey==SMAL
19e30 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 28 70  LEST_INT64 && (p
19e40 49 6e 33 2d 3e 72 3c 28 64 6f 75 62 6c 65 29 69  In3->r<(double)i
19e50 4b 65 79 20 7c 7c 20 70 49 6e 33 2d 3e 72 3e 30  Key || pIn3->r>0
19e60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
19e70 2a 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69  * The P3 value i
19e80 73 20 74 6f 20 6c 61 72 67 65 20 69 6e 20 6d 61  s to large in ma
19e90 67 6e 69 74 75 64 65 20 74 6f 20 62 65 20 65 78  gnitude to be ex
19ea0 70 72 65 73 73 65 64 20 61 73 20 61 6e 0a 20 20  pressed as an.  
19eb0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67          ** integ
19ec0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
19ed0 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20   res = 1;.      
19ee0 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 3c      if( pIn3->r<
19ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
19f00 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
19f10 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Gt || oc==OP_See
19f20 6b 47 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kGe ){.         
19f30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19f40 33 42 74 72 65 65 46 69 72 73 74 28 70 43 2d 3e  3BtreeFirst(pC->
19f50 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
19f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19f80 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
19f90 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
19fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19fc0 20 20 20 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50        if( oc==OP
19fd0 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f  _SeekLt || oc==O
19fe0 50 5f 53 65 65 6b 4c 65 20 29 7b 0a 20 20 20 20  P_SeekLe ){.    
19ff0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a000 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1a010 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  pC->pCursor, &re
1a020 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
1a030 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a040 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
1a050 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1a060 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a080 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
1a090 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 70            pc = p
1a0a0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1a0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a0c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a0d0 20 7d 65 6c 73 65 20 69 66 28 20 6f 63 3d 3d 4f   }else if( oc==O
1a0e0 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d  P_SeekLt || oc==
1a0f0 4f 50 5f 53 65 65 6b 47 65 20 29 7b 0a 20 20 20  OP_SeekGe ){.   
1a100 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
1a110 65 20 63 65 69 6c 69 6e 67 28 29 20 66 75 6e 63  e ceiling() func
1a120 74 69 6f 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20  tion to convert 
1a130 72 65 61 6c 2d 3e 69 6e 74 20 2a 2f 0a 20 20 20  real->int */.   
1a140 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d         if( pIn3-
1a150 3e 72 20 3e 20 28 64 6f 75 62 6c 65 29 69 4b 65  >r > (double)iKe
1a160 79 20 29 20 69 4b 65 79 2b 2b 3b 0a 20 20 20 20  y ) iKey++;.    
1a170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a180 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
1a190 66 6c 6f 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e  floor() function
1a1a0 20 74 6f 20 63 6f 6e 76 65 72 74 20 72 65 61 6c   to convert real
1a1b0 2d 3e 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  ->int */.       
1a1c0 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f     assert( oc==O
1a1d0 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 6f 63 3d 3d  P_SeekLe || oc==
1a1e0 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
1a1f0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d         if( pIn3-
1a200 3e 72 20 3c 20 28 64 6f 75 62 6c 65 29 69 4b 65  >r < (double)iKe
1a210 79 20 29 20 69 4b 65 79 2d 2d 3b 0a 20 20 20 20  y ) iKey--;.    
1a220 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
1a230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a240 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1a250 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f 72  cked(pC->pCursor
1a260 2c 20 30 2c 20 28 75 36 34 29 69 4b 65 79 2c 20  , 0, (u64)iKey, 
1a270 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  0, &res);.      
1a280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a290 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1a2a0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1a2b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
1a2c0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
1a2d0 7b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f  {.        pC->ro
1a2e0 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a  widIsValid = 1;.
1a2f0 20 20 20 20 20 20 20 20 70 43 2d 3e 6c 61 73 74          pC->last
1a300 52 6f 77 69 64 20 3d 20 69 4b 65 79 3b 0a 20 20  Rowid = iKey;.  
1a310 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1a320 0a 20 20 20 20 20 20 6e 46 69 65 6c 64 20 3d 20  .      nField = 
1a330 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 20  pOp->p4.i;.     
1a340 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1a350 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
1a360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a370 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20  nField>0 );.    
1a380 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
1a390 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  C->pKeyInfo;.   
1a3a0 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75     r.nField = (u
1a3b0 31 36 29 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20  16)nField;.     
1a3c0 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
1a3d0 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Gt || oc==OP_See
1a3e0 6b 4c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  kLe ){.        r
1a3f0 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  .flags = UNPACKE
1a400 44 5f 49 4e 43 52 4b 45 59 3b 0a 20 20 20 20 20  D_INCRKEY;.     
1a410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a420 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  r.flags = 0;.   
1a430 20 20 20 7d 0a 20 20 20 20 20 20 72 2e 61 4d 65     }.      r.aMe
1a440 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  m = &p->aMem[pOp
1a450 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 72 63 20  ->p3];.      rc 
1a460 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1a470 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1a480 3e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c  >pCursor, &r, 0,
1a490 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20   0, &res);.     
1a4a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a4b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1a4c0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1a4d0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
1a4e0 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73       pC->rowidIs
1a4f0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d  Valid = 0;.    }
1a500 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
1a510 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
1a520 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
1a530 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
1a540 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a550 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
1a560 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
1a570 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 63  endif.    if( oc
1a580 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 7c 7c 20 6f  ==OP_SeekGe || o
1a590 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 7b 0a  c==OP_SeekGt ){.
1a5a0 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
1a5b0 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63  || (res==0 && oc
1a5c0 3d 3d 4f 50 5f 53 65 65 6b 47 74 29 20 29 7b 0a  ==OP_SeekGt) ){.
1a5d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a5e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
1a5f0 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
1a600 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1a610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a620 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1a630 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  error;.        p
1a640 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  C->rowidIsValid 
1a650 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1a660 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1a670 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1a680 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1a690 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c  rt( oc==OP_SeekL
1a6a0 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1a6b0 4c 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Le );.      if( 
1a6c0 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d 3d 30  res>0 || (res==0
1a6d0 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   && oc==OP_SeekL
1a6e0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
1a6f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1a700 72 65 76 69 6f 75 73 28 70 43 2d 3e 70 43 75 72  revious(pC->pCur
1a710 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
1a720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a730 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f  TE_OK ) goto abo
1a740 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1a750 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f 77  .        pC->row
1a760 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
1a770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a780 20 20 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74      /* res might
1a790 20 62 65 20 6e 65 67 61 74 69 76 65 20 62 65 63   be negative bec
1a7a0 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69  ause the table i
1a7b0 73 20 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20  s empty.  Check 
1a7c0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  to.        ** se
1a7d0 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
1a7e0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 2a   case..        *
1a7f0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  /.        res = 
1a800 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
1a810 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  pC->pCursor);.  
1a820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a830 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
1a840 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
1a850 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
1a860 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1a870 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  }.  }else if( !p
1a880 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29  C->pseudoTable )
1a890 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
1a8a0 70 70 65 6e 73 20 77 68 65 6e 20 61 74 74 65 6d  ppens when attem
1a8b0 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 74 68  pting to open th
1a8c0 65 20 73 71 6c 69 74 65 33 5f 6d 61 73 74 65 72  e sqlite3_master
1a8d0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 66 6f   table.    ** fo
1a8e0 72 20 72 65 61 64 20 61 63 63 65 73 73 20 72 65  r read access re
1a8f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50  turns SQLITE_EMP
1a900 54 59 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  TY. In this case
1a910 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 74   always.    ** t
1a920 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 28 73 69  ake the jump (si
1a930 6e 63 65 20 74 68 65 72 65 20 61 72 65 20 6e 6f  nce there are no
1a940 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
1a950 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20  table)..    */. 
1a960 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1a970 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
1a980 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1a990 53 65 65 6b 20 50 31 20 50 32 20 2a 20 2a 20 2a  Seek P1 P2 * * *
1a9a0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20  .**.** P1 is an 
1a9b0 6f 70 65 6e 20 74 61 62 6c 65 20 63 75 72 73 6f  open table curso
1a9c0 72 20 61 6e 64 20 50 32 20 69 73 20 61 20 72 6f  r and P2 is a ro
1a9d0 77 69 64 20 69 6e 74 65 67 65 72 2e 20 20 41 72  wid integer.  Ar
1a9e0 72 61 6e 67 65 0a 2a 2a 20 66 6f 72 20 50 31 20  range.** for P1 
1a9f0 74 6f 20 6d 6f 76 65 20 73 6f 20 74 68 61 74 20  to move so that 
1aa00 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1aa10 20 72 6f 77 69 64 20 67 69 76 65 6e 20 62 79 20   rowid given by 
1aa20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P2..**.** This i
1aa30 73 20 61 63 74 75 61 6c 6c 79 20 61 20 64 65 66  s actually a def
1aa40 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e 6f 74  erred seek.  Not
1aa50 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20 68 61  hing actually ha
1aa60 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a 20 74  ppens until.** t
1aa70 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
1aa80 64 20 74 6f 20 72 65 61 64 20 61 20 72 65 63 6f  d to read a reco
1aa90 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  rd.  That way, i
1aaa0 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20 6f 63  f no reads.** oc
1aab0 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65 73 73  cur, no unnecess
1aac0 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e 73 2e  ary I/O happens.
1aad0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b  .*/.case OP_Seek
1aae0 3a 20 7b 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f  : {    /* in2 */
1aaf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1ab00 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 69  Cursor *pC;..  i
1ab10 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73   = pOp->p1;.  as
1ab20 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
1ab30 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1ab40 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
1ab50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1ab60 30 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 70  0 );.  if( pC->p
1ab70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20  Cursor!=0 ){.   
1ab80 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
1ab90 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 43 2d 3e  able );.    pC->
1aba0 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nullRow = 0;.   
1abb0 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
1abc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  t = sqlite3VdbeI
1abd0 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a 20  ntValue(pIn2);. 
1abe0 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
1abf0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  lid = 0;.    pC-
1ac00 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
1ac10 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = 1;.  }.  break
1ac20 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f 64  ;.}.  ../* Opcod
1ac30 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20 50  e: Found P1 P2 P
1ac40 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69  3 * *.**.** Regi
1ac50 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20  ster P3 holds a 
1ac60 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64  blob constructed
1ac70 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20   by MakeRecord. 
1ac80 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2e   P1 is an index.
1ac90 0a 2a 2a 20 49 66 20 61 6e 20 65 6e 74 72 79 20  .** If an entry 
1aca0 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
1acb0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
1acc0 65 72 20 70 33 20 65 78 69 73 74 73 20 69 6e 20  er p3 exists in 
1acd0 50 31 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  P1 then.** jump 
1ace0 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 20 50  to P2.  If the P
1acf0 33 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74  3 value does not
1ad00 20 6d 61 74 63 68 20 61 6e 79 20 65 6e 74 72 79   match any entry
1ad10 20 69 6e 20 50 31 0a 2a 2a 20 74 68 65 6e 20 66   in P1.** then f
1ad20 61 6c 6c 20 74 68 72 75 2e 20 20 54 68 65 20 50  all thru.  The P
1ad30 31 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  1 cursor is left
1ad40 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
1ad50 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 0a   matching entry.
1ad60 2a 2a 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ** if it exists.
1ad70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
1ad80 72 75 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ruction is used 
1ad90 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
1ada0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 68 65   IN operator whe
1adb0 72 65 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 68  re the.** left-h
1adc0 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 53 45  and side is a SE
1add0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ade0 20 50 31 20 6d 61 79 20 62 65 20 61 20 74 72 75   P1 may be a tru
1adf0 65 20 69 6e 64 65 78 2c 20 6f 72 20 69 74 0a 2a  e index, or it.*
1ae00 2a 20 6d 61 79 20 62 65 20 61 20 74 65 6d 70 6f  * may be a tempo
1ae10 72 61 72 79 20 69 6e 64 65 78 20 74 68 61 74 20  rary index that 
1ae20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
1ae30 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  s of the SELECT.
1ae40 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 20  ** statement.   
1ae50 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
1ae60 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 6f   is also used to
1ae70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
1ae80 2a 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  * DISTINCT keywo
1ae90 72 64 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  rd in SELECT sta
1aea0 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
1aeb0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1aec0 63 68 65 63 6b 73 20 69 66 20 69 6e 64 65 78 20  checks if index 
1aed0 50 31 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65  P1 contains a re
1aee0 63 6f 72 64 20 66 6f 72 20 77 68 69 63 68 20 0a  cord for which .
1aef0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 4e 20 73  ** the first N s
1af00 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73  erialized values
1af10 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74   exactly match t
1af20 68 65 20 4e 20 73 65 72 69 61 6c 69 7a 65 64 20  he N serialized 
1af30 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 74 68 65  values.** in the
1af40 20 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73   record in regis
1af50 74 65 72 20 50 33 2c 20 77 68 65 72 65 20 4e 20  ter P3, where N 
1af60 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1af70 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e  ber of values in
1af80 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 63 6f 72  .** the P3 recor
1af90 64 20 28 74 68 65 20 50 33 20 72 65 63 6f 72 64  d (the P3 record
1afa0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1afb0 74 68 65 20 50 31 20 72 65 63 6f 72 64 29 2e 20  the P1 record). 
1afc0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1afd0 20 4e 6f 74 46 6f 75 6e 64 2c 20 49 73 55 6e 69   NotFound, IsUni
1afe0 71 75 65 2c 20 4e 6f 74 45 78 69 73 74 73 0a 2a  que, NotExists.*
1aff0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  /./* Opcode: Not
1b000 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33 20 2a  Found P1 P2 P3 *
1b010 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65   *.**.** Registe
1b020 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f  r P3 holds a blo
1b030 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  b constructed by
1b040 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 50 31   MakeRecord.  P1
1b050 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 2e   is.** an index.
1b060 20 20 49 66 20 6e 6f 20 65 6e 74 72 79 20 65 78    If no entry ex
1b070 69 73 74 73 20 69 6e 20 50 31 20 74 68 61 74 20  ists in P1 that 
1b080 6d 61 74 63 68 65 73 20 74 68 65 20 62 6c 6f 62  matches the blob
1b090 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f   then jump.** to
1b0a0 20 50 32 2e 20 20 49 66 20 61 6e 20 65 6e 74 72   P2.  If an entr
1b0b0 79 20 64 6f 65 73 20 65 78 69 73 74 69 6e 67 2c  y does existing,
1b0c0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20   fall through.  
1b0d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b0e0 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ft.** pointing t
1b0f0 6f 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  o the entry that
1b100 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20   matches..**.** 
1b110 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1b120 20 4e 6f 74 45 78 69 73 74 73 2c 20 49 73 55 6e   NotExists, IsUn
1b130 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ique.*/.case OP_
1b140 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20 20 20  NotFound:       
1b150 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1b160 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a 20 7b  case OP_Found: {
1b170 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
1b180 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69 3b   in3 */.  int i;
1b190 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78  .  int alreadyEx
1b1a0 69 73 74 73 3b 0a 20 20 56 64 62 65 43 75 72 73  ists;.  VdbeCurs
1b1b0 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65  or *pC;.  int re
1b1c0 73 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  s;.  UnpackedRec
1b1d0 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a 20 20  ord *pIdxKey;.  
1b1e0 63 68 61 72 20 61 54 65 6d 70 52 65 63 5b 52 4f  char aTempRec[RO
1b1f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1b200 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1b210 69 7a 65 6f 66 28 4d 65 6d 29 2a 33 20 2b 20 37  izeof(Mem)*3 + 7
1b220 5d 3b 0a 0a 20 20 69 20 3d 20 70 4f 70 2d 3e 70  ];..  i = pOp->p
1b230 31 3b 0a 20 20 61 6c 72 65 61 64 79 45 78 69 73  1;.  alreadyExis
1b240 74 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ts = 0;.  assert
1b250 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
1b260 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
1b270 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21  rt( p->apCsr[i]!
1b280 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 20  =0 );.  if( (pC 
1b290 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e  = p->apCsr[i])->
1b2a0 70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 0a 20  pCursor!=0 ){.. 
1b2b0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
1b2c0 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  sTable==0 );.   
1b2d0 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
1b2e0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1b2f0 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
1b300 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1b310 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b 65  rdUnpack(pC->pKe
1b320 79 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20  yInfo, pIn3->n, 
1b330 70 49 6e 33 2d 3e 7a 2c 0a 20 20 20 20 20 20 20  pIn3->z,.       
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1b360 54 65 6d 70 52 65 63 2c 20 73 69 7a 65 6f 66 28  TempRec, sizeof(
1b370 61 54 65 6d 70 52 65 63 29 29 3b 0a 20 20 20 20  aTempRec));.    
1b380 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
1b390 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
1b3a0 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  mem;.    }.    i
1b3b0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
1b3c0 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  OP_Found ){.    
1b3d0 20 20 70 49 64 78 4b 65 79 2d 3e 66 6c 61 67 73    pIdxKey->flags
1b3e0 20 7c 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45   |= UNPACKED_PRE
1b3f0 46 49 58 5f 4d 41 54 43 48 3b 0a 20 20 20 20 7d  FIX_MATCH;.    }
1b400 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b410 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1b420 63 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f 72  cked(pC->pCursor
1b430 2c 20 70 49 64 78 4b 65 79 2c 20 30 2c 20 30 2c  , pIdxKey, 0, 0,
1b440 20 26 72 65 73 29 3b 0a 20 20 20 20 73 71 6c 69   &res);.    sqli
1b450 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
1b460 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
1b470 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
1b480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b4a0 7d 0a 20 20 20 20 61 6c 72 65 61 64 79 45 78 69  }.    alreadyExi
1b4b0 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29 3b 0a  sts = (res==0);.
1b4c0 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
1b4d0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
1b4e0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
1b4f0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
1b500 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70   }.  if( pOp->op
1b510 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29  code==OP_Found )
1b520 7b 0a 20 20 20 20 69 66 28 20 61 6c 72 65 61 64  {.    if( alread
1b530 79 45 78 69 73 74 73 20 29 20 70 63 20 3d 20 70  yExists ) pc = p
1b540 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 65  Op->p2 - 1;.  }e
1b550 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21 61 6c  lse{.    if( !al
1b560 72 65 61 64 79 45 78 69 73 74 73 20 29 20 70 63  readyExists ) pc
1b570 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
1b580 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1b590 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73 55 6e 69  /* Opcode: IsUni
1b5a0 71 75 65 20 50 31 20 50 32 20 50 33 20 50 34 20  que P1 P2 P3 P4 
1b5b0 2a 0a 2a 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50  *.**.** Cursor P
1b5c0 31 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  1 is open on an 
1b5d0 69 6e 64 65 78 2e 20 20 53 6f 20 69 74 20 68 61  index.  So it ha
1b5e0 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 69 74  s no data and it
1b5f0 73 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 0a  s key consists .
1b600 2a 2a 20 6f 66 20 61 20 72 65 63 6f 72 64 20 67  ** of a record g
1b610 65 6e 65 72 61 74 65 64 20 62 79 20 4f 50 5f 4d  enerated by OP_M
1b620 61 6b 65 52 65 63 6f 72 64 20 77 68 65 72 65 20  akeRecord where 
1b630 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
1b640 73 20 74 68 65 20 0a 2a 2a 20 72 6f 77 69 64 20  s the .** rowid 
1b650 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  of the entry tha
1b660 74 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  t the index refe
1b670 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rs to..**.** The
1b680 20 50 33 20 72 65 67 69 73 74 65 72 20 63 6f 6e   P3 register con
1b690 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  tains an integer
1b6a0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
1b6b0 43 61 6c 6c 20 74 68 69 73 20 72 65 63 6f 72 64  Call this record
1b6c0 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 52 2e 20 52   .** number R. R
1b6d0 65 67 69 73 74 65 72 20 50 34 20 69 73 20 74 68  egister P4 is th
1b6e0 65 20 66 69 72 73 74 20 69 6e 20 61 20 73 65 74  e first in a set
1b6f0 20 6f 66 20 4e 20 63 6f 6e 74 69 67 75 6f 75 73   of N contiguous
1b700 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 74 68   registers.** th
1b710 61 74 20 6d 61 6b 65 20 75 70 20 61 6e 20 75 6e  at make up an un
1b720 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1b730 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1b740 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 50 31  d with cursor P1
1b750 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
1b760 66 20 4e 20 63 61 6e 20 62 65 20 69 6e 66 65 72  f N can be infer
1b770 72 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  red from the cur
1b780 73 6f 72 2e 20 4e 20 69 6e 63 6c 75 64 65 73 20  sor. N includes 
1b790 74 68 65 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c  the rowid.** val
1b7a0 75 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ue appended to t
1b7b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1b7c0 64 65 78 20 72 65 63 6f 72 64 2e 20 54 68 69 73  dex record. This
1b7d0 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6d 61 79   rowid value may
1b7e0 0a 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  .** or may not b
1b7f0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 52 2e  e the same as R.
1b800 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  .**.** If any of
1b810 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
1b820 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1b830 72 65 67 69 73 74 65 72 20 50 34 20 63 6f 6e 74  register P4 cont
1b840 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 2a 2a 20 76  ains a NULL.** v
1b850 61 6c 75 65 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  alue, jump immed
1b860 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
1b870 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
1b880 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
1b890 63 68 65 63 6b 73 20 69 66 20 63 75 72 73 6f 72  checks if cursor
1b8a0 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20   P1 contains an 
1b8b0 65 6e 74 72 79 0a 2a 2a 20 77 68 65 72 65 20 74  entry.** where t
1b8c0 68 65 20 66 69 72 73 74 20 28 4e 2d 31 29 20 66  he first (N-1) f
1b8d0 69 65 6c 64 73 20 6d 61 74 63 68 20 62 75 74 20  ields match but 
1b8e0 74 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20  the rowid value 
1b8f0 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66  at the end.** of
1b900 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1b910 20 69 73 20 6e 6f 74 20 52 2e 20 49 66 20 74 68   is not R. If th
1b920 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 65  ere is no such e
1b930 6e 74 72 79 2c 20 63 6f 6e 74 72 6f 6c 20 6a 75  ntry, control ju
1b940 6d 70 73 0a 2a 2a 20 74 6f 20 69 6e 73 74 72 75  mps.** to instru
1b950 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77  ction P2. Otherw
1b960 69 73 65 2c 20 74 68 65 20 72 6f 77 69 64 20 6f  ise, the rowid o
1b970 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  f the conflictin
1b980 67 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79  g index.** entry
1b990 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 72 65   is copied to re
1b9a0 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 63 6f  gister P3 and co
1b9b0 6e 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68 72 6f  ntrol falls thro
1b9c0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a  ugh to the next.
1b9d0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ** instruction..
1b9e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1b9f0 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69  NotFound, NotExi
1ba00 73 74 73 2c 20 46 6f 75 6e 64 0a 2a 2f 0a 63 61  sts, Found.*/.ca
1ba10 73 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 3a 20  se OP_IsUnique: 
1ba20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
1ba30 2c 20 69 6e 33 20 2a 2f 0a 20 20 75 31 36 20 69  , in3 */.  u16 i
1ba40 69 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  i;.  VdbeCursor 
1ba50 2a 70 43 78 3b 0a 20 20 42 74 43 75 72 73 6f 72  *pCx;.  BtCursor
1ba60 20 2a 70 43 72 73 72 3b 0a 20 20 75 31 36 20 6e   *pCrsr;.  u16 n
1ba70 46 69 65 6c 64 3b 0a 20 20 4d 65 6d 20 2a 61 4d  Field;.  Mem *aM
1ba80 65 6d 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  em;.  UnpackedRe
1ba90 63 6f 72 64 20 72 3b 20 20 20 20 20 20 20 20 20  cord r;         
1baa0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 54 72           /* B-Tr
1bab0 65 65 20 69 6e 64 65 78 20 73 65 61 72 63 68 20  ee index search 
1bac0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 52 3b 20  key */.  i64 R; 
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1baf0 6f 77 69 64 20 73 74 6f 72 65 64 20 69 6e 20 72  owid stored in r
1bb00 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 0a 20  egister P3 */.. 
1bb10 20 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d   aMem = &p->aMem
1bb20 5b 70 4f 70 2d 3e 70 34 2e 69 5d 3b 0a 20 20 2f  [pOp->p4.i];.  /
1bb30 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
1bb40 65 20 76 61 6c 75 65 73 20 6f 66 20 70 61 72 61  e values of para
1bb50 6d 65 74 65 72 73 20 50 31 20 61 6e 64 20 50 34  meters P1 and P4
1bb60 20 61 72 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a   are in range. *
1bb70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
1bb80 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
1bb90 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
1bba0 4f 70 2d 3e 70 34 2e 69 3e 30 20 26 26 20 70 4f  Op->p4.i>0 && pO
1bbb0 70 2d 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d 65 6d  p->p4.i<=p->nMem
1bbc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1bbd0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1bbe0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1bbf0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
1bc00 20 69 6e 64 65 78 20 63 75 72 73 6f 72 2e 20 2a   index cursor. *
1bc10 2f 0a 20 20 70 43 78 20 3d 20 70 2d 3e 61 70 43  /.  pCx = p->apC
1bc20 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
1bc30 73 73 65 72 74 28 20 70 43 78 2d 3e 64 65 66 65  ssert( pCx->defe
1bc40 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
1bc50 0a 20 20 70 43 78 2d 3e 73 65 65 6b 52 65 73 75  .  pCx->seekResu
1bc60 6c 74 20 3d 20 30 3b 0a 20 20 70 43 78 2d 3e 63  lt = 0;.  pCx->c
1bc70 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
1bc80 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 72 73  HE_STALE;.  pCrs
1bc90 72 20 3d 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  r = pCx->pCursor
1bca0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f  ;..  /* If any o
1bcb0 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
1bcc0 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 74 68 65 20   NULL, take the 
1bcd0 6a 75 6d 70 2e 20 2a 2f 0a 20 20 6e 46 69 65 6c  jump. */.  nFiel
1bce0 64 20 3d 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66  d = pCx->pKeyInf
1bcf0 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 66 6f 72  o->nField;.  for
1bd00 28 69 69 3d 30 3b 20 69 69 3c 6e 46 69 65 6c 64  (ii=0; ii<nField
1bd10 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
1bd20 20 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20   aMem[ii].flags 
1bd30 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
1bd40 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
1bd50 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 43 72 73   - 1;.      pCrs
1bd60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  r = 0;.      bre
1bd70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1bd80 61 73 73 65 72 74 28 20 28 61 4d 65 6d 5b 6e 46  assert( (aMem[nF
1bd90 69 65 6c 64 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ield].flags & ME
1bda0 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 0a 20  M_Null)==0 );.. 
1bdb0 20 69 66 28 20 70 43 72 73 72 21 3d 30 20 29 7b   if( pCrsr!=0 ){
1bdc0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
1bdd0 20 74 68 65 20 69 6e 64 65 78 20 73 65 61 72 63   the index searc
1bde0 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 72 2e  h key. */.    r.
1bdf0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 78 2d 3e  pKeyInfo = pCx->
1be00 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
1be10 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 20  nField = nField 
1be20 2b 20 31 3b 0a 20 20 20 20 72 2e 66 6c 61 67 73  + 1;.    r.flags
1be30 20 3d 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   = UNPACKED_PREF
1be40 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 72  IX_SEARCH;.    r
1be50 2e 61 4d 65 6d 20 3d 20 61 4d 65 6d 3b 0a 0a 20  .aMem = aMem;.. 
1be60 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1be70 65 20 76 61 6c 75 65 20 6f 66 20 52 20 66 72 6f  e value of R fro
1be80 6d 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 2a  m register P3. *
1be90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1bea0 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
1beb0 49 6e 33 29 3b 0a 20 20 20 20 52 20 3d 20 70 49  In3);.    R = pI
1bec0 6e 33 2d 3e 75 2e 69 3b 0a 0a 20 20 20 20 2f 2a  n3->u.i;..    /*
1bed0 20 53 65 61 72 63 68 20 74 68 65 20 42 2d 54 72   Search the B-Tr
1bee0 65 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20  ee index. If no 
1bef0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 63 6f  conflicting reco
1bf00 72 64 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d  rd is found, jum
1bf10 70 0a 20 20 20 20 2a 2a 20 74 6f 20 50 32 2e 20  p.    ** to P2. 
1bf20 4f 74 68 65 72 77 69 73 65 2c 20 63 6f 70 79 20  Otherwise, copy 
1bf30 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
1bf40 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 65 63   conflicting rec
1bf50 6f 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  ord to.    ** re
1bf60 67 69 73 74 65 72 20 50 33 20 61 6e 64 20 66 61  gister P3 and fa
1bf70 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
1bf80 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1bf90 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  on.  */.    rc =
1bfa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1bfb0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73  etoUnpacked(pCrs
1bfc0 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 70 43  r, &r, 0, 0, &pC
1bfd0 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 29 3b 0a  x->seekResult);.
1bfe0 20 20 20 20 69 66 28 20 28 72 2e 66 6c 61 67 73      if( (r.flags
1bff0 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
1c000 49 58 5f 53 45 41 52 43 48 29 20 7c 7c 20 72 2e  IX_SEARCH) || r.
1c010 72 6f 77 69 64 3d 3d 52 20 29 7b 0a 20 20 20 20  rowid==R ){.    
1c020 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
1c030 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1c040 20 20 20 20 20 70 49 6e 33 2d 3e 75 2e 69 20 3d       pIn3->u.i =
1c050 20 72 2e 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a   r.rowid;.    }.
1c060 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1c070 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 45 78  /* Opcode: NotEx
1c080 69 73 74 73 20 50 31 20 50 32 20 50 33 20 2a 20  ists P1 P2 P3 * 
1c090 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
1c0a0 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
1c0b0 74 65 72 20 50 33 20 61 73 20 61 20 69 6e 74 65  ter P3 as a inte
1c0c0 67 65 72 20 6b 65 79 2e 20 20 49 66 20 61 20 72  ger key.  If a r
1c0d0 65 63 6f 72 64 20 0a 2a 2a 20 77 69 74 68 20 74  ecord .** with t
1c0e0 68 61 74 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  hat key does not
1c0f0 20 65 78 69 73 74 20 69 6e 20 74 61 62 6c 65 20   exist in table 
1c100 6f 66 20 50 31 2c 20 74 68 65 6e 20 6a 75 6d 70  of P1, then jump
1c110 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20 74   to P2. .** If t
1c120 68 65 20 72 65 63 6f 72 64 20 64 6f 65 73 20 65  he record does e
1c130 78 69 73 74 2c 20 74 68 65 6e 20 66 61 6c 6c 20  xist, then fall 
1c140 74 68 72 75 2e 20 20 54 68 65 20 63 75 72 73 6f  thru.  The curso
1c150 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f  r is left .** po
1c160 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72 65  inting to the re
1c170 63 6f 72 64 20 69 66 20 69 74 20 65 78 69 73 74  cord if it exist
1c180 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  s..**.** The dif
1c190 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1c1a0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
1c1b0 6e 64 20 4e 6f 74 46 6f 75 6e 64 20 69 73 20 74  nd NotFound is t
1c1c0 68 61 74 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72  hat this.** oper
1c1d0 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ation assumes th
1c1e0 65 20 6b 65 79 20 69 73 20 61 6e 20 69 6e 74 65  e key is an inte
1c1f0 67 65 72 20 61 6e 64 20 74 68 61 74 20 50 31 20  ger and that P1 
1c200 69 73 20 61 20 74 61 62 6c 65 20 77 68 65 72 65  is a table where
1c210 61 73 0a 2a 2a 20 4e 6f 74 46 6f 75 6e 64 20 61  as.** NotFound a
1c220 73 73 75 6d 65 73 20 6b 65 79 20 69 73 20 61 20  ssumes key is a 
1c230 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64  blob constructed
1c240 20 66 72 6f 6d 20 4d 61 6b 65 52 65 63 6f 72 64   from MakeRecord
1c250 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 61 6e   and.** P1 is an
1c260 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65   index..**.** Se
1c270 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
1c280 6f 74 46 6f 75 6e 64 2c 20 49 73 55 6e 69 71 75  otFound, IsUniqu
1c290 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74  e.*/.case OP_Not
1c2a0 45 78 69 73 74 73 3a 20 7b 20 20 20 20 20 20 20  Exists: {       
1c2b0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1c2c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1c2d0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
1c2e0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
1c2f0 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20   int res;.  u64 
1c300 69 4b 65 79 3b 0a 0a 20 20 69 20 3d 20 70 4f 70  iKey;..  i = pOp
1c310 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p1;.  assert( 
1c320 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75  i>=0 && i<p->nCu
1c330 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
1c340 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21 3d 30  ( p->apCsr[i]!=0
1c350 20 29 3b 0a 20 20 69 66 28 20 28 70 43 72 73 72   );.  if( (pCrsr
1c360 20 3d 20 28 70 43 20 3d 20 70 2d 3e 61 70 43 73   = (pC = p->apCs
1c370 72 5b 69 5d 29 2d 3e 70 43 75 72 73 6f 72 29 21  r[i])->pCursor)!
1c380 3d 30 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  =0 ){.    res = 
1c390 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
1c3a0 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
1c3b0 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  _Int );.    asse
1c3c0 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 2d  rt( p->apCsr[i]-
1c3d0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
1c3e0 69 4b 65 79 20 3d 20 69 6e 74 54 6f 4b 65 79 28  iKey = intToKey(
1c3f0 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pIn3->u.i);.    
1c400 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1c410 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1c420 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20  pCrsr, 0, iKey, 
1c430 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43  0, &res);.    pC
1c440 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 49  ->lastRowid = pI
1c450 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 43 2d  n3->u.i;.    pC-
1c460 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1c470 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20  res==0 ?1:0;.   
1c480 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30   pC->nullRow = 0
1c490 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
1c4a0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
1c4b0 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  ALE;.    pC->def
1c4c0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1c4d0 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20  .    if( res!=0 
1c4e0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1c4f0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1c500 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77   assert( pC->row
1c510 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  idIsValid==0 );.
1c520 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 73 65      }.    pC->se
1c530 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a  ekResult = res;.
1c540 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 43 2d    }else if( !pC-
1c550 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a  >pseudoTable ){.
1c560 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
1c570 65 6e 73 20 77 68 65 6e 20 61 6e 20 61 74 74 65  ens when an atte
1c580 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 72 65  mpt to open a re
1c590 61 64 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  ad cursor on the
1c5a0 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f   .    ** sqlite_
1c5b0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 72 65 74  master table ret
1c5c0 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54  urns SQLITE_EMPT
1c5d0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  Y..    */.    as
1c5e0 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
1c5f0 65 20 29 3b 0a 20 20 20 20 70 63 20 3d 20 70 4f  e );.    pc = pO
1c600 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 61  p->p2 - 1;.    a
1c610 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64  ssert( pC->rowid
1c620 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  IsValid==0 );.  
1c630 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
1c640 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 0;.  }.  brea
1c650 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1c660 20 53 65 71 75 65 6e 63 65 20 50 31 20 50 32 20   Sequence P1 P2 
1c670 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64  * * *.**.** Find
1c680 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61   the next availa
1c690 62 6c 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  ble sequence num
1c6a0 62 65 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50  ber for cursor P
1c6b0 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  1..** Write the 
1c6c0 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
1c6d0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
1c6e0 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63  ..** The sequenc
1c6f0 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20  e number on the 
1c700 63 75 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d  cursor is increm
1c710 65 6e 74 65 64 20 61 66 74 65 72 20 74 68 69 73  ented after this
1c720 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
1c730 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65    .*/.case OP_Se
1c740 71 75 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20  quence: {       
1c750 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
1c760 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1c770 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61  i = pOp->p1;.  a
1c780 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
1c790 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1c7a0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
1c7b0 72 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75  r[i]!=0 );.  pOu
1c7c0 74 2d 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73  t->u.i = p->apCs
1c7d0 72 5b 69 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b  r[i]->seqCount++
1c7e0 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
1c7f0 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
1c800 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a  );.  break;.}...
1c810 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f  /* Opcode: NewRo
1c820 77 69 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  wid P1 P2 P3 * *
1c830 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77  .**.** Get a new
1c840 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20   integer record 
1c850 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72  number (a.k.a "r
1c860 6f 77 69 64 22 29 20 75 73 65 64 20 61 73 20 74  owid") used as t
1c870 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c  he key to a tabl
1c880 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64  e..** The record
1c890 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70   number is not p
1c8a0 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61  reviously used a
1c8b0 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64  s a key in the d
1c8c0 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
1c8d0 20 74 68 61 74 20 63 75 72 73 6f 72 20 50 31 20   that cursor P1 
1c8e0 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20  points to.  The 
1c8f0 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
1c900 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  r is written.** 
1c910 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73  written to regis
1c920 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P2..**.** If
1c930 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73   P3>0 then P3 is
1c940 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
1c950 20 68 6f 6c 64 73 20 74 68 65 20 6c 61 72 67 65   holds the large
1c960 73 74 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  st previously.**
1c970 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72   generated recor
1c980 64 20 6e 75 6d 62 65 72 2e 20 20 4e 6f 20 6e 65  d number.  No ne
1c990 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73  w record numbers
1c9a0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
1c9b0 62 65 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  be less.** than 
1c9c0 74 68 69 73 20 76 61 6c 75 65 2e 20 20 57 68 65  this value.  Whe
1c9d0 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72 65 61  n this value rea
1c9e0 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d  ches its maximum
1c9f0 2c 20 61 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a  , a SQLITE_FULL.
1ca00 2a 2a 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  ** error is gene
1ca10 72 61 74 65 64 2e 20 20 54 68 65 20 50 33 20 72  rated.  The P3 r
1ca20 65 67 69 73 74 65 72 20 69 73 20 75 70 64 61 74  egister is updat
1ca30 65 64 20 77 69 74 68 20 74 68 65 20 67 65 6e 65  ed with the gene
1ca40 72 61 74 65 64 0a 2a 2a 20 72 65 63 6f 72 64 20  rated.** record 
1ca50 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20 50 33  number.  This P3
1ca60 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73   mechanism is us
1ca70 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65  ed to help imple
1ca80 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f  ment the.** AUTO
1ca90 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72  INCREMENT featur
1caa0 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  e..*/.case OP_Ne
1cab0 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  wRowid: {       
1cac0 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
1cad0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1cae0 69 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 56 64  i;.  i64 v;.  Vd
1caf0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
1cb00 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  int res;.  int r
1cb10 78 3b 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20  x;.  int cnt;.  
1cb20 69 36 34 20 78 3b 0a 20 20 4d 65 6d 20 2a 70 4d  i64 x;.  Mem *pM
1cb30 65 6d 3b 0a 0a 20 20 69 20 3d 20 70 4f 70 2d 3e  em;..  i = pOp->
1cb40 70 31 3b 0a 20 20 76 20 3d 20 30 3b 0a 20 20 72  p1;.  v = 0;.  r
1cb50 65 73 20 3d 20 30 3b 0a 20 20 72 78 20 3d 20 53  es = 0;.  rx = S
1cb60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1cb70 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
1cb80 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
1cb90 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
1cba0 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ]!=0 );.  if( (p
1cbb0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29  C = p->apCsr[i])
1cbc0 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 29 7b 0a  ->pCursor==0 ){.
1cbd0 20 20 20 20 2f 2a 20 54 68 65 20 7a 65 72 6f 20      /* The zero 
1cbe0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61  initialization a
1cbf0 62 6f 76 65 20 69 73 20 61 6c 6c 20 74 68 61 74  bove is all that
1cc00 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   is needed */.  
1cc10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1cc20 65 20 6e 65 78 74 20 72 6f 77 69 64 20 6f 72 20  e next rowid or 
1cc30 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 64  record number (d
1cc40 69 66 66 65 72 65 6e 74 20 74 65 72 6d 73 20 66  ifferent terms f
1cc50 6f 72 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  or the same.    
1cc60 2a 2a 20 74 68 69 6e 67 29 20 69 73 20 6f 62 74  ** thing) is obt
1cc70 61 69 6e 65 64 20 69 6e 20 61 20 74 77 6f 2d 73  ained in a two-s
1cc80 74 65 70 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  tep algorithm.. 
1cc90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1cca0 73 74 20 77 65 20 61 74 74 65 6d 70 74 20 74 6f  st we attempt to
1ccb0 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
1ccc0 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64  t existing rowid
1ccd0 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a 20 20 20   and add one.   
1cce0 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20 20 42 75   ** to that.  Bu
1ccf0 74 20 69 66 20 74 68 65 20 6c 61 72 67 65 73 74  t if the largest
1cd00 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20   existing rowid 
1cd10 69 73 20 61 6c 72 65 61 64 79 20 74 68 65 20 6d  is already the m
1cd20 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f  aximum.    ** po
1cd30 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2c 20  sitive integer, 
1cd40 77 65 20 68 61 76 65 20 74 6f 20 66 61 6c 6c 20  we have to fall 
1cd50 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 73  through to the s
1cd60 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f  econd.    ** pro
1cd70 62 61 62 69 6c 69 73 74 69 63 20 61 6c 67 6f 72  babilistic algor
1cd80 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ithm.    **.    
1cd90 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6c  ** The second al
1cda0 67 6f 72 69 74 68 6d 20 69 73 20 74 6f 20 73 65  gorithm is to se
1cdb0 6c 65 63 74 20 61 20 72 6f 77 69 64 20 61 74 20  lect a rowid at 
1cdc0 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65 65 20 69  random and see i
1cdd0 66 0a 20 20 20 20 2a 2a 20 69 74 20 61 6c 72 65  f.    ** it alre
1cde0 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
1cdf0 65 20 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20  e table.  If it 
1ce00 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
1ce10 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 73  we have.    ** s
1ce20 75 63 63 65 65 64 65 64 2e 20 20 49 66 20 74 68  ucceeded.  If th
1ce30 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64  e random rowid d
1ce40 6f 65 73 20 65 78 69 73 74 2c 20 77 65 20 73 65  oes exist, we se
1ce50 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20  lect a new one. 
1ce60 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 61 67     ** and try ag
1ce70 61 69 6e 2c 20 75 70 20 74 6f 20 31 30 30 30 20  ain, up to 1000 
1ce80 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  times..    **.  
1ce90 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    ** For a table
1cea0 20 77 69 74 68 20 6c 65 73 73 20 74 68 61 6e 20   with less than 
1ceb0 32 20 62 69 6c 6c 69 6f 6e 20 65 6e 74 72 69 65  2 billion entrie
1cec0 73 2c 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  s, the probabili
1ced0 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74  ty.    ** of not
1cee0 20 66 69 6e 64 69 6e 67 20 61 20 75 6e 75 73 65   finding a unuse
1cef0 64 20 72 6f 77 69 64 20 69 73 20 61 62 6f 75 74  d rowid is about
1cf00 20 31 2e 30 65 2d 33 30 30 2e 20 20 54 68 69 73   1.0e-300.  This
1cf10 20 69 73 20 61 20 0a 20 20 20 20 2a 2a 20 6e 6f   is a .    ** no
1cf20 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
1cf30 74 79 2c 20 62 75 74 20 69 74 20 69 73 20 73 74  ty, but it is st
1cf40 69 6c 6c 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  ill vanishingly 
1cf50 73 6d 61 6c 6c 20 61 6e 64 20 73 68 6f 75 6c 64  small and should
1cf60 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 63 61  .    ** never ca
1cf70 75 73 65 20 61 20 70 72 6f 62 6c 65 6d 2e 20 20  use a problem.  
1cf80 59 6f 75 20 61 72 65 20 6d 75 63 68 2c 20 6d 75  You are much, mu
1cf90 63 68 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74  ch more likely t
1cfa0 6f 20 68 61 76 65 20 61 0a 20 20 20 20 2a 2a 20  o have a.    ** 
1cfb0 68 61 72 64 77 61 72 65 20 66 61 69 6c 75 72 65  hardware failure
1cfc0 20 74 68 61 6e 20 66 6f 72 20 74 68 69 73 20 61   than for this a
1cfd0 6c 67 6f 72 69 74 68 6d 20 74 6f 20 66 61 69 6c  lgorithm to fail
1cfe0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1cff0 54 68 65 20 61 6e 61 6c 79 73 69 73 20 69 6e 20  The analysis in 
1d000 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 72  the previous par
1d010 61 67 72 61 70 68 20 61 73 73 75 6d 65 73 20 74  agraph assumes t
1d020 68 61 74 20 79 6f 75 20 68 61 76 65 20 61 20 67  hat you have a g
1d030 6f 6f 64 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  ood.    ** sourc
1d040 65 20 6f 66 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  e of random numb
1d050 65 72 73 2e 20 20 49 73 20 61 20 6c 69 62 72 61  ers.  Is a libra
1d060 72 79 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65  ry function like
1d070 20 6c 72 61 6e 64 34 38 28 29 0a 20 20 20 20 2a   lrand48().    *
1d080 2a 20 67 6f 6f 64 20 65 6e 6f 75 67 68 3f 20 20  * good enough?  
1d090 4d 61 79 62 65 2e 20 4d 61 79 62 65 20 6e 6f 74  Maybe. Maybe not
1d0a0 2e 20 49 74 27 73 20 68 61 72 64 20 74 6f 20 6b  . It's hard to k
1d0b0 6e 6f 77 20 77 68 65 74 68 65 72 20 74 68 65 72  now whether ther
1d0c0 65 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62  e.    ** might b
1d0d0 65 20 73 75 62 74 6c 65 20 62 75 67 73 20 69 73  e subtle bugs is
1d0e0 20 73 6f 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61   some implementa
1d0f0 74 69 6f 6e 73 20 6f 66 20 6c 72 61 6e 64 34 38  tions of lrand48
1d100 28 29 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  () that.    ** c
1d110 6f 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c  ould cause probl
1d120 65 6d 73 2e 20 54 6f 20 61 76 6f 69 64 20 75 6e  ems. To avoid un
1d130 63 65 72 74 61 69 6e 74 79 2c 20 53 51 4c 69 74  certainty, SQLit
1d140 65 20 75 73 65 73 20 69 74 73 20 6f 77 6e 20 0a  e uses its own .
1d150 20 20 20 20 2a 2a 20 72 61 6e 64 6f 6d 20 6e 75      ** random nu
1d160 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 62  mber generator b
1d170 61 73 65 64 20 6f 6e 20 74 68 65 20 52 43 34 20  ased on the RC4 
1d180 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a  algorithm..    *
1d190 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 70 72 6f 6d  *.    ** To prom
1d1a0 6f 74 65 20 6c 6f 63 61 6c 69 74 79 20 6f 66 20  ote locality of 
1d1b0 72 65 66 65 72 65 6e 63 65 20 66 6f 72 20 72 65  reference for re
1d1c0 70 65 74 69 74 69 76 65 20 69 6e 73 65 72 74 73  petitive inserts
1d1d0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  , the.    ** fir
1d1e0 73 74 20 66 65 77 20 61 74 74 65 6d 70 74 73 20  st few attempts 
1d1f0 61 74 20 63 68 6f 6f 73 69 6e 67 20 61 20 72 61  at choosing a ra
1d200 6e 64 6f 6d 20 72 6f 77 69 64 20 70 69 63 6b 20  ndom rowid pick 
1d210 76 61 6c 75 65 73 20 6a 75 73 74 20 61 20 6c 69  values just a li
1d220 74 74 6c 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67  ttle.    ** larg
1d230 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
1d240 69 6f 75 73 20 72 6f 77 69 64 2e 20 20 54 68 69  ious rowid.  Thi
1d250 73 20 68 61 73 20 62 65 65 6e 20 73 68 6f 77 6e  s has been shown
1d260 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 0a   experimentally.
1d270 20 20 20 20 2a 2a 20 74 6f 20 64 6f 75 62 6c 65      ** to double
1d280 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 74 68   the speed of th
1d290 65 20 43 4f 50 59 20 6f 70 65 72 61 74 69 6f 6e  e COPY operation
1d2a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
1d2b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 73   = 0;.    if( (s
1d2c0 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
1d2d0 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 26 28 42  (pC->pCursor)&(B
1d2e0 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
1d2f0 45 5f 5a 45 52 4f 44 41 54 41 29 29 20 21 3d 0a  E_ZERODATA)) !=.
1d300 20 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f            BTREE_
1d310 49 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20 20 20  INTKEY ){.      
1d320 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1d330 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1d340 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1d350 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
1d360 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69     assert( (sqli
1d370 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70 43  te3BtreeFlags(pC
1d380 2d 3e 70 43 75 72 73 6f 72 29 20 26 20 42 54 52  ->pCursor) & BTR
1d390 45 45 5f 49 4e 54 4b 45 59 29 21 3d 30 20 29 3b  EE_INTKEY)!=0 );
1d3a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71  .    assert( (sq
1d3b0 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28  lite3BtreeFlags(
1d3c0 70 43 2d 3e 70 43 75 72 73 6f 72 29 20 26 20 42  pC->pCursor) & B
1d3d0 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  TREE_ZERODATA)==
1d3e0 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
1d3f0 49 54 45 5f 33 32 42 49 54 5f 52 4f 57 49 44 0a  ITE_32BIT_ROWID.
1d400 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 52  #   define MAX_R
1d410 4f 57 49 44 20 30 78 37 66 66 66 66 66 66 66 0a  OWID 0x7fffffff.
1d420 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 6f 6d  #else.    /* Som
1d430 65 20 63 6f 6d 70 69 6c 65 72 73 20 63 6f 6d 70  e compilers comp
1d440 6c 61 69 6e 20 61 62 6f 75 74 20 63 6f 6e 73 74  lain about const
1d450 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ants of the form
1d460 20 30 78 37 66 66 66 66 66 66 66 66 66 66 66 66   0x7ffffffffffff
1d470 66 66 66 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65  fff..    ** Othe
1d480 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75  rs complain abou
1d490 74 20 30 78 37 66 66 66 66 66 66 66 66 66 66 66  t 0x7fffffffffff
1d4a0 66 66 66 66 66 4c 4c 2e 20 20 54 68 65 20 66 6f  fffffLL.  The fo
1d4b0 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 73 65  llowing macro se
1d4c0 65 6d 73 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72  ems.    ** to pr
1d4d0 6f 76 69 64 65 20 74 68 65 20 63 6f 6e 73 74 61  ovide the consta
1d4e0 6e 74 20 77 68 69 6c 65 20 6d 61 6b 69 6e 67 20  nt while making 
1d4f0 61 6c 6c 20 63 6f 6d 70 69 6c 65 72 73 20 68 61  all compilers ha
1d500 70 70 79 2e 0a 20 20 20 20 2a 2f 0a 23 20 20 20  ppy..    */.#   
1d510 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44  define MAX_ROWID
1d520 20 20 28 69 36 34 29 28 20 28 28 28 75 36 34 29    (i64)( (((u64)
1d530 30 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29  0x7fffffff)<<32)
1d540 20 7c 20 28 75 36 34 29 30 78 66 66 66 66 66 66   | (u64)0xffffff
1d550 66 66 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ff ).#endif..   
1d560 20 69 66 28 20 21 70 43 2d 3e 75 73 65 52 61 6e   if( !pC->useRan
1d570 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
1d580 20 20 76 20 3d 20 73 71 6c 69 74 65 33 42 74 72    v = sqlite3Btr
1d590 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeGetCachedRowid
1d5a0 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  (pC->pCursor);. 
1d5b0 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 7b       if( v==0 ){
1d5c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1d5d0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70  lite3BtreeLast(p
1d5e0 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  C->pCursor, &res
1d5f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d610 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
1d620 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1d630 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1d640 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
1d650 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b            v = 1;
1d660 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d680 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
1d690 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a  ->pCursor, &v);.
1d6a0 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 6b 65            v = ke
1d6b0 79 54 6f 49 6e 74 28 76 29 3b 0a 20 20 20 20 20  yToInt(v);.     
1d6c0 20 20 20 20 20 69 66 28 20 76 3d 3d 4d 41 58 5f       if( v==MAX_
1d6d0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
1d6e0 20 20 20 20 20 70 43 2d 3e 75 73 65 52 61 6e 64       pC->useRand
1d6f0 6f 6d 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  omRowid = 1;.   
1d700 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d710 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 0a 20            v++;. 
1d720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69     }.      }..#i
1d740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d750 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
1d760 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1d770 33 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  3 ){.        ass
1d780 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
1d790 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
1d7a0 65 6d 20 29 3b 20 2f 2a 20 50 33 20 69 73 20 61  em ); /* P3 is a
1d7b0 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65   valid memory ce
1d7c0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  ll */.        pM
1d7d0 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  em = &p->aMem[pO
1d7e0 70 2d 3e 70 33 5d 3b 0a 09 52 45 47 49 53 54 45  p->p3];..REGISTE
1d7f0 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
1d800 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
1d810 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1d820 74 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a  tegerify(pMem);.
1d830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d840 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1d850 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 20 20 2f  EM_Int)!=0 );  /
1d860 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c 64 73 20  * mem(P3) holds 
1d870 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1d880 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
1d890 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49 44 20 7c  u.i==MAX_ROWID |
1d8a0 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  | pC->useRandomR
1d8b0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
1d8c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1d8d0 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LL;.          go
1d8e0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1d8f0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d  error;.        }
1d900 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 70  .        if( v<p
1d910 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20  Mem->u.i+1 ){.  
1d920 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d          v = pMem
1d930 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20  ->u.i + 1;.     
1d940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65     }.        pMe
1d950 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20  m->u.i = v;.    
1d960 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1d970 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
1d980 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d  tCachedRowid(pC-
1d990 3e 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f  >pCursor, v<MAX_
1d9a0 52 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29  ROWID ? v+1 : 0)
1d9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d9c0 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
1d9d0 69 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  id ){.      asse
1d9e0 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29  rt( pOp->p3==0 )
1d9f0 3b 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c  ;  /* SQLITE_FUL
1da00 4c 20 6d 75 73 74 20 68 61 76 65 20 6f 63 63 75  L must have occu
1da10 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
1da20 69 73 20 2a 2f 0a 20 20 20 20 20 20 76 20 3d 20  is */.      v = 
1da30 64 62 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69  db->priorNewRowi
1da40 64 3b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 30  d;.      cnt = 0
1da50 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1da60 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
1da70 26 20 28 76 26 30 78 66 66 66 66 66 66 29 3d 3d  & (v&0xffffff)==
1da80 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76  v ){.          v
1da90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1daa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
1dab0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1dac0 73 69 7a 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a  sizeof(v), &v);.
1dad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6e            if( cn
1dae0 74 3c 35 20 29 20 76 20 26 3d 20 30 78 66 66 66  t<5 ) v &= 0xfff
1daf0 66 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fff;.        }. 
1db00 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20         if( v==0 
1db10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1db20 20 20 20 20 78 20 3d 20 69 6e 74 54 6f 4b 65 79      x = intToKey
1db30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 78 20  (v);.        rx 
1db40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1db50 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d  vetoUnpacked(pC-
1db60 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  >pCursor, 0, (u6
1db70 34 29 78 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  4)x, 0, &res);. 
1db80 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
1db90 20 20 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3c      }while( cnt<
1dba0 31 30 30 20 26 26 20 72 78 3d 3d 53 51 4c 49 54  100 && rx==SQLIT
1dbb0 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29  E_OK && res==0 )
1dbc0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 70 72 69 6f  ;.      db->prio
1dbd0 72 4e 65 77 52 6f 77 69 64 20 3d 20 76 3b 0a 20  rNewRowid = v;. 
1dbe0 20 20 20 20 20 69 66 28 20 72 78 3d 3d 53 51 4c       if( rx==SQL
1dbf0 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30  ITE_OK && res==0
1dc00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1dc10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1dc20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
1dc30 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1dc40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dc50 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1dc60 64 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 64  d = 0;.    pC->d
1dc70 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1dc80 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1dc90 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1dca0 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 4d 65 6d 53  TALE;.  }.  MemS
1dcb0 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
1dcc0 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 70 4f 75   MEM_Int);.  pOu
1dcd0 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62 72  t->u.i = v;.  br
1dce0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1dcf0 65 3a 20 49 6e 73 65 72 74 20 50 31 20 50 32 20  e: Insert P1 P2 
1dd00 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 57  P3 P4 P5.**.** W
1dd10 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
1dd20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
1dd30 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e 65  cursor P1.  A ne
1dd40 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63 72  w entry is.** cr
1dd50 65 61 74 65 64 20 69 66 20 69 74 20 64 6f 65 73  eated if it does
1dd60 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  n't already exis
1dd70 74 20 6f 72 20 74 68 65 20 64 61 74 61 20 66 6f  t or the data fo
1dd80 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  r an existing.**
1dd90 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72   entry is overwr
1dda0 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74 61  itten.  The data
1ddb0 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 73 74   is the value st
1ddc0 6f 72 65 64 20 72 65 67 69 73 74 65 72 0a 2a 2a  ored register.**
1ddd0 20 6e 75 6d 62 65 72 20 50 32 2e 20 54 68 65 20   number P2. The 
1dde0 6b 65 79 20 69 73 20 73 74 6f 72 65 64 20 69 6e  key is stored in
1ddf0 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 54 68   register P3. Th
1de00 65 20 6b 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65  e key must.** be
1de10 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
1de20 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
1de30 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66  _NCHANGE flag of
1de40 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 6e   P5 is set, then
1de50 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20   the row change 
1de60 63 6f 75 6e 74 20 69 73 0a 2a 2a 20 69 6e 63 72  count is.** incr
1de70 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69  emented (otherwi
1de80 73 65 20 6e 6f 74 29 2e 20 20 49 66 20 74 68 65  se not).  If the
1de90 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49   OPFLAG_LASTROWI
1dea0 44 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20  D flag of P5 is 
1deb0 73 65 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 6f 77  set,.** then row
1dec0 69 64 20 69 73 20 73 74 6f 72 65 64 20 66 6f 72  id is stored for
1ded0 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 74 75   subsequent retu
1dee0 72 6e 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c  rn by the.** sql
1def0 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
1df00 5f 72 6f 77 69 64 28 29 20 66 75 6e 63 74 69 6f  _rowid() functio
1df10 6e 20 28 6f 74 68 65 72 77 69 73 65 20 69 74 20  n (otherwise it 
1df20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 29 2e 0a  is unmodified)..
1df30 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1df40 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  P4 may point to 
1df50 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
1df60 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2d 6e 61  ing the table-na
1df70 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20 62 65  me, or.** may be
1df80 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
1df90 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
1dfa0 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 0a  he update-hook .
1dfb0 2a 2a 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64  ** (sqlite3.xUpd
1dfc0 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20  ateCallback) is 
1dfd0 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77 69 6e  invoked followin
1dfe0 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69  g a successful i
1dff0 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41  nsert..**.** (WA
1e000 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50  RNING/TODO: If P
1e010 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75  1 is a pseudo-cu
1e020 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64  rsor and P2 is d
1e030 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
1e040 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77  located, then ow
1e050 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73  nership of P2 is
1e060 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20   transferred to 
1e070 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  the pseudo-curso
1e080 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65  r.** and registe
1e090 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68  r P2 becomes eph
1e0a0 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20  emeral.  If the 
1e0b0 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65  cursor is change
1e0c0 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  d, the.** value 
1e0d0 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77  of register P2 w
1e0e0 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e  ill then change.
1e0f0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
1e100 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75   does not.** cau
1e110 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1e120 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ).**.** This ins
1e130 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  truction only wo
1e140 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20  rks on tables.  
1e150 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69  The equivalent i
1e160 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f  nstruction.** fo
1e170 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f  r indices is OP_
1e180 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61  IdxInsert..*/.ca
1e190 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20 7b 0a  se OP_Insert: {.
1e1a0 20 20 4d 65 6d 20 2a 70 44 61 74 61 3b 0a 20 20    Mem *pData;.  
1e1b0 4d 65 6d 20 2a 70 4b 65 79 3b 0a 20 20 69 36 34  Mem *pKey;.  i64
1e1c0 20 69 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20   iKey;   /* The 
1e1d0 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f 72  integer ROWID or
1e1e0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 65 63   key for the rec
1e1f0 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
1e200 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  ed */.  int i;. 
1e210 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
1e220 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 0a 20 20  .  int nZero;.  
1e230 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a  int seekResult;.
1e240 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1e250 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
1e260 2a 7a 54 62 6c 3b 0a 20 20 69 6e 74 20 6f 70 3b  *zTbl;.  int op;
1e270 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 70 2d 3e  ..  pData = &p->
1e280 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
1e290 20 70 4b 65 79 20 3d 20 26 70 2d 3e 61 4d 65 6d   pKey = &p->aMem
1e2a0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 20 3d  [pOp->p3];.  i =
1e2b0 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65   pOp->p1;.  asse
1e2c0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
1e2d0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
1e2e0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
1e2f0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1e300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
1e310 3e 70 43 75 72 73 6f 72 21 3d 30 20 7c 7c 20 70  >pCursor!=0 || p
1e320 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29  C->pseudoTable )
1e330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1e340 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1e350 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1e360 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
1e370 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
1e380 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a  Op->p2, pData);.
1e390 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
1e3a0 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b  (pOp->p3, pKey);
1e3b0 0a 0a 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f  ..  iKey = intTo
1e3c0 4b 65 79 28 70 4b 65 79 2d 3e 75 2e 69 29 3b 0a  Key(pKey->u.i);.
1e3d0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
1e3e0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
1e3f0 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
1e400 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f   if( pOp->p5 & O
1e410 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20  PFLAG_LASTROWID 
1e420 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ) db->lastRowid 
1e430 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 69  = pKey->u.i;.  i
1e440 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20  f( pData->flags 
1e450 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
1e460 20 20 70 44 61 74 61 2d 3e 7a 20 3d 20 30 3b 0a    pData->z = 0;.
1e470 20 20 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20 30      pData->n = 0
1e480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1e490 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c  ssert( pData->fl
1e4a0 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
1e4b0 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 7d 0a  MEM_Str) );.  }.
1e4c0 20 20 69 66 28 20 70 43 2d 3e 70 73 65 75 64 6f    if( pC->pseudo
1e4d0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1e4e0 20 21 70 43 2d 3e 65 70 68 65 6d 50 73 65 75 64   !pC->ephemPseud
1e4f0 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  oTable ){.      
1e500 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e510 2c 20 70 43 2d 3e 70 44 61 74 61 29 3b 0a 20 20  , pC->pData);.  
1e520 20 20 7d 0a 20 20 20 20 70 43 2d 3e 69 4b 65 79    }.    pC->iKey
1e530 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20 70 43 2d   = iKey;.    pC-
1e540 3e 6e 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e  >nData = pData->
1e550 6e 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  n;.    if( pData
1e560 2d 3e 7a 3d 3d 70 44 61 74 61 2d 3e 7a 4d 61 6c  ->z==pData->zMal
1e570 6c 6f 63 20 7c 7c 20 70 43 2d 3e 65 70 68 65 6d  loc || pC->ephem
1e580 50 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20  PseudoTable ){. 
1e590 20 20 20 20 20 70 43 2d 3e 70 44 61 74 61 20 3d       pC->pData =
1e5a0 20 70 44 61 74 61 2d 3e 7a 3b 0a 20 20 20 20 20   pData->z;.     
1e5b0 20 69 66 28 20 21 70 43 2d 3e 65 70 68 65 6d 50   if( !pC->ephemP
1e5c0 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20  seudoTable ){.  
1e5d0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 66 6c 61        pData->fla
1e5e0 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b 0a  gs &= ~MEM_Dyn;.
1e5f0 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 66          pData->f
1e600 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 45 70 68 65  lags |= MEM_Ephe
1e610 6d 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61  m;.        pData
1e620 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
1e630 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1e640 7b 0a 20 20 20 20 20 20 70 43 2d 3e 70 44 61 74  {.      pC->pDat
1e650 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  a = sqlite3Mallo
1e660 63 28 20 70 43 2d 3e 6e 44 61 74 61 2b 32 20 29  c( pC->nData+2 )
1e670 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 2d  ;.      if( !pC-
1e680 3e 70 44 61 74 61 20 29 20 67 6f 74 6f 20 6e 6f  >pData ) goto no
1e690 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  _mem;.      memc
1e6a0 70 79 28 70 43 2d 3e 70 44 61 74 61 2c 20 70 44  py(pC->pData, pD
1e6b0 61 74 61 2d 3e 7a 2c 20 70 43 2d 3e 6e 44 61 74  ata->z, pC->nDat
1e6c0 61 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 70 44  a);.      pC->pD
1e6d0 61 74 61 5b 70 43 2d 3e 6e 44 61 74 61 5d 20 3d  ata[pC->nData] =
1e6e0 20 30 3b 0a 20 20 20 20 20 20 70 43 2d 3e 70 44   0;.      pC->pD
1e6f0 61 74 61 5b 70 43 2d 3e 6e 44 61 74 61 2b 31 5d  ata[pC->nData+1]
1e700 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1e710 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
1e720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 65  .  }else{.    se
1e730 65 6b 52 65 73 75 6c 74 20 3d 20 28 28 70 4f 70  ekResult = ((pOp
1e740 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53  ->p5 & OPFLAG_US
1e750 45 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70  ESEEKRESULT) ? p
1e760 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20  C->seekResult : 
1e770 30 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  0);.    if( pDat
1e780 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  a->flags & MEM_Z
1e790 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65  ero ){.      nZe
1e7a0 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a  ro = pData->u.nZ
1e7b0 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ero;.    }else{.
1e7c0 20 20 20 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b        nZero = 0;
1e7d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1e7e0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1e7f0 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73 6f  Rowid(pC->pCurso
1e800 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  r, 0);.    rc = 
1e810 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1e820 72 74 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  rt(pC->pCursor, 
1e830 30 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20  0, iKey,.       
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 70 44 61 74 61 2d 3e 7a 2c 20 70       pData->z, p
1e860 44 61 74 61 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c 0a  Data->n, nZero,.
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
1e890 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 50 50  >p5 & OPFLAG_APP
1e8a0 45 4e 44 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a  END, seekResult.
1e8b0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20      );.  }.  .  
1e8c0 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1e8d0 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 64 65 66 65   = 0;.  pC->defe
1e8e0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
1e8f0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1e900 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1e910 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
1e920 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e update-hook if
1e930 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
1e940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e950 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65  K && db->xUpdate
1e960 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d  Callback && pOp-
1e970 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 7a 44 62  >p4.z ){.    zDb
1e980 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69   = db->aDb[pC->i
1e990 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7a  Db].zName;.    z
1e9a0 54 62 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  Tbl = pOp->p4.z;
1e9b0 0a 20 20 20 20 6f 70 20 3d 20 28 28 70 4f 70 2d  .    op = ((pOp-
1e9c0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  >p5 & OPFLAG_ISU
1e9d0 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f  PDATE) ? SQLITE_
1e9e0 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f  UPDATE : SQLITE_
1e9f0 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 61 73 73  INSERT);.    ass
1ea00 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
1ea10 20 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64   );.    db->xUpd
1ea20 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
1ea30 70 55 70 64 61 74 65 41 72 67 2c 20 6f 70 2c 20  pUpdateArg, op, 
1ea40 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29  zDb, zTbl, iKey)
1ea50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1ea60 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a  ->iDb>=0 );.  }.
1ea70 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1ea80 70 63 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31  pcode: Delete P1
1ea90 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a   P2 * P4 *.**.**
1eaa0 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f   Delete the reco
1eab0 72 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20  rd at which the 
1eac0 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72  P1 cursor is cur
1ead0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1eae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  .**.** The curso
1eaf0 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  r will be left p
1eb00 6f 69 6e 74 69 6e 67 20 61 74 20 65 69 74 68 65  ointing at eithe
1eb10 72 20 74 68 65 20 6e 65 78 74 20 6f 72 20 74 68  r the next or th
1eb20 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 72 65  e previous.** re
1eb30 63 6f 72 64 20 69 6e 20 74 68 65 20 74 61 62 6c  cord in the tabl
1eb40 65 2e 20 49 66 20 69 74 20 69 73 20 6c 65 66 74  e. If it is left
1eb50 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
1eb60 20 6e 65 78 74 20 72 65 63 6f 72 64 2c 20 74 68   next record, th
1eb70 65 6e 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 4e  en.** the next N
1eb80 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1eb90 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 2e  will be a no-op.
1eba0 20 20 48 65 6e 63 65 20 69 74 20 69 73 20 4f 4b    Hence it is OK
1ebb0 20 74 6f 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20   to delete.** a 
1ebc0 72 65 63 6f 72 64 20 66 72 6f 6d 20 77 69 74 68  record from with
1ebd0 69 6e 20 61 6e 20 4e 65 78 74 20 6c 6f 6f 70 2e  in an Next loop.
1ebe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
1ebf0 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61  FLAG_NCHANGE fla
1ec00 67 20 6f 66 20 50 32 20 69 73 20 73 65 74 2c 20  g of P2 is set, 
1ec10 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63 68 61  then the row cha
1ec20 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20  nge count is.** 
1ec30 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f 74 68  incremented (oth
1ec40 65 72 77 69 73 65 20 6e 6f 74 29 2e 0a 2a 2a 0a  erwise not)..**.
1ec50 2a 2a 20 50 31 20 6d 75 73 74 20 6e 6f 74 20 62  ** P1 must not b
1ec60 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  e pseudo-table. 
1ec70 20 49 74 20 68 61 73 20 74 6f 20 62 65 20 61 20   It has to be a 
1ec80 72 65 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  real table with.
1ec90 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ** multiple rows
1eca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73  ..**.** If P4 is
1ecb0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
1ecc0 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  it is the name o
1ecd0 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
1ece0 20 50 31 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69   P1 is.** pointi
1ecf0 6e 67 20 74 6f 2e 20 20 54 68 65 20 75 70 64 61  ng to.  The upda
1ed00 74 65 20 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20  te hook will be 
1ed10 69 6e 76 6f 6b 65 64 2c 20 69 66 20 69 74 20 65  invoked, if it e
1ed20 78 69 73 74 73 2e 0a 2a 2a 20 49 66 20 50 34 20  xists..** If P4 
1ed30 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
1ed40 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   the P1 cursor m
1ed50 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 70 6f  ust have been po
1ed60 73 69 74 69 6f 6e 65 64 0a 2a 2a 20 75 73 69 6e  sitioned.** usin
1ed70 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72  g OP_NotFound pr
1ed80 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1ed90 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  this opcode..*/.
1eda0 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20  case OP_Delete: 
1edb0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 36 34  {.  int i;.  i64
1edc0 20 69 4b 65 79 3b 0a 20 20 56 64 62 65 43 75 72   iKey;.  VdbeCur
1edd0 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 69 20 3d 20  sor *pC;..  i = 
1ede0 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 4b 65 79 20  pOp->p1;.  iKey 
1edf0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1ee00 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72  >=0 && i<p->nCur
1ee10 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1ee20 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73  >apCsr[i];.  ass
1ee30 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1ee40 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43 75 72  assert( pC->pCur
1ee50 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a 20 4f 6e  sor!=0 );  /* On
1ee60 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 72 65 61  ly valid for rea
1ee70 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20 70 73 65  l tables, no pse
1ee80 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  udotables */..  
1ee90 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65  /* If the update
1eea0 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e  -hook will be in
1eeb0 76 6f 6b 65 64 2c 20 73 65 74 20 69 4b 65 79 20  voked, set iKey 
1eec0 74 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  to the rowid of 
1eed0 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 62 65 69  the.  ** row bei
1eee0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a 2f  ng deleted..  */
1eef0 0a 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64 61  .  if( db->xUpda
1ef00 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f  teCallback && pO
1ef10 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 61  p->p4.z ){.    a
1ef20 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
1ef30 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  le );.    assert
1ef40 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c  ( pC->rowidIsVal
1ef50 69 64 20 29 3b 20 20 2f 2a 20 6c 61 73 74 52 6f  id );  /* lastRo
1ef60 77 69 64 20 73 65 74 20 62 79 20 70 72 65 76 69  wid set by previ
1ef70 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  ous OP_NotFound 
1ef80 2a 2f 0a 20 20 20 20 69 4b 65 79 20 3d 20 70 43  */.    iKey = pC
1ef90 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 7d  ->lastRowid;.  }
1efa0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1efb0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
1efc0 28 70 43 29 3b 0a 20 20 69 66 28 20 72 63 20 29  (pC);.  if( rc )
1efd0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1efe0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 73 71 6c 69  to_error;.  sqli
1eff0 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1f000 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73  dRowid(pC->pCurs
1f010 6f 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  or, 0);.  rc = s
1f020 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
1f030 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  e(pC->pCursor);.
1f040 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1f050 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1f060 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
1f070 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e update-hook if
1f080 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
1f090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f0a0 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65  K && db->xUpdate
1f0b0 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d  Callback && pOp-
1f0c0 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 63 6f 6e  >p4.z ){.    con
1f0d0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1f0e0 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e  b->aDb[pC->iDb].
1f0f0 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
1f100 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 4f   char *zTbl = pO
1f110 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 64 62 2d  p->p4.z;.    db-
1f120 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
1f130 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c  (db->pUpdateArg,
1f140 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
1f150 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29  zDb, zTbl, iKey)
1f160 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1f170 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a  ->iDb>=0 );.  }.
1f180 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20    if( pOp->p2 & 
1f190 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
1f1a0 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
1f1b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1f1c0 63 6f 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74  code: ResetCount
1f1d0 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   P1 * *.**.** Th
1f1e0 69 73 20 6f 70 63 6f 64 65 20 72 65 73 65 74 73  is opcode resets
1f1f0 20 74 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61   the VMs interna
1f200 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  l change counter
1f210 20 74 6f 20 30 2e 20 49 66 20 50 31 20 69 73 20   to 0. If P1 is 
1f220 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  true,.** then th
1f230 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1f240 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
1f250 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64   copied to the d
1f260 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
1f270 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
1f280 20 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75   (returned by su
1f290 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1f2a0 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  o sqlite3_change
1f2b0 73 28 29 29 0a 2a 2a 20 62 65 66 6f 72 65 20 69  s()).** before i
1f2c0 74 20 69 73 20 72 65 73 65 74 2e 20 54 68 69 73  t is reset. This
1f2d0 20 69 73 20 75 73 65 64 20 62 79 20 74 72 69 67   is used by trig
1f2e0 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 2a 2f  ger programs..*/
1f2f0 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74 43 6f  .case OP_ResetCo
1f300 75 6e 74 3a 20 7b 0a 20 20 69 66 28 20 70 4f 70  unt: {.  if( pOp
1f310 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->p1 ){.    sqli
1f320 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
1f330 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
1f340 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 68 61  );.  }.  p->nCha
1f350 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  nge = 0;.  break
1f360 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1f370 52 6f 77 44 61 74 61 20 50 31 20 50 32 20 2a 20  RowData P1 P2 * 
1f380 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
1f390 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
1f3a0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f   the complete ro
1f3b0 77 20 64 61 74 61 20 66 6f 72 20 63 75 72 73 6f  w data for curso
1f3c0 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69  r P1..** There i
1f3d0 73 20 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74  s no interpretat
1f3e0 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e  ion of the data.
1f3f0 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74    .** It is just
1f400 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65   copied onto the
1f410 20 50 32 20 72 65 67 69 73 74 65 72 20 65 78 61   P2 register exa
1f420 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69  ctly as .** it i
1f430 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
1f440 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1f450 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75  .** If the P1 cu
1f460 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69  rsor must be poi
1f470 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
1f480 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c   row (not a NULL
1f490 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65   row).** of a re
1f4a0 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
1f4b0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f  pseudo-table..*/
1f4c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 4b  ./* Opcode: RowK
1f4d0 65 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ey P1 P2 * * *.*
1f4e0 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20  *.** Write into 
1f4f0 72 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20  register P2 the 
1f500 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 6b 65 79  complete row key
1f510 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a   for cursor P1..
1f520 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69  ** There is no i
1f530 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66  nterpretation of
1f540 20 74 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20   the data.  .** 
1f550 54 68 65 20 6b 65 79 20 69 73 20 63 6f 70 69 65  The key is copie
1f560 64 20 6f 6e 74 6f 20 74 68 65 20 50 33 20 72 65  d onto the P3 re
1f570 67 69 73 74 65 72 20 65 78 61 63 74 6c 79 20 61  gister exactly a
1f580 73 20 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e  s .** it is foun
1f590 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
1f5a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1f5b0 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   the P1 cursor m
1f5c0 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ust be pointing 
1f5d0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 28  to a valid row (
1f5e0 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a  not a NULL row).
1f5f0 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61 62  ** of a real tab
1f600 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f  le, not a pseudo
1f610 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20  -table..*/.case 
1f620 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63 61 73 65 20  OP_RowKey:.case 
1f630 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20  OP_RowData: {.  
1f640 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 43 75 72  int i;.  VdbeCur
1f650 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72  sor *pC;.  BtCur
1f660 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75 33  sor *pCrsr;.  u3
1f670 32 20 6e 3b 0a 20 20 69 36 34 20 6e 36 34 3b 0a  2 n;.  i64 n64;.
1f680 0a 20 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  .  i = pOp->p1;.
1f690 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65    pOut = &p->aMe
1f6a0 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 0a 20 20 2f  m[pOp->p2];..  /
1f6b0 2a 20 4e 6f 74 65 20 74 68 61 74 20 52 6f 77 4b  * Note that RowK
1f6c0 65 79 20 61 6e 64 20 52 6f 77 44 61 74 61 20 61  ey and RowData a
1f6d0 72 65 20 72 65 61 6c 6c 79 20 65 78 61 63 74 6c  re really exactl
1f6e0 79 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 72  y the same instr
1f6f0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65  uction */.  asse
1f700 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
1f710 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
1f720 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
1f730 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
1f740 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70  Table || pOp->op
1f750 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 4b 65 79 20  code==OP_RowKey 
1f760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
1f770 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70 4f 70 2d  >isIndex || pOp-
1f780 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 44  >opcode==OP_RowD
1f790 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
1f7a0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
1f7b0 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d  rt( pC->nullRow=
1f7c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f7d0 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 3d  pC->pseudoTable=
1f7e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f7f0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  pC->pCursor!=0 )
1f800 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
1f810 70 43 75 72 73 6f 72 3b 0a 20 20 72 63 20 3d 20  pCursor;.  rc = 
1f820 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
1f830 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69  rMoveto(pC);.  i
1f840 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1f850 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1f860 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64  .  if( pC->isInd
1f870 65 78 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ex ){.    assert
1f880 28 20 21 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  ( !pC->isTable )
1f890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1f8a0 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c  eeKeySize(pCrsr,
1f8b0 20 26 6e 36 34 29 3b 0a 20 20 20 20 69 66 28 20   &n64);.    if( 
1f8c0 6e 36 34 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  n64>db->aLimit[S
1f8d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
1f8e0 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  TH] ){.      got
1f8f0 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d  o too_big;.    }
1f900 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 6e 36  .    n = (u32)n6
1f910 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
1f920 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1f930 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29 3b  Size(pCrsr, &n);
1f940 0a 20 20 20 20 69 66 28 20 6e 3e 28 75 33 32 29  .    if( n>(u32)
1f950 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1f960 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
1f970 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f  ){.      goto to
1f980 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  o_big;.    }.  }
1f990 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
1f9a0 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20  beMemGrow(pOut, 
1f9b0 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  n, 0) ){.    got
1f9c0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
1f9d0 70 4f 75 74 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 4d  pOut->n = n;.  M
1f9e0 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
1f9f0 75 74 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20  ut, MEM_Blob);. 
1fa00 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78   if( pC->isIndex
1fa10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1fa20 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 72  ite3BtreeKey(pCr
1fa30 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e  sr, 0, n, pOut->
1fa40 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1fa50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1fa60 65 65 44 61 74 61 28 70 43 72 73 72 2c 20 30 2c  eeData(pCrsr, 0,
1fa70 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20   n, pOut->z);.  
1fa80 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  }.  pOut->enc = 
1fa90 53 51 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a  SQLITE_UTF8;  /*
1faa0 20 49 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f   In case the blo
1fab0 62 20 69 73 20 65 76 65 72 20 63 61 73 74 20 74  b is ever cast t
1fac0 6f 20 74 65 78 74 20 2a 2f 0a 20 20 55 50 44 41  o text */.  UPDA
1fad0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
1fae0 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
1faf0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
1fb00 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  wid P1 P2 * * *.
1fb10 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72  **.** Store in r
1fb20 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
1fb30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1fb40 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61  he key of the ta
1fb50 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74 0a 2a  ble entry that.*
1fb60 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  * P1 is currentl
1fb70 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a  y point to..**.*
1fb80 2a 20 50 31 20 63 61 6e 20 62 65 20 65 69 74 68  * P1 can be eith
1fb90 65 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  er an ordinary t
1fba0 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61  able or a virtua
1fbb0 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 72 65 20  l table.  There 
1fbc0 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20 61 20  used to.** be a 
1fbd0 73 65 70 61 72 61 74 65 20 4f 50 5f 56 52 6f 77  separate OP_VRow
1fbe0 69 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 75 73  id opcode for us
1fbf0 65 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74  e with virtual t
1fc00 61 62 6c 65 73 2c 20 62 75 74 20 74 68 69 73 0a  ables, but this.
1fc10 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65 20 6e 6f  ** one opcode no
1fc20 77 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  w works for both
1fc30 20 74 61 62 6c 65 20 74 79 70 65 73 2e 0a 2a 2f   table types..*/
1fc40 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a 20  .case OP_Rowid: 
1fc50 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1fc60 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
1fc70 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ease */.  int i;
1fc80 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1fc90 43 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71  C;.  i64 v;.  sq
1fca0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
1fcb0 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
1fcc0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
1fcd0 6c 65 3b 0a 0a 20 20 69 20 3d 20 70 4f 70 2d 3e  le;..  i = pOp->
1fce0 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  p1;.  assert( i>
1fcf0 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73  =0 && i<p->nCurs
1fd00 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
1fd10 61 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73 65  apCsr[i];.  asse
1fd20 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69  rt( pC!=0 );.  i
1fd30 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29  f( pC->nullRow )
1fd40 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  {.    /* Do noth
1fd50 69 6e 67 20 73 6f 20 74 68 61 74 20 72 65 67 5b  ing so that reg[
1fd60 50 32 5d 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c  P2] remains NULL
1fd70 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20   */.    break;. 
1fd80 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64   }else if( pC->d
1fd90 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
1fda0 0a 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76  .    v = pC->mov
1fdb0 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 7d 65 6c  etoTarget;.  }el
1fdc0 73 65 20 69 66 28 20 70 43 2d 3e 70 73 65 75 64  se if( pC->pseud
1fdd0 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 76 20  oTable ){.    v 
1fde0 3d 20 6b 65 79 54 6f 49 6e 74 28 70 43 2d 3e 69  = keyToInt(pC->i
1fdf0 4b 65 79 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Key);.#ifndef SQ
1fe00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1fe10 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65 20 69  LTABLE.  }else i
1fe20 66 28 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73  f( pC->pVtabCurs
1fe30 6f 72 20 29 7b 0a 20 20 20 20 70 56 74 61 62 20  or ){.    pVtab 
1fe40 3d 20 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f  = pC->pVtabCurso
1fe50 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70 4d  r->pVtab;.    pM
1fe60 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
1fe70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73 65  Module;.    asse
1fe80 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f  rt( pModule->xRo
1fe90 77 69 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73  wid );.    if( s
1fea0 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
1feb0 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  db) ) goto abort
1fec0 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a  _due_to_misuse;.
1fed0 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
1fee0 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 70 56 74  ->xRowid(pC->pVt
1fef0 61 62 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20  abCursor, &v);. 
1ff00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1ff10 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
1ff20 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
1ff30 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73   = pVtab->zErrMs
1ff40 67 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45  g;.    pVtab->zE
1ff50 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
1ff60 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
1ff70 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62  On(db) ) goto ab
1ff80 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73  ort_due_to_misus
1ff90 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  e;.#endif /* SQL
1ffa0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1ffb0 54 41 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c 73 65  TABLE */.  }else
1ffc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1ffd0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
1ffe0 74 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20  to(pC);.    if( 
1fff0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
20000 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
20010 20 20 69 66 28 20 70 43 2d 3e 72 6f 77 69 64 49    if( pC->rowidI
20020 73 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  sValid ){.      
20030 76 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69  v = pC->lastRowi
20040 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
20050 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
20060 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
20070 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20080 4b 65 79 53 69 7a 65 28 70 43 2d 3e 70 43 75 72  KeySize(pC->pCur
20090 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  sor, &v);.      
200a0 76 20 3d 20 6b 65 79 54 6f 49 6e 74 28 76 29 3b  v = keyToInt(v);
200b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75  .    }.  }.  pOu
200c0 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 4d 65  t->u.i = v;.  Me
200d0 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
200e0 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62  t, MEM_Int);.  b
200f0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
20100 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a  de: NullRow P1 *
20110 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76   * * *.**.** Mov
20120 65 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  e the cursor P1 
20130 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20  to a null row.  
20140 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  Any OP_Column op
20150 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  erations.** that
20160 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68 65   occur while the
20170 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74 68   cursor is on th
20180 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20  e null row will 
20190 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65 20  always.** write 
201a0 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  a NULL..*/.case 
201b0 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20  OP_NullRow: {.  
201c0 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 43 75 72  int i;.  VdbeCur
201d0 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 69 20 3d 20  sor *pC;..  i = 
201e0 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72  pOp->p1;.  asser
201f0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
20200 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
20210 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
20220 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
20230 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
20240 3d 20 31 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64  = 1;.  pC->rowid
20250 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 69  IsValid = 0;.  i
20260 66 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 20 29  f( pC->pCursor )
20270 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
20280 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
20290 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
202a0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
202b0 70 63 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50  pcode: Last P1 P
202c0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
202d0 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68  e next use of th
202e0 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d  e Rowid or Colum
202f0 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75  n or Next instru
20300 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a  ction for P1 .**
20310 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74   will refer to t
20320 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
20330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
20340 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
20350 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   If the table or
20360 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
20370 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a  and P2>0, then j
20380 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
20390 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20  to P2..** If P2 
203a0 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74  is 0 or if the t
203b0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
203c0 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
203d0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
203e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
203f0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
20400 65 20 4f 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20  e OP_Last: {    
20410 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
20420 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 43 75   int i;.  VdbeCu
20430 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
20440 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
20450 6e 74 20 72 65 73 3b 0a 0a 20 20 69 20 3d 20 70  nt res;..  i = p
20460 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74  Op->p1;.  assert
20470 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
20480 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
20490 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
204a0 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
204b0 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70  .  pCrsr = pC->p
204c0 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
204d0 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20  ( pCrsr!=0 );.  
204e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
204f0 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72 65  eLast(pCrsr, &re
20500 73 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  s);.  pC->nullRo
20510 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70  w = (u8)res;.  p
20520 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
20530 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 72 6f 77  o = 0;.  pC->row
20540 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20  idIsValid = 0;. 
20550 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
20560 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
20570 20 20 69 66 28 20 72 65 73 20 26 26 20 70 4f 70    if( res && pOp
20580 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 70 63  ->p2>0 ){.    pc
20590 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
205a0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
205b0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74  ./* Opcode: Sort
205c0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
205d0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64  ** This opcode d
205e0 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68 65 20  oes exactly the 
205f0 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 4f 50  same thing as OP
20600 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74 20 74  _Rewind except t
20610 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65 6d  hat.** it increm
20620 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d 65  ents an undocume
20630 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69  nted global vari
20640 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65  able used for te
20650 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72  sting..**.** Sor
20660 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  ting is accompli
20670 73 68 65 64 20 62 79 20 77 72 69 74 69 6e 67 20  shed by writing 
20680 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 20 73  records into a s
20690 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a  orting index,.**
206a0 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e 67 20   then rewinding 
206b0 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20 70  that index and p
206c0 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 20 66  laying it back f
206d0 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  rom beginning to
206e0 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75 73 65  .** end.  We use
206f0 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70 63   the OP_Sort opc
20700 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66 20 4f  ode instead of O
20710 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f 20 74  P_Rewind to do t
20720 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67 20  he.** rewinding 
20730 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  so that the glob
20740 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69 6c 6c  al variable will
20750 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   be incremented 
20760 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73 69 6f  and.** regressio
20770 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65 74 65  n tests can dete
20780 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
20790 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d 69 7a   not the optimiz
207a0 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63 74  er is.** correct
207b0 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f 75  ly optimizing ou
207c0 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73 65  t sorts..*/.case
207d0 20 4f 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20   OP_Sort: {     
207e0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69     /* jump */.#i
207f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
20800 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  .  sqlite3_sort_
20810 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
20820 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d  e3_search_count-
20830 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61  -;.#endif.  p->a
20840 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
20850 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2d 31  TMTSTATUS_SORT-1
20860 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  ]++;.  /* Fall t
20870 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 52  hrough into OP_R
20880 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70  ewind */.}./* Op
20890 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50 31 20  code: Rewind P1 
208a0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
208b0 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74  he next use of t
208c0 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75  he Rowid or Colu
208d0 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72  mn or Next instr
208e0 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a  uction for P1 .*
208f0 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20  * will refer to 
20900 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
20910 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20920 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a  table or index..
20930 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
20940 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74  or index is empt
20950 79 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e  y and P2>0, then
20960 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
20970 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50  y to P2..** If P
20980 32 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65  2 is 0 or if the
20990 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
209a0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61  is not empty, fa
209b0 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
209c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
209d0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
209e0 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b  ase OP_Rewind: {
209f0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
20a00 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  */.  int i;.  Vd
20a10 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
20a20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
20a30 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 69  .  int res;..  i
20a40 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73   = pOp->p1;.  as
20a50 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
20a60 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
20a70 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
20a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
20a90 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 72 73  0 );.  if( (pCrs
20aa0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 29  r = pC->pCursor)
20ab0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
20ac0 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
20ad0 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
20ae0 20 20 20 20 70 43 2d 3e 61 74 46 69 72 73 74 20      pC->atFirst 
20af0 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20  = res==0 ?1:0;. 
20b00 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
20b10 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
20b20 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
20b30 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
20b40 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c    pC->rowidIsVal
20b50 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  id = 0;.  }else{
20b60 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20  .    res = 1;.  
20b70 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  }.  pC->nullRow 
20b80 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73  = (u8)res;.  ass
20b90 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26  ert( pOp->p2>0 &
20ba0 26 20 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  & pOp->p2<p->nOp
20bb0 20 29 3b 0a 20 20 69 66 28 20 72 65 73 20 29 7b   );.  if( res ){
20bc0 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70  .    pc = pOp->p
20bd0 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  2 - 1;.  }.  bre
20be0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
20bf0 3a 20 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a  : Next P1 P2 * *
20c00 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65   *.**.** Advance
20c10 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
20c20 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
20c30 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74  the next key/dat
20c40 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a  a pair in its.**
20c50 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
20c60 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
20c70 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65  o more key/value
20c80 20 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c   pairs then fall
20c90 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
20ca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
20cb0 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69  truction.  But i
20cc0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 64 76  f the cursor adv
20cd0 61 6e 63 65 20 77 61 73 20 73 75 63 63 65 73 73  ance was success
20ce0 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d  ful,.** jump imm
20cf0 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
20d00 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72  **.** The P1 cur
20d10 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20  sor must be for 
20d20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f  a real table, no
20d30 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
20d40 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
20d50 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f 70 63  : Prev.*/./* Opc
20d60 6f 64 65 3a 20 50 72 65 76 20 50 31 20 50 32 20  ode: Prev P1 P2 
20d70 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 61 63 6b  * * *.**.** Back
20d80 20 75 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f   up cursor P1 so
20d90 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
20da0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
20db0 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e  key/data pair in
20dc0 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72   its.** table or
20dd0 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72   index.  If ther
20de0 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73  e is no previous
20df0 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73   key/value pairs
20e00 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
20e10 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
20e20 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
20e30 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  on.  But if the 
20e40 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61  cursor backup wa
20e50 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
20e60 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
20e70 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  y to P2..**.** T
20e80 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
20e90 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20  t be for a real 
20ea0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
20eb0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  udo-table..*/.ca
20ec0 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20  se OP_Prev:     
20ed0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
20ee0 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b 20  case OP_Next: { 
20ef0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
20f00 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
20f10 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
20f20 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
20f30 3b 0a 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49  ;..  CHECK_FOR_I
20f40 4e 54 45 52 52 55 50 54 3b 0a 20 20 61 73 73 65  NTERRUPT;.  asse
20f50 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
20f60 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
20f70 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
20f80 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
20f90 3b 0a 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b  ;.  if( pC==0 ){
20fa0 0a 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20  .    break;  /* 
20fb0 53 65 65 20 74 69 63 6b 65 74 20 23 32 32 37 33  See ticket #2273
20fc0 20 2a 2f 0a 20 20 7d 0a 20 20 70 43 72 73 72 20   */.  }.  pCrsr 
20fd0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
20fe0 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29   assert( pCrsr )
20ff0 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 61  ;.  res = 1;.  a
21000 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
21010 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
21020 20 20 72 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f    rc = pOp->opco
21030 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 3f 20 73 71  de==OP_Next ? sq
21040 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
21050 43 72 73 72 2c 20 26 72 65 73 29 20 3a 0a 20 20  Crsr, &res) :.  
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21080 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
21090 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20  (pCrsr, &res);. 
210a0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28   pC->nullRow = (
210b0 75 38 29 72 65 73 3b 0a 20 20 70 43 2d 3e 63 61  u8)res;.  pC->ca
210c0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
210d0 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 72  E_STALE;.  if( r
210e0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70 63 20  es==0 ){.    pc 
210f0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
21100 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29     if( pOp->p5 )
21110 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70 4f 70   p->aCounter[pOp
21120 2d 3e 70 35 2d 31 5d 2b 2b 3b 0a 23 69 66 64 65  ->p5-1]++;.#ifde
21130 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21140 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
21150 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
21160 0a 20 20 7d 0a 20 20 70 43 2d 3e 72 6f 77 69 64  .  }.  pC->rowid
21170 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 62  IsValid = 0;.  b
21180 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
21190 64 65 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31  de: IdxInsert P1
211a0 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a   P2 P3 * P5.**.*
211b0 2a 20 52 65 67 69 73 74 65 72 20 50 32 20 68 6f  * Register P2 ho
211c0 6c 64 73 20 61 20 53 51 4c 20 69 6e 64 65 78 20  lds a SQL index 
211d0 6b 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74  key made using t
211e0 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64  he.** MakeRecord
211f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
21200 54 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74  This opcode writ
21210 65 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69  es that key.** i
21220 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50 31  nto the index P1
21230 2e 20 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  .  Data for the 
21240 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a  entry is nil..**
21250 0a 2a 2a 20 50 33 20 69 73 20 61 20 66 6c 61 67  .** P3 is a flag
21260 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
21270 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62 2d 74   hint to the b-t
21280 72 65 65 20 6c 61 79 65 72 20 74 68 61 74 20 74  ree layer that t
21290 68 69 73 0a 2a 2a 20 69 6e 73 65 72 74 20 69 73  his.** insert is
212a0 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e   likely to be an
212b0 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54   append..**.** T
212c0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
212d0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 69  only works for i
212e0 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65 71 75  ndices.  The equ
212f0 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75 63 74  ivalent instruct
21300 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62 6c 65  ion.** for table
21310 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74 2e 0a  s is OP_Insert..
21320 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e  */.case OP_IdxIn
21330 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  sert: {        /
21340 2a 20 69 6e 32 20 2a 2f 0a 20 20 69 6e 74 20 69  * in2 */.  int i
21350 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
21360 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
21370 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 6e 4b 65  pCrsr;.  int nKe
21380 79 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  y;.  const char 
21390 2a 7a 4b 65 79 3b 0a 0a 20 20 69 20 3d 20 70 4f  *zKey;..  i = pO
213a0 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28  p->p1;.  assert(
213b0 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43   i>=0 && i<p->nC
213c0 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
213d0 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21 3d  t( p->apCsr[i]!=
213e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
213f0 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
21400 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20 28  _Blob );.  if( (
21410 70 43 72 73 72 20 3d 20 28 70 43 20 3d 20 70 2d  pCrsr = (pC = p-
21420 3e 61 70 43 73 72 5b 69 5d 29 2d 3e 70 43 75 72  >apCsr[i])->pCur
21430 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 61  sor)!=0 ){.    a
21440 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
21450 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  le==0 );.    rc 
21460 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  = ExpandBlob(pIn
21470 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  2);.    if( rc==
21480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21490 20 20 20 6e 4b 65 79 20 3d 20 70 49 6e 32 2d 3e     nKey = pIn2->
214a0 6e 3b 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20  n;.      zKey = 
214b0 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 20 20 72  pIn2->z;.      r
214c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
214d0 49 6e 73 65 72 74 28 70 43 72 73 72 2c 20 7a 4b  Insert(pCrsr, zK
214e0 65 79 2c 20 6e 4b 65 79 2c 20 22 22 2c 20 30 2c  ey, nKey, "", 0,
214f0 20 30 2c 20 70 4f 70 2d 3e 70 33 2c 20 0a 20 20   0, pOp->p3, .  
21500 20 20 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70          ((pOp->p
21510 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  5 & OPFLAG_USESE
21520 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e  EKRESULT) ? pC->
21530 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a  seekResult : 0).
21540 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
21550 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72  ssert( pC->defer
21560 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a  redMoveto==0 );.
21570 20 20 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53        pC->cacheS
21580 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
21590 41 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ALE;.    }.  }. 
215a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
215b0 63 6f 64 65 3a 20 49 64 78 44 65 6c 65 74 65 20  code: IdxDelete 
215c0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
215d0 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** The content o
215e0 66 20 50 33 20 72 65 67 69 73 74 65 72 73 20 73  f P3 registers s
215f0 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 69 73  tarting at regis
21600 74 65 72 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61  ter P2 form.** a
21610 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
21620 20 6b 65 79 2e 20 54 68 69 73 20 6f 70 63 6f 64   key. This opcod
21630 65 20 72 65 6d 6f 76 65 73 20 74 68 61 74 20 65  e removes that e
21640 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a  ntry from the .*
21650 2a 20 69 6e 64 65 78 20 6f 70 65 6e 65 64 20 62  * index opened b
21660 79 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a  y cursor P1..*/.
21670 63 61 73 65 20 4f 50 5f 49 64 78 44 65 6c 65 74  case OP_IdxDelet
21680 65 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  e: {.  int i;.  
21690 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
216a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
216b0 72 3b 0a 0a 20 20 69 20 3d 20 70 4f 70 2d 3e 70  r;..  i = pOp->p
216c0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  1;.  assert( pOp
216d0 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p3>0 );.  asse
216e0 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26  rt( pOp->p2>0 &&
216f0 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
21700 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b 0a 20  <=p->nMem+1 );. 
21710 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
21720 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b   i<p->nCursor );
21730 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
21740 43 73 72 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 69  Csr[i]!=0 );.  i
21750 66 28 20 28 70 43 72 73 72 20 3d 20 28 70 43 20  f( (pCrsr = (pC 
21760 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e  = p->apCsr[i])->
21770 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20  pCursor)!=0 ){. 
21780 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
21790 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
217a0 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f  ;.    r.pKeyInfo
217b0 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
217c0 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
217d0 28 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  (u16)pOp->p3;.  
217e0 20 20 72 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20    r.flags = 0;. 
217f0 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 70 2d 3e     r.aMem = &p->
21800 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
21810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21820 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
21830 65 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c  ed(pCrsr, &r, 0,
21840 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
21850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21860 20 26 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20   && res==0 ){.  
21870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21880 42 74 72 65 65 44 65 6c 65 74 65 28 70 43 72 73  BtreeDelete(pCrs
21890 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
218a0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
218b0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
218c0 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
218d0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
218e0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
218f0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  ../* Opcode: Idx
21900 52 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20  Rowid P1 P2 * * 
21910 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  *.**.** Write in
21920 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61  to register P2 a
21930 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
21940 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
21950 79 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  y in the record 
21960 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  at.** the end of
21970 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70   the index key p
21980 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72  ointed to by cur
21990 73 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e  sor P1.  This in
219a0 74 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a  teger should be.
219b0 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ** the rowid of 
219c0 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
219d0 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e  to which this in
219e0 64 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  dex entry points
219f0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
21a00 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63  : Rowid, MakeRec
21a10 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ord..*/.case OP_
21a20 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  IdxRowid: {     
21a30 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
21a40 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
21a50 20 69 6e 74 20 69 3b 0a 20 20 42 74 43 75 72 73   int i;.  BtCurs
21a60 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 56 64 62  or *pCrsr;.  Vdb
21a70 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
21a80 36 34 20 72 6f 77 69 64 3b 0a 0a 20 20 69 20 3d  64 rowid;..  i =
21a90 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65   pOp->p1;.  asse
21aa0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
21ab0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
21ac0 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
21ad0 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ]!=0 );.  if( (p
21ae0 43 72 73 72 20 3d 20 28 70 43 20 3d 20 70 2d 3e  Crsr = (pC = p->
21af0 61 70 43 73 72 5b 69 5d 29 2d 3e 70 43 75 72 73  apCsr[i])->pCurs
21b00 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  or)!=0 ){.    rc
21b10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21b20 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a  rsorMoveto(pC);.
21b30 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
21b40 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
21b50 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
21b60 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
21b70 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61  veto==0 );.    a
21b80 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
21b90 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  le==0 );.    if(
21ba0 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b   !pC->nullRow ){
21bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21bc0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
21bd0 70 43 72 73 72 2c 20 26 72 6f 77 69 64 29 3b 0a  pCrsr, &rowid);.
21be0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21c00 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
21c10 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
21c20 20 20 7d 0a 20 20 20 20 20 20 4d 65 6d 53 65 74    }.      MemSet
21c30 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
21c40 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 20 20 70  EM_Int);.      p
21c50 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64  Out->u.i = rowid
21c60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
21c70 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
21c80 65 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50  e: IdxGE P1 P2 P
21c90 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
21ca0 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61  e P4 register va
21cb0 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  lues beginning w
21cc0 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75  ith P3 form an u
21cd0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a  npacked index .*
21ce0 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73  * key that omits
21cf0 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d   the ROWID.  Com
21d00 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61  pare this key va
21d10 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  lue against the 
21d20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50  index .** that P
21d30 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  1 is currently p
21d40 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f  ointing to, igno
21d50 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f  ring the ROWID o
21d60 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a  n the P1 index..
21d70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
21d80 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67  index entry is g
21d90 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
21da0 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
21db0 76 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75  value.** then ju
21dc0 6d 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72  mp to P2.  Other
21dd0 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  wise fall throug
21de0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
21df0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
21e00 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65   If P5 is non-ze
21e10 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ro then the key 
21e20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
21e30 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e  ed by an epsilon
21e40 20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68   .** prior to th
21e50 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  e comparison.  T
21e60 68 69 73 20 6d 61 6b 65 20 74 68 65 20 6f 70 63  his make the opc
21e70 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64  ode work like Id
21e80 78 47 54 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  xGT except.** th
21e90 61 74 20 69 66 20 74 68 65 20 6b 65 79 20 66 72  at if the key fr
21ea0 6f 6d 20 72 65 67 69 73 74 65 72 20 50 33 20 69  om register P3 i
21eb0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
21ec0 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72  e key in the cur
21ed0 73 6f 72 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  sor,.** the resu
21ee0 6c 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 72  lt is false wher
21ef0 65 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20  eas it would be 
21f00 74 72 75 65 20 77 69 74 68 20 49 64 78 47 54 2e  true with IdxGT.
21f10 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
21f20 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 2a 20  dxLT P1 P2 P3 * 
21f30 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  P5.**.** The P4 
21f40 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 20  register values 
21f50 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
21f60 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  3 form an unpack
21f70 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79  ed index .** key
21f80 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
21f90 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20  ROWID.  Compare 
21fa0 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
21fb0 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
21fc0 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20   .** that P1 is 
21fd0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
21fe0 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20  ng to, ignoring 
21ff0 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74 68 65  the ROWID on the
22000 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   P1 index..**.**
22010 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78   If the P1 index
22020 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20 74   entry is less t
22030 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
22040 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  e then jump to P
22050 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  2..** Otherwise 
22060 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
22070 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
22080 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tion..**.** If P
22090 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  5 is non-zero th
220a0 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  en the key value
220b0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 62 79   is increased by
220c0 20 61 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69 6f   an epsilon prio
220d0 72 20 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d  r .** to the com
220e0 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73 20 6d  parison.  This m
220f0 61 6b 65 73 20 74 68 65 20 6f 70 63 6f 64 65 20  akes the opcode 
22100 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45 2e  work like IdxLE.
22110 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c  .*/.case OP_IdxL
22120 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  T:          /* j
22130 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
22140 20 4f 50 5f 49 64 78 47 45 3a 20 7b 20 20 20 20   OP_IdxGE: {    
22150 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
22160 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56   */.  int i;.  V
22170 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
22180 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61   int res;.  Unpa
22190 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20  ckedRecord r;.. 
221a0 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20   i = pOp->p1;.  
221b0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
221c0 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  i<p->nCursor );.
221d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
221e0 73 72 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 69 66  sr[i]!=0 );.  if
221f0 28 20 28 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  ( (pC = p->apCsr
22200 5b 69 5d 29 2d 3e 70 43 75 72 73 6f 72 21 3d 30  [i])->pCursor!=0
22210 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22220 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
22230 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  to==0 );.    ass
22240 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
22250 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  || pOp->p5==1 );
22260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
22270 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
22280 33 32 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79  32 );.    r.pKey
22290 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
222a0 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c  nfo;.    r.nFiel
222b0 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34  d = (u16)pOp->p4
222c0 2e 69 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  .i;.    if( pOp-
222d0 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66  >p5 ){.      r.f
222e0 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
222f0 49 4e 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b  INCRKEY | UNPACK
22300 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b  ED_IGNORE_ROWID;
22310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22320 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41    r.flags = UNPA
22330 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49  CKED_IGNORE_ROWI
22340 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61  D;.    }.    r.a
22350 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Mem = &p->aMem[p
22360 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 72 63 20  Op->p3];.    rc 
22370 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  = sqlite3VdbeIdx
22380 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 2c 20 26  KeyCompare(pC, &
22390 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  r, &res);.    if
223a0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
223b0 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20 20  P_IdxLT ){.     
223c0 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 20   res = -res;.   
223d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
223e0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
223f0 65 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  e==OP_IdxGE );. 
22400 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20       res++;.    
22410 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3e 30 20  }.    if( res>0 
22420 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
22430 70 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20 20 20  p->p2 - 1 ;.    
22440 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
22450 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73  ../* Opcode: Des
22460 74 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20  troy P1 P2 P3 * 
22470 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  *.**.** Delete a
22480 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  n entire databas
22490 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
224a0 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
224b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
224c0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65  .** file is give
224d0 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54  n by P1..**.** T
224e0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
224f0 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74  estroyed is in t
22500 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
22510 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20   file if P3==0. 
22520 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65   If.** P3==1 the
22530 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
22540 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
22550 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
22560 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
22570 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
22580 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
22590 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
225a0 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
225b0 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
225c0 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68  UM is enabled th
225d0 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  en it is possibl
225e0 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72  e that another r
225f0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  oot page.** migh
22600 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20  t be moved into 
22610 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65  the newly delete
22620 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f  d root page in o
22630 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c  rder to keep all
22640 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63  .** root pages c
22650 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68 65  ontiguous at the
22660 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
22670 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
22680 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65   former.** value
22690 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   of the root pag
226a0 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69  e that moved - i
226b0 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ts value before 
226c0 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65  the move occurre
226d0 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  d -.** is stored
226e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
226f0 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a 2a    If no page .**
22700 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65   movement was re
22710 71 75 69 72 65 64 20 28 62 65 63 61 75 73 65 20  quired (because 
22720 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
22730 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65  dropped was alre
22740 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73 74  ady .** the last
22750 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61   one in the data
22760 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a 65 72  base) then a zer
22770 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  o is stored in r
22780 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 49  egister P2..** I
22790 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
227a0 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61 20  disabled then a 
227b0 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69  zero is stored i
227c0 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
227d0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
227e0 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lear.*/.case OP_
227f0 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f  Destroy: {     /
22800 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
22810 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76 65  e */.  int iMove
22820 64 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b 0a 20  d;.  int iCnt;. 
22830 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20   Vdbe *pVdbe;.  
22840 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66  int iDb;.#ifndef
22850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
22860 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 43 6e 74  TUALTABLE.  iCnt
22870 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56 64 62   = 0;.  for(pVdb
22880 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56 64  e=db->pVdbe; pVd
22890 62 65 3b 20 70 56 64 62 65 20 3d 20 70 56 64 62  be; pVdbe = pVdb
228a0 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
228b0 66 28 20 70 56 64 62 65 2d 3e 6d 61 67 69 63 3d  f( pVdbe->magic=
228c0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
228d0 26 26 20 70 56 64 62 65 2d 3e 69 6e 56 74 61 62  && pVdbe->inVtab
228e0 4d 65 74 68 6f 64 3c 32 20 26 26 20 70 56 64 62  Method<2 && pVdb
228f0 65 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  e->pc>=0 ){.    
22900 20 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a    iCnt++;.    }.
22910 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43 6e 74    }.#else.  iCnt
22920 20 3d 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62   = db->activeVdb
22930 65 43 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69  eCnt;.#endif.  i
22940 66 28 20 69 43 6e 74 3e 31 20 29 7b 0a 20 20 20  f( iCnt>1 ){.   
22950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
22960 4b 45 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KED;.    p->erro
22970 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
22980 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rt;.  }else{.   
22990 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a   iDb = pOp->p3;.
229a0 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6e 74      assert( iCnt
229b0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
229c0 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
229d0 20 26 20 28 31 3c 3c 69 44 62 29 29 21 3d 30 20   & (1<<iDb))!=0 
229e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
229f0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
22a00 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  e(db->aDb[iDb].p
22a10 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69 4d  Bt, pOp->p1, &iM
22a20 6f 76 65 64 29 3b 0a 20 20 20 20 4d 65 6d 53 65  oved);.    MemSe
22a30 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
22a40 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 70 4f  MEM_Int);.    pO
22a50 75 74 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64  ut->u.i = iMoved
22a60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22a70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22a80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22a90 49 54 45 5f 4f 4b 20 26 26 20 69 4d 6f 76 65 64  ITE_OK && iMoved
22aa0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
22ab0 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
22ac0 64 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2c  d(&db->aDb[iDb],
22ad0 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d 3e 70 31   iMoved, pOp->p1
22ae0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
22af0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
22b00 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72  /* Opcode: Clear
22b10 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20   P1 P2 P3.**.** 
22b20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65  Delete all conte
22b30 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
22b40 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
22b50 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
22b60 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ge.** in the dat
22b70 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69  abase file is gi
22b80 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74 2c  ven by P1.  But,
22b90 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c   unlike Destroy,
22ba0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76   do not.** remov
22bb0 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  e the table or i
22bc0 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64 61  ndex from the da
22bd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
22be0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  ** The table bei
22bf0 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  ng clear is in t
22c00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
22c10 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20   file if P2==0. 
22c20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65   If.** P2==1 the
22c30 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
22c40 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
22c50 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
22c60 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
22c70 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
22c80 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
22c90 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
22ca0 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
22cb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 76  *.** If the P3 v
22cc0 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
22cd0 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  , then the table
22ce0 20 72 65 66 65 72 72 65 64 20 74 6f 20 6d 75 73   referred to mus
22cf0 74 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65  t be an.** intke
22d00 79 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c 20  y table (an SQL 
22d10 74 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e  table, not an in
22d20 64 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63 61  dex). In this ca
22d30 73 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67  se the row chang
22d40 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69  e .** count is i
22d50 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
22d60 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
22d70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   in the table be
22d80 69 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a  ing cleared. .**
22d90 20 49 66 20 50 33 20 69 73 20 67 72 65 61 74 65   If P3 is greate
22da0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
22db0 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  n the value stor
22dc0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
22dd0 33 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63  3 is.** also inc
22de0 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  remented by the 
22df0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
22e00 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  n the table bein
22e10 67 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  g cleared..**.**
22e20 20 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74 72   See also: Destr
22e30 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c  oy.*/.case OP_Cl
22e40 65 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68  ear: {.  int nCh
22e50 61 6e 67 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67  ange;. .  nChang
22e60 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
22e70 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
22e80 20 28 31 3c 3c 70 4f 70 2d 3e 70 32 29 29 21 3d   (1<<pOp->p2))!=
22e90 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
22ea0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
22eb0 6c 65 28 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  le(.      db->aD
22ec0 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20  b[pOp->p2].pBt, 
22ed0 70 4f 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70  pOp->p1, (pOp->p
22ee0 33 20 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20 30  3 ? &nChange : 0
22ef0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  ).  );.  if( pOp
22f00 2d 3e 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  ->p3 ){.    p->n
22f10 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
22f20 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  e;.    if( pOp->
22f30 70 33 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  p3>0 ){.      p-
22f40 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75  >aMem[pOp->p3].u
22f50 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  .i += nChange;. 
22f60 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
22f70 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
22f80 43 72 65 61 74 65 54 61 62 6c 65 20 50 31 20 50  CreateTable P1 P
22f90 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c  2 * * *.**.** Al
22fa0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 74 61 62  locate a new tab
22fb0 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
22fc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
22fd0 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a  P1==0 or in the.
22fe0 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
22ff0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31  abase file if P1
23000 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 74  ==1 or in an att
23010 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69  ached database i
23020 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 74  f.** P1>1.  Writ
23030 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  e the root page 
23040 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
23050 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  w table into.** 
23060 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a  register P2.**.*
23070 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
23080 20 62 65 74 77 65 65 6e 20 61 20 74 61 62 6c 65   between a table
23090 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73   and an index is
230a0 20 74 68 69 73 3a 20 20 41 20 74 61 62 6c 65 20   this:  A table 
230b0 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 61 20 34  must.** have a 4
230c0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6b 65  -byte integer ke
230d0 79 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20 61  y and can have a
230e0 72 62 69 74 72 61 72 79 20 64 61 74 61 2e 20 20  rbitrary data.  
230f0 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61 73 20  An index.** has 
23100 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65 79  an arbitrary key
23110 20 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a   but no data..**
23120 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43 72  .** See also: Cr
23130 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20  eateIndex.*/./* 
23140 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 49 6e  Opcode: CreateIn
23150 64 65 78 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  dex P1 P2 * * *.
23160 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
23170 20 6e 65 77 20 69 6e 64 65 78 20 69 6e 20 74 68   new index in th
23180 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
23190 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72  file if P1==0 or
231a0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c   in the.** auxil
231b0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
231c0 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69  le if P1==1 or i
231d0 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
231e0 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e  tabase if.** P1>
231f0 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72 6f  1.  Write the ro
23200 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
23210 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
23220 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
23230 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64   P2..**.** See d
23240 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20  ocumentation on 
23250 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 66  OP_CreateTable f
23260 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
23270 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  formation..*/.ca
23280 73 65 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  se OP_CreateInde
23290 78 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x:            /*
232a0 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
232b0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72 65 61   */.case OP_Crea
232c0 74 65 54 61 62 6c 65 3a 20 7b 20 20 20 20 20 20  teTable: {      
232d0 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
232e0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
232f0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66 6c 61 67  pgno;.  int flag
23300 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  s;.  Db *pDb;.. 
23310 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 61 73 73   pgno = 0;.  ass
23320 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
23330 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
23340 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
23350 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
23360 28 31 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30  (1<<pOp->p1))!=0
23370 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
23380 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  >aDb[pOp->p1];. 
23390 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42   assert( pDb->pB
233a0 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  t!=0 );.  if( pO
233b0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72  p->opcode==OP_Cr
233c0 65 61 74 65 54 61 62 6c 65 20 29 7b 0a 20 20 20  eateTable ){.   
233d0 20 2f 2a 20 66 6c 61 67 73 20 3d 20 42 54 52 45   /* flags = BTRE
233e0 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20 20 20  E_INTKEY; */.   
233f0 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 4c   flags = BTREE_L
23400 45 41 46 44 41 54 41 7c 42 54 52 45 45 5f 49 4e  EAFDATA|BTREE_IN
23410 54 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TKEY;.  }else{. 
23420 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45     flags = BTREE
23430 5f 5a 45 52 4f 44 41 54 41 3b 0a 20 20 7d 0a 20  _ZERODATA;.  }. 
23440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23450 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 44  eeCreateTable(pD
23460 62 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 66  b->pBt, &pgno, f
23470 6c 61 67 73 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  lags);.  pOut->u
23480 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d  .i = pgno;.  Mem
23490 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
234a0 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
234b0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
234c0 65 3a 20 50 61 72 73 65 53 63 68 65 6d 61 20 50  e: ParseSchema P
234d0 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  1 P2 * P4 *.**.*
234e0 2a 20 52 65 61 64 20 61 6e 64 20 70 61 72 73 65  * Read and parse
234f0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 66 72 6f   all entries fro
23500 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
23510 54 45 52 20 74 61 62 6c 65 20 6f 66 20 64 61 74  TER table of dat
23520 61 62 61 73 65 20 50 31 0a 2a 2a 20 74 68 61 74  abase P1.** that
23530 20 6d 61 74 63 68 20 74 68 65 20 57 48 45 52 45   match the WHERE
23540 20 63 6c 61 75 73 65 20 50 34 2e 20 20 50 32 20   clause P4.  P2 
23550 69 73 20 74 68 65 20 22 66 6f 72 63 65 22 20 66  is the "force" f
23560 6c 61 67 2e 20 20 20 41 6c 77 61 79 73 20 64 6f  lag.   Always do
23570 0a 2a 2a 20 74 68 65 20 70 61 72 73 69 6e 67 20  .** the parsing 
23580 69 66 20 50 32 20 69 73 20 74 72 75 65 2e 20 20  if P2 is true.  
23590 49 66 20 50 32 20 69 73 20 66 61 6c 73 65 2c 20  If P2 is false, 
235a0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
235b0 65 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 20  e is a.** no-op 
235c0 69 66 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  if the schema is
235d0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6c   not currently l
235e0 6f 61 64 65 64 2e 20 20 49 6e 20 6f 74 68 65 72  oaded.  In other
235f0 20 77 6f 72 64 73 2c 20 69 66 20 50 32 0a 2a 2a   words, if P2.**
23600 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 53   is false, the S
23610 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
23620 6c 65 20 69 73 20 6f 6e 6c 79 20 70 61 72 73 65  le is only parse
23630 64 20 69 66 20 74 68 65 20 72 65 73 74 20 6f 66  d if the rest of
23640 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 69   the.** schema i
23650 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
23660 20 69 6e 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c   into the symbol
23670 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
23680 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65  is opcode invoke
23690 73 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  s the parser to 
236a0 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
236b0 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a  tual machine,.**
236c0 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20 6e   then runs the n
236d0 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ew virtual machi
236e0 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75 73 20  ne.  It is thus 
236f0 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63  a re-entrant opc
23700 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ode..*/.case OP_
23710 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20  ParseSchema: {. 
23720 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73   int iDb;.  cons
23730 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b  t char *zMaster;
23740 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
23750 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61   InitData initDa
23760 74 61 3b 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70  ta;..  iDb = pOp
23770 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p1;.  assert( 
23780 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
23790 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
237a0 66 20 70 4f 70 2d 3e 70 32 20 69 73 20 30 2c 20  f pOp->p2 is 0, 
237b0 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65  then this opcode
237c0 20 69 73 20 62 65 69 6e 67 20 65 78 65 63 75 74   is being execut
237d0 65 64 20 74 6f 20 72 65 61 64 20 61 0a 20 20 2a  ed to read a.  *
237e0 2a 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 66 6f  * single row, fo
237f0 72 20 65 78 61 6d 70 6c 65 20 74 68 65 20 72 6f  r example the ro
23800 77 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  w corresponding 
23810 74 6f 20 61 20 6e 65 77 20 69 6e 64 65 78 0a 20  to a new index. 
23820 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74   ** created by t
23830 68 69 73 20 56 44 42 45 2c 20 66 72 6f 6d 20 74  his VDBE, from t
23840 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
23850 20 74 61 62 6c 65 2e 20 49 74 20 6f 6e 6c 79 0a   table. It only.
23860 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 69    ** does this i
23870 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
23880 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 63  ing in-memory sc
23890 68 65 6d 61 20 69 73 20 63 75 72 72 65 6e 74 6c  hema is currentl
238a0 79 0a 20 20 2a 2a 20 6c 6f 61 64 65 64 2e 20 4f  y.  ** loaded. O
238b0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6e 65  therwise, the ne
238c0 77 20 69 6e 64 65 78 20 64 65 66 69 6e 69 74 69  w index definiti
238d0 6f 6e 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64  on can be loaded
238e0 20 61 6c 6f 6e 67 0a 20 20 2a 2a 20 77 69 74 68   along.  ** with
238f0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
23900 20 73 63 68 65 6d 61 20 77 68 65 6e 20 69 74 20   schema when it 
23910 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  is required..  *
23920 2a 0a 20 20 2a 2a 20 41 6c 74 68 6f 75 67 68 20  *.  ** Although 
23930 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
23940 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
23950 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
23960 73 20 74 6f 0a 20 20 2a 2a 20 64 61 74 61 62 61  s to.  ** databa
23970 73 65 20 69 44 62 20 28 74 68 65 20 64 61 74 61  se iDb (the data
23980 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
23990 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
239a0 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 72 65 61  r table.  ** rea
239b0 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  d by this instru
239c0 63 74 69 6f 6e 29 20 69 73 20 63 75 72 72 65 6e  ction) is curren
239d0 74 6c 79 20 68 65 6c 64 2c 20 69 74 20 69 73 20  tly held, it is 
239e0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 20 20 2a  necessary to.  *
239f0 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74  * obtain the mut
23a00 65 78 65 73 20 6f 6e 20 61 6c 6c 20 61 74 74 61  exes on all atta
23a10 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 62  ched databases b
23a20 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 69  efore checking i
23a30 66 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  f.  ** the schem
23a40 61 20 6f 66 20 69 44 62 20 69 73 20 6c 6f 61 64  a of iDb is load
23a50 65 64 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ed. This is beca
23a60 75 73 65 2c 20 61 74 20 74 68 65 20 73 74 61 72  use, at the star
23a70 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
23a80 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
23a90 6c 20 62 65 6c 6f 77 2c 20 53 51 4c 69 74 65 20  l below, SQLite 
23aa0 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 0a 20 20 2a  will invoke .  *
23ab0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
23ac0 74 65 72 41 6c 6c 28 29 2e 20 49 66 20 61 6c 6c  terAll(). If all
23ad0 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74   mutexes are not
23ae0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
23af0 68 65 0a 20 20 2a 2a 20 69 44 62 20 6d 75 74 65  he.  ** iDb mute
23b00 78 20 6d 61 79 20 62 65 20 74 65 6d 70 6f 72 61  x may be tempora
23b10 72 69 6c 79 20 72 65 6c 65 61 73 65 64 20 74 6f  rily released to
23b20 20 61 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 2e   avoid deadlock.
23b30 20 49 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 68   If .  ** this h
23b40 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 73 6f 6d  appens, then som
23b50 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 20 6d  e other thread m
23b60 61 79 20 64 65 6c 65 74 65 20 74 68 65 20 69 6e  ay delete the in
23b70 2d 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 73 63  -memory .  ** sc
23b80 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65  hema of database
23b90 20 69 44 62 20 62 65 66 6f 72 65 20 74 68 65 20   iDb before the 
23ba0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 72 75  SQL statement ru
23bb0 6e 73 2e 20 54 68 65 20 73 63 68 65 6d 61 0a 20  ns. The schema. 
23bc0 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
23bd0 72 65 6c 6f 61 64 65 64 20 62 65 63 75 61 73 65  reloaded becuase
23be0 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
23bf0 73 79 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  sy flag is set. 
23c00 54 68 69 73 0a 20 20 2a 2a 20 63 61 6e 20 72 65  This.  ** can re
23c10 73 75 6c 74 20 69 6e 20 61 20 22 6e 6f 20 73 75  sult in a "no su
23c20 63 68 20 74 61 62 6c 65 3a 20 73 71 6c 69 74 65  ch table: sqlite
23c30 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 6d 61 6c  _master" or "mal
23c40 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 64 61 74 61  formed.  ** data
23c50 62 61 73 65 20 73 63 68 65 6d 61 22 20 65 72 72  base schema" err
23c60 6f 72 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  or being returne
23c70 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 20  d to the user.. 
23c80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
23c90 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23ca0 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
23cb0 5d 2e 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69  ].pBt) );.  sqli
23cc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
23cd0 28 64 62 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  (db);.  if( pOp-
23ce0 3e 70 32 20 7c 7c 20 44 62 48 61 73 50 72 6f 70  >p2 || DbHasProp
23cf0 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42  erty(db, iDb, DB
23d00 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
23d10 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
23d20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
23d30 29 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e  );.    initData.
23d40 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69  db = db;.    ini
23d50 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f 70 2d  tData.iDb = pOp-
23d60 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74 44 61 74  >p1;.    initDat
23d70 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d  a.pzErrMsg = &p-
23d80 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7a 53  >zErrMsg;.    zS
23d90 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
23da0 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20 22  ntf(db,.       "
23db0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f  SELECT name, roo
23dc0 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20  tpage, sql FROM 
23dd0 27 25 71 27 2e 25 73 20 57 48 45 52 45 20 25 73  '%q'.%s WHERE %s
23de0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
23df0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 4d  b[iDb].zName, zM
23e00 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a  aster, pOp->p4.z
23e10 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
23e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
23e30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23e50 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
23e60 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20  etyOff(db);.    
23e70 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
23e80 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
23e90 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
23ea0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 69  y = 1;.      ini
23eb0 74 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54  tData.rc = SQLIT
23ec0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73 65  E_OK;.      asse
23ed0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
23ee0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
23ef0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
23f00 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74  (db, zSql, sqlit
23f10 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20  e3InitCallback, 
23f20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a 20  &initData, 0);. 
23f30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23f40 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e  ITE_OK ) rc = in
23f50 69 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 20  itData.rc;.     
23f60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23f70 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  b, zSql);.      
23f80 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
23f90 30 3b 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73  0;.      (void)s
23fa0 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
23fb0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
23fc0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23fd0 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20  eAll(db);.  if( 
23fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
23ff0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   ){.    goto no_
24000 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  mem;.  }.  break
24010 3b 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  ;  .}..#if !defi
24020 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24030 41 4e 41 4c 59 5a 45 29 20 26 26 20 21 64 65 66  ANALYZE) && !def
24040 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24050 5f 50 41 52 53 45 52 29 0a 2f 2a 20 4f 70 63 6f  _PARSER)./* Opco
24060 64 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73  de: LoadAnalysis
24070 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
24080 2a 20 52 65 61 64 20 74 68 65 20 73 71 6c 69 74  * Read the sqlit
24090 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f  e_stat1 table fo
240a0 72 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e  r database P1 an
240b0 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65  d load the conte
240c0 6e 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61  nt.** of that ta
240d0 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ble into the int
240e0 65 72 6e 61 6c 20 69 6e 64 65 78 20 68 61 73 68  ernal index hash
240f0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69   table.  This wi
24100 6c 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  ll cause.** the 
24110 61 6e 61 6c 79 73 69 73 20 74 6f 20 62 65 20 75  analysis to be u
24120 73 65 64 20 77 68 65 6e 20 70 72 65 70 61 72 69  sed when prepari
24130 6e 67 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  ng all subsequen
24140 74 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61  t queries..*/.ca
24150 73 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73  se OP_LoadAnalys
24160 69 73 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  is: {.  assert( 
24170 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
24180 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
24190 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
241a0 6e 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20  nalysisLoad(db, 
241b0 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 62 72 65 61  pOp->p1);.  brea
241c0 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;  .}.#endif /*
241d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
241e0 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 26  _OMIT_ANALYZE) &
241f0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
24200 45 5f 4f 4d 49 54 5f 50 41 52 53 45 52 29 20 20  E_OMIT_PARSER)  
24210 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  */../* Opcode: D
24220 72 6f 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20  ropTable P1 * * 
24230 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
24240 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
24250 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
24260 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
24270 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
24280 74 61 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69  table named P4 i
24290 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20  n database P1.  
242a0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
242b0 66 74 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20  fter a table.** 
242c0 69 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72  is dropped in or
242d0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
242e0 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
242f0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
24300 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
24310 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
24320 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
24330 65 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20  e OP_DropTable: 
24340 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  {.  sqlite3Unlin
24350 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
24360 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
24370 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b  ->p4.z);.  break
24380 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
24390 44 72 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a  DropIndex P1 * *
243a0 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f   P4 *.**.** Remo
243b0 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ve the internal 
243c0 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61  (in-memory) data
243d0 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74   structures that
243e0 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65   describe.** the
243f0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20   index named P4 
24400 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  in database P1. 
24410 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
24420 61 66 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a  after an index.*
24430 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69 6e 20  * is dropped in 
24440 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
24450 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
24460 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
24470 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69  .** schema consi
24480 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74 20  stent with what 
24490 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63  is on disk..*/.c
244a0 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  ase OP_DropIndex
244b0 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c  : {.  sqlite3Unl
244c0 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
244d0 78 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  x(db, pOp->p1, p
244e0 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65  Op->p4.z);.  bre
244f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
24500 3a 20 44 72 6f 70 54 72 69 67 67 65 72 20 50 31  : DropTrigger P1
24510 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
24520 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72  Remove the inter
24530 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20  nal (in-memory) 
24540 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
24550 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a  that describe.**
24560 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
24570 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73  ed P4 in databas
24580 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63  e P1.  This is c
24590 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 72  alled after a tr
245a0 69 67 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70  igger.** is drop
245b0 70 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ped in order to 
245c0 6b 65 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61  keep the interna
245d0 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
245e0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d   of the.** schem
245f0 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  a consistent wit
24600 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
24610 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72  k..*/.case OP_Dr
24620 6f 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73  opTrigger: {.  s
24630 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
24640 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
24650 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
24660 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
24670 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
24680 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
24690 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65  _CHECK./* Opcode
246a0 3a 20 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31  : IntegrityCk P1
246b0 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a   P2 P3 * P5.**.*
246c0 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  * Do an analysis
246d0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
246e0 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e  y open database.
246f0 20 20 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72 65    Store in.** re
24700 67 69 73 74 65 72 20 50 31 20 74 68 65 20 74 65  gister P1 the te
24710 78 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d  xt of an error m
24720 65 73 73 61 67 65 20 64 65 73 63 72 69 62 69 6e  essage describin
24730 67 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  g any problems..
24740 2a 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65 6d  ** If no problem
24750 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 73 74 6f  s are found, sto
24760 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65 67  re a NULL in reg
24770 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  ister P1..**.** 
24780 54 68 65 20 72 65 67 69 73 74 65 72 20 50 33 20  The register P3 
24790 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 78  contains the max
247a0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
247b0 6c 6c 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a  llowed errors..*
247c0 2a 20 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33  * At most reg(P3
247d0 29 20 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65  ) errors will be
247e0 20 72 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e   reported..** In
247f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
24800 65 20 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73  e analysis stops
24810 20 61 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28   as soon as reg(
24820 50 31 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a  P1) errors are .
24830 2a 2a 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31  ** seen.  Reg(P1
24840 29 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  ) is updated wit
24850 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
24860 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67  errors remaining
24870 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ..**.** The root
24880 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66   page numbers of
24890 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
248a0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
248b0 69 6e 74 65 67 65 72 0a 2a 2a 20 73 74 6f 72 65  integer.** store
248c0 64 20 69 6e 20 72 65 67 28 50 31 29 2c 20 72 65  d in reg(P1), re
248d0 67 28 50 31 2b 31 29 2c 20 72 65 67 28 50 31 2b  g(P1+1), reg(P1+
248e0 32 29 2c 20 2e 2e 2e 2e 20 20 54 68 65 72 65 20  2), ....  There 
248f0 61 72 65 20 50 32 20 74 61 62 6c 65 73 0a 2a 2a  are P2 tables.**
24900 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66   total..**.** If
24910 20 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P5 is not zero,
24920 20 74 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f   the check is do
24930 6e 65 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69  ne on the auxili
24940 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
24950 66 69 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61  file, not the ma
24960 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
24970 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
24980 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ode is used to i
24990 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74  mplement the int
249a0 65 67 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61  egrity_check pra
249b0 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  gma..*/.case OP_
249c0 49 6e 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20  IntegrityCk: {. 
249d0 20 69 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20   int nRoot;     
249e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
249f0 62 6c 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20  bles to check.  
24a00 28 4e 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20  (Number of root 
24a10 70 61 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74  pages.) */.  int
24a20 20 2a 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20   *aRoot;     /* 
24a30 41 72 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67  Array of rootpag
24a40 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61  e numbers for ta
24a50 62 6c 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b  bles to be check
24a60 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  ed */.  int j;  
24a70 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
24a80 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
24a90 20 6e 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20   nErr;       /* 
24aa0 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
24ab0 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63   reported */.  c
24ac0 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f  har *z;        /
24ad0 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 65 72  * Text of the er
24ae0 72 6f 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20  ror report */.  
24af0 4d 65 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20  Mem *pnErr;     
24b00 2f 2a 20 52 65 67 69 73 74 65 72 20 6b 65 65 70  /* Register keep
24b10 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72  ing track of err
24b20 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f  ors remaining */
24b30 0a 20 20 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f  .  .  nRoot = pO
24b40 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28  p->p2;.  assert(
24b50 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52   nRoot>0 );.  aR
24b60 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  oot = sqlite3DbM
24b70 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
24b80 65 6f 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b  eof(int)*(nRoot+
24b90 31 29 20 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f  1) );.  if( aRoo
24ba0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  t==0 ) goto no_m
24bb0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  em;.  assert( pO
24bc0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
24bd0 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p3<=p->nMem );. 
24be0 20 70 6e 45 72 72 20 3d 20 26 70 2d 3e 61 4d 65   pnErr = &p->aMe
24bf0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
24c00 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c  sert( (pnErr->fl
24c10 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
24c20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
24c30 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 28  pnErr->flags & (
24c40 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
24c50 29 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20  ))==0 );.  pIn1 
24c60 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
24c70 70 31 5d 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  p1];.  for(j=0; 
24c80 6a 3c 6e 52 6f 6f 74 3b 20 6a 2b 2b 29 7b 0a 20  j<nRoot; j++){. 
24c90 20 20 20 61 52 6f 6f 74 5b 6a 5d 20 3d 20 28 69     aRoot[j] = (i
24ca0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 49 6e  nt)sqlite3VdbeIn
24cb0 74 56 61 6c 75 65 28 26 70 49 6e 31 5b 6a 5d 29  tValue(&pIn1[j])
24cc0 3b 0a 20 20 7d 0a 20 20 61 52 6f 6f 74 5b 6a 5d  ;.  }.  aRoot[j]
24cd0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
24ce0 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62 20  pOp->p5<db->nDb 
24cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
24d00 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
24d10 3c 70 4f 70 2d 3e 70 35 29 29 21 3d 30 20 29 3b  <pOp->p5))!=0 );
24d20 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 42 74  .  z = sqlite3Bt
24d30 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
24d40 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  k(db->aDb[pOp->p
24d50 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e  5].pBt, aRoot, n
24d60 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Root,.          
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e 45 72         (int)pnEr
24d90 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72 29 3b 0a  r->u.i, &nErr);.
24da0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24db0 64 62 2c 20 61 52 6f 6f 74 29 3b 0a 20 20 70 6e  db, aRoot);.  pn
24dc0 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72  Err->u.i -= nErr
24dd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
24de0 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29 3b  emSetNull(pIn1);
24df0 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 29  .  if( nErr==0 )
24e00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 3d  {.    assert( z=
24e10 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
24e20 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( z==0 ){.    go
24e30 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c  to no_mem;.  }el
24e40 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
24e50 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e  dbeMemSetStr(pIn
24e60 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
24e70 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
24e80 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41  ree);.  }.  UPDA
24e90 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
24ea0 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
24eb0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
24ec0 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e  ng(pIn1, encodin
24ed0 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  g);.  break;.}.#
24ee0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24ef0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
24f00 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  HECK */../* Opco
24f10 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31  de: RowSetAdd P1
24f20 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
24f30 49 6e 73 65 72 74 20 74 68 65 20 69 6e 74 65 67  Insert the integ
24f40 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79  er value held by
24f50 20 72 65 67 69 73 74 65 72 20 50 32 20 69 6e 74   register P2 int
24f60 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65  o a boolean inde
24f70 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67  x.** held in reg
24f80 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  ister P1..**.** 
24f90 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
24fa0 6c 73 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20  ls if P2 is not 
24fb0 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63  an integer..*/.c
24fc0 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64  ase OP_RowSetAdd
24fd0 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 32  : {       /* in2
24fe0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 64 78 3b   */.  Mem *pIdx;
24ff0 0a 20 20 4d 65 6d 20 2a 70 56 61 6c 3b 0a 20 20  .  Mem *pVal;.  
25000 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
25010 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d  0 && pOp->p1<=p-
25020 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 49 64 78 20  >nMem );.  pIdx 
25030 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
25040 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
25050 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
25060 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p2<=p->nMem );.
25070 20 20 70 56 61 6c 20 3d 20 26 70 2d 3e 61 4d 65    pVal = &p->aMe
25080 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
25090 73 65 72 74 28 20 28 70 56 61 6c 2d 3e 66 6c 61  sert( (pVal->fla
250a0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
250b0 20 29 3b 0a 20 20 69 66 28 20 28 70 49 64 78 2d   );.  if( (pIdx-
250c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
250d0 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Set)==0 ){.    s
250e0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
250f0 52 6f 77 53 65 74 28 70 49 64 78 29 3b 0a 20 20  RowSet(pIdx);.  
25100 20 20 69 66 28 20 28 70 49 64 78 2d 3e 66 6c 61    if( (pIdx->fla
25110 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
25120 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
25130 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  m;.  }.  sqlite3
25140 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49 64  RowSetInsert(pId
25150 78 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70 56  x->u.pRowSet, pV
25160 61 6c 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61  al->u.i);.  brea
25170 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
25180 20 52 6f 77 53 65 74 52 65 61 64 20 50 31 20 50   RowSetRead P1 P
25190 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45  2 P3 * *.**.** E
251a0 78 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c  xtract the small
251b0 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20 62  est value from b
251c0 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31 20  oolean index P1 
251d0 61 6e 64 20 70 75 74 20 74 68 61 74 20 76 61 6c  and put that val
251e0 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  ue into.** regis
251f0 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 69 66 20  ter P3.  Or, if 
25200 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31  boolean index P1
25210 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   is initially em
25220 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a  pty, leave P3.**
25230 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 6a   unchanged and j
25240 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
25250 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  on P2..*/.case O
25260 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20 7b 20  P_RowSetRead: { 
25270 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 6f        /* jump, o
25280 75 74 33 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  ut3 */.  Mem *pI
25290 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 3b 0a 20  dx;.  i64 val;. 
252a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
252b0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70  >0 && pOp->p1<=p
252c0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 43 48 45 43  ->nMem );.  CHEC
252d0 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b  K_FOR_INTERRUPT;
252e0 0a 20 20 70 49 64 78 20 3d 20 26 70 2d 3e 61 4d  .  pIdx = &p->aM
252f0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
25300 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Out = &p->aMem[p
25310 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28  Op->p3];.  if( (
25320 70 49 64 78 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIdx->flags & ME
25330 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20 20  M_RowSet)==0 .  
25340 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53 65   || sqlite3RowSe
25350 74 4e 65 78 74 28 70 49 64 78 2d 3e 75 2e 70 52  tNext(pIdx->u.pR
25360 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30 0a  owSet, &val)==0.
25370 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20    ){.    /* The 
25380 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69 73  boolean index is
25390 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73 71   empty */.    sq
253a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
253b0 75 6c 6c 28 70 49 64 78 29 3b 0a 20 20 20 20 70  ull(pIdx);.    p
253c0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
253d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
253e0 20 41 20 76 61 6c 75 65 20 77 61 73 20 70 75 6c   A value was pul
253f0 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  led from the ind
25400 65 78 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ex */.    assert
25410 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
25420 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
25430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
25440 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f  beMemSetInt64(pO
25450 75 74 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20  ut, val);.  }.  
25460 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
25470 6f 64 65 3a 20 52 6f 77 53 65 74 54 65 73 74 20  ode: RowSetTest 
25480 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a 0a 2a  P1 P2 P3 P4.**.*
25490 2a 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73  * Register P3 is
254a0 20 61 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64   assumed to hold
254b0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
254c0 72 20 76 61 6c 75 65 2e 20 49 66 20 72 65 67 69  r value. If regi
254d0 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61  ster P1.** conta
254e0 69 6e 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ins a RowSet obj
254f0 65 63 74 20 61 6e 64 20 74 68 61 74 20 52 6f 77  ect and that Row
25500 53 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  Set object conta
25510 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
25520 20 68 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d   held in P3, jum
25530 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  p to register P2
25540 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 73  . Otherwise, ins
25550 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67  ert the.** integ
25560 65 72 20 69 6e 20 50 33 20 69 6e 74 6f 20 74 68  er in P3 into th
25570 65 20 52 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e  e RowSet and con
25580 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a  tinue on to the.
25590 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a  ** next opcode..
255a0 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65 74  **.** The RowSet
255b0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 74 69 6d   object is optim
255c0 69 7a 65 64 20 66 6f 72 20 74 68 65 20 63 61 73  ized for the cas
255d0 65 20 77 68 65 72 65 20 73 75 63 63 65 73 73 69  e where successi
255e0 76 65 20 73 65 74 73 0a 2a 2a 20 6f 66 20 69 6e  ve sets.** of in
255f0 74 65 67 65 72 73 2c 20 77 68 65 72 65 20 65 61  tegers, where ea
25600 63 68 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  ch set contains 
25610 6e 6f 20 64 75 70 6c 69 63 61 74 65 73 2e 20 45  no duplicates. E
25620 61 63 68 20 73 65 74 0a 2a 2a 20 6f 66 20 76 61  ach set.** of va
25630 6c 75 65 73 20 69 73 20 69 64 65 6e 74 69 66 69  lues is identifi
25640 65 64 20 62 79 20 61 20 75 6e 69 71 75 65 20 50  ed by a unique P
25650 34 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72  4 value. The fir
25660 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68  st set.** must h
25670 61 76 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66  ave P4==0, the f
25680 69 6e 61 6c 20 73 65 74 20 50 34 3d 2d 31 2e 20  inal set P4=-1. 
25690 20 50 34 20 6d 75 73 74 20 62 65 20 65 69 74 68   P4 must be eith
256a0 65 72 20 2d 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d  er -1 or.** non-
256b0 6e 65 67 61 74 69 76 65 2e 20 20 46 6f 72 20 6e  negative.  For n
256c0 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
256d0 65 73 20 6f 66 20 50 34 20 6f 6e 6c 79 20 74 68  es of P4 only th
256e0 65 20 6c 6f 77 65 72 20 34 0a 2a 2a 20 62 69 74  e lower 4.** bit
256f0 73 20 61 72 65 20 73 69 67 6e 69 66 69 63 61 6e  s are significan
25700 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  t..**.** This al
25710 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  lows optimizatio
25720 6e 73 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d  ns: (a) when P4=
25730 3d 30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  =0 there is no n
25740 65 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  eed to test.** t
25750 68 65 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74  he rowset object
25760 20 66 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69   for P3, as it i
25770 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74  s guaranteed not
25780 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a   to contain it,.
25790 2a 2a 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d  ** (b) when P4==
257a0 2d 31 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  -1 there is no n
257b0 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  eed to insert th
257c0 65 20 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77  e value, as it w
257d0 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20  ill.** never be 
257e0 74 65 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20  tested for, and 
257f0 28 63 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65  (c) when a value
25800 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
25810 20 73 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73   set X is.** ins
25820 65 72 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  erted, there is 
25830 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63  no need to searc
25840 68 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  h to see if the 
25850 73 61 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a  same value was.*
25860 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  * previously ins
25870 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  erted as part of
25880 20 73 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20   set X (only if 
25890 69 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  it was previousl
258a0 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73  y.** inserted as
258b0 20 70 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74   part of some ot
258c0 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73  her set)..*/.cas
258d0 65 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  e OP_RowSetTest:
258e0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
258f0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
25900 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  in1, in3 */.  in
25910 74 20 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78  t iSet;.  int ex
25920 69 73 74 73 3b 0a 0a 20 20 69 53 65 74 20 3d 20  ists;..  iSet = 
25930 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73  pOp->p4.i;.  ass
25940 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
25950 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f  &MEM_Int );..  /
25960 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
25970 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
25980 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63  n a rowset objec
25990 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
259a0 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65   P1,.  ** delete
259b0 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74   it now and init
259c0 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61  ialize P1 with a
259d0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20  n empty rowset. 
259e0 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d   */.  if( (pIn1-
259f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
25a00 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Set)==0 ){.    s
25a10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
25a20 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20  RowSet(pIn1);.  
25a30 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
25a40 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
25a50 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
25a60 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  m;.  }..  assert
25a70 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
25a80 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73  4_INT32 );.  ass
25a90 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c  ert( iSet==-1 ||
25aa0 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66   iSet>=0 );.  if
25ab0 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78  ( iSet ){.    ex
25ac0 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f  ists = sqlite3Ro
25ad0 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75  wSetTest(pIn1->u
25ae0 2e 70 52 6f 77 53 65 74 2c 20 0a 20 20 20 20 20  .pRowSet, .     
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 20 20 20 20 20 20 20 20 28 75 38 29 28 69            (u8)(i
25b10 53 65 74 3e 3d 30 20 3f 20 69 53 65 74 20 26 20  Set>=0 ? iSet & 
25b20 30 78 66 20 3a 20 30 78 66 66 29 2c 0a 20 20 20  0xf : 0xff),.   
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b40 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 33              pIn3
25b50 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 69 66 28 20  ->u.i);.    if( 
25b60 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
25b70 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
25b80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25b90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
25ba0 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  Set>=0 ){.    sq
25bb0 6c 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72  lite3RowSetInser
25bc0 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65  t(pIn1->u.pRowSe
25bd0 74 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20  t, pIn3->u.i);. 
25be0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a   }.  break;.}...
25bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25c00 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 20 4f  MIT_TRIGGER./* O
25c10 70 63 6f 64 65 3a 20 43 6f 6e 74 65 78 74 50 75  pcode: ContextPu
25c20 73 68 20 2a 20 2a 20 2a 20 0a 2a 2a 0a 2a 2a 20  sh * * * .**.** 
25c30 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
25c40 20 56 64 62 65 20 63 6f 6e 74 65 78 74 20 73 75   Vdbe context su
25c50 63 68 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  ch that it can b
25c60 65 20 72 65 73 74 6f 72 65 64 20 62 79 20 61 20  e restored by a 
25c70 43 6f 6e 74 65 78 74 50 6f 70 0a 2a 2a 20 6f 70  ContextPop.** op
25c80 63 6f 64 65 2e 20 54 68 65 20 63 6f 6e 74 65 78  code. The contex
25c90 74 20 73 74 6f 72 65 73 20 74 68 65 20 6c 61 73  t stores the las
25ca0 74 20 69 6e 73 65 72 74 20 72 6f 77 20 69 64 2c  t insert row id,
25cb0 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 6d   the last statem
25cc0 65 6e 74 20 63 68 61 6e 67 65 0a 2a 2a 20 63 6f  ent change.** co
25cd0 75 6e 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  unt, and the cur
25ce0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 63  rent statement c
25cf0 68 61 6e 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  hange count..*/.
25d00 63 61 73 65 20 4f 50 5f 43 6f 6e 74 65 78 74 50  case OP_ContextP
25d10 75 73 68 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a  ush: {.  int i;.
25d20 20 20 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74    Context *pCont
25d30 65 78 74 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 63  ext;..  i = p->c
25d40 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 2b 2b  ontextStackTop++
25d50 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
25d60 20 29 3b 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a   );.  /* FIX ME:
25d70 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
25d80 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72  allocated as par
25d90 74 20 6f 66 20 74 68 65 20 76 64 62 65 20 61 74  t of the vdbe at
25da0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
25db0 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 63 6f 6e  .  if( i>=p->con
25dc0 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 29  textStackDepth )
25dd0 7b 0a 20 20 20 20 70 2d 3e 63 6f 6e 74 65 78 74  {.    p->context
25de0 53 74 61 63 6b 44 65 70 74 68 20 3d 20 69 2b 31  StackDepth = i+1
25df0 3b 0a 20 20 20 20 70 2d 3e 63 6f 6e 74 65 78 74  ;.    p->context
25e00 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 44  Stack = sqlite3D
25e10 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
25e20 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  b, p->contextSta
25e30 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
25e60 7a 65 6f 66 28 43 6f 6e 74 65 78 74 29 2a 28 69  zeof(Context)*(i
25e70 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  +1));.    if( p-
25e80 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 3d 3d 30  >contextStack==0
25e90 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
25ea0 20 20 7d 0a 20 20 70 43 6f 6e 74 65 78 74 20 3d    }.  pContext =
25eb0 20 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63   &p->contextStac
25ec0 6b 5b 69 5d 3b 0a 20 20 70 43 6f 6e 74 65 78 74  k[i];.  pContext
25ed0 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62  ->lastRowid = db
25ee0 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70  ->lastRowid;.  p
25ef0 43 6f 6e 74 65 78 74 2d 3e 6e 43 68 61 6e 67 65  Context->nChange
25f00 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20   = p->nChange;. 
25f10 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
25f20 63 6f 64 65 3a 20 43 6f 6e 74 65 78 74 50 6f 70  code: ContextPop
25f30 20 2a 20 2a 20 2a 20 0a 2a 2a 0a 2a 2a 20 52 65   * * * .**.** Re
25f40 73 74 6f 72 65 20 74 68 65 20 56 64 62 65 20 63  store the Vdbe c
25f50 6f 6e 74 65 78 74 20 74 6f 20 74 68 65 20 73 74  ontext to the st
25f60 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 77 68  ate it was in wh
25f70 65 6e 20 63 6f 6e 74 65 78 74 50 75 73 68 20 77  en contextPush w
25f80 61 73 20 6c 61 73 74 0a 2a 2a 20 65 78 65 63 75  as last.** execu
25f90 74 65 64 2e 20 54 68 65 20 63 6f 6e 74 65 78 74  ted. The context
25fa0 20 73 74 6f 72 65 73 20 74 68 65 20 6c 61 73 74   stores the last
25fb0 20 69 6e 73 65 72 74 20 72 6f 77 20 69 64 2c 20   insert row id, 
25fc0 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 6d 65  the last stateme
25fd0 6e 74 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75  nt.** change cou
25fe0 6e 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  nt, and the curr
25ff0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 63 68  ent statement ch
26000 61 6e 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 63  ange count..*/.c
26010 61 73 65 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f  ase OP_ContextPo
26020 70 3a 20 7b 0a 20 20 43 6f 6e 74 65 78 74 20 2a  p: {.  Context *
26030 70 43 6f 6e 74 65 78 74 3b 0a 20 20 70 43 6f 6e  pContext;.  pCon
26040 74 65 78 74 20 3d 20 26 70 2d 3e 63 6f 6e 74 65  text = &p->conte
26050 78 74 53 74 61 63 6b 5b 2d 2d 70 2d 3e 63 6f 6e  xtStack[--p->con
26060 74 65 78 74 53 74 61 63 6b 54 6f 70 5d 3b 0a 20  textStackTop];. 
26070 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6f 6e 74   assert( p->cont
26080 65 78 74 53 74 61 63 6b 54 6f 70 3e 3d 30 20 29  extStackTop>=0 )
26090 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  ;.  db->lastRowi
260a0 64 20 3d 20 70 43 6f 6e 74 65 78 74 2d 3e 6c 61  d = pContext->la
260b0 73 74 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 6e 43  stRowid;.  p->nC
260c0 68 61 6e 67 65 20 3d 20 70 43 6f 6e 74 65 78 74  hange = pContext
260d0 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 62 72 65  ->nChange;.  bre
260e0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
260f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26100 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a  MIT_TRIGGER */..
26110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26120 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
26130 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d  T./* Opcode: Mem
26140 4d 61 78 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Max P1 P2 * * *.
26150 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  **.** Set the va
26160 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
26170 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  P1 to the maximu
26180 6d 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  m of its current
26190 20 76 61 6c 75 65 0a 2a 2a 20 61 6e 64 20 74 68   value.** and th
261a0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
261b0 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
261c0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
261d0 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
261e0 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
261f0 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
26200 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
26210 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
26220 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Max: {        /*
26230 20 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 73   in1, in2 */.  s
26240 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
26250 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  egerify(pIn1);. 
26260 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
26270 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b  ntegerify(pIn2);
26280 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
26290 3c 70 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20  <pIn2->u.i){.   
262a0 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e   pIn1->u.i = pIn
262b0 32 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72  2->u.i;.  }.  br
262c0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
262d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
262e0 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  OINCREMENT */../
262f0 2a 20 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73 20  * Opcode: IfPos 
26300 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
26310 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f  * If the value o
26320 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
26330 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c 20 6a   1 or greater, j
26340 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
26350 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
26360 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74 72  o use this instr
26370 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69  uction on a regi
26380 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a  ster that does.*
26390 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  * not contain an
263a0 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73   integer.  An as
263b0 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
263c0 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75  ll result if you
263d0 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   try..*/.case OP
263e0 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20 20  _IfPos: {       
263f0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
26400 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
26410 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
26420 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
26430 69 3e 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d  i>0 ){.     pc =
26440 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
26450 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
26460 20 4f 70 63 6f 64 65 3a 20 49 66 4e 65 67 20 50   Opcode: IfNeg P
26470 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
26480 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   If the value of
26490 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
264a0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
264b0 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a  jump to P2. .**.
264c0 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
264d0 20 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73   to use this ins
264e0 74 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65  truction on a re
264f0 67 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73  gister that does
26500 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
26510 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20  an integer.  An 
26520 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
26530 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79  will result if y
26540 6f 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20  ou try..*/.case 
26550 4f 50 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20 20  OP_IfNeg: {     
26560 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
26570 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  */.  assert( pIn
26580 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  1->flags&MEM_Int
26590 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e   );.  if( pIn1->
265a0 75 2e 69 3c 30 20 29 7b 0a 20 20 20 20 20 70 63  u.i<0 ){.     pc
265b0 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
265c0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
265d0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 5a 65 72  /* Opcode: IfZer
265e0 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  o P1 P2 * * *.**
265f0 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
26600 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
26610 69 73 20 65 78 61 63 74 6c 79 20 30 2c 20 6a 75  is exactly 0, ju
26620 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a  mp to P2. .**.**
26630 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
26640 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74 72  o use this instr
26650 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69  uction on a regi
26660 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a  ster that does.*
26670 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  * not contain an
26680 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73   integer.  An as
26690 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
266a0 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75  ll result if you
266b0 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   try..*/.case OP
266c0 5f 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  _IfZero: {      
266d0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
266e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  /.  assert( pIn1
266f0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ->flags&MEM_Int 
26700 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75  );.  if( pIn1->u
26710 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 70 63  .i==0 ){.     pc
26720 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a   = pOp->p2 - 1;.
26730 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
26740 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74  /* Opcode: AggSt
26750 65 70 20 2a 20 50 32 20 50 33 20 50 34 20 50 35  ep * P2 P3 P4 P5
26760 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  .**.** Execute t
26770 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
26780 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
26790 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74  e.  The.** funct
267a0 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d  ion has P5 argum
267b0 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61 20  ents.   P4 is a 
267c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
267d0 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74  uncDef.** struct
267e0 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66 69  ure that specifi
267f0 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  es the function.
26800 20 20 55 73 65 20 72 65 67 69 73 74 65 72 0a 2a    Use register.*
26810 2a 20 50 33 20 61 73 20 74 68 65 20 61 63 63 75  * P3 as the accu
26820 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
26830 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20  he P5 arguments 
26840 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72  are taken from r
26850 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 69  egister P2 and i
26860 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73  ts.** successors
26870 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67  ..*/.case OP_Agg
26880 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b  Step: {.  int n;
26890 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
268a0 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20 2a 70 52  *pMem;.  Mem *pR
268b0 65 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ec;.  sqlite3_co
268c0 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71 6c  ntext ctx;.  sql
268d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
268e0 61 6c 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e  al;..  n = pOp->
268f0 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  p5;.  assert( n>
26900 3d 30 20 29 3b 0a 20 20 70 52 65 63 20 3d 20 26  =0 );.  pRec = &
26910 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  p->aMem[pOp->p2]
26920 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61  ;.  apVal = p->a
26930 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
26940 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b  apVal || n==0 );
26950 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
26960 20 69 2b 2b 2c 20 70 52 65 63 2b 2b 29 7b 0a 20   i++, pRec++){. 
26970 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d 20 70 52     apVal[i] = pR
26980 65 63 3b 0a 20 20 20 20 73 74 6f 72 65 54 79 70  ec;.    storeTyp
26990 65 49 6e 66 6f 28 70 52 65 63 2c 20 65 6e 63 6f  eInfo(pRec, enco
269a0 64 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 63 74 78  ding);.  }.  ctx
269b0 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34  .pFunc = pOp->p4
269c0 2e 70 46 75 6e 63 3b 0a 20 20 61 73 73 65 72 74  .pFunc;.  assert
269d0 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
269e0 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
269f0 29 3b 0a 20 20 63 74 78 2e 70 4d 65 6d 20 3d 20  );.  ctx.pMem = 
26a00 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
26a10 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 4d 65 6d  pOp->p3];.  pMem
26a20 2d 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e 73 2e 66  ->n++;.  ctx.s.f
26a30 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
26a40 0a 20 20 63 74 78 2e 73 2e 7a 20 3d 20 30 3b 0a  .  ctx.s.z = 0;.
26a50 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20    ctx.s.zMalloc 
26a60 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 78 44 65  = 0;.  ctx.s.xDe
26a70 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e 64  l = 0;.  ctx.s.d
26a80 62 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e 69 73  b = db;.  ctx.is
26a90 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 63 74 78  Error = 0;.  ctx
26aa0 2e 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66  .pColl = 0;.  if
26ab0 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61  ( ctx.pFunc->fla
26ac0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
26ad0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
26ae0 20 61 73 73 65 72 74 28 20 70 4f 70 3e 70 2d 3e   assert( pOp>p->
26af0 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65 72  aOp );.    asser
26b00 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70  t( pOp[-1].p4typ
26b10 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 29 3b  e==P4_COLLSEQ );
26b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
26b30 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
26b40 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 63  CollSeq );.    c
26b50 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f 70 5b 2d  tx.pColl = pOp[-
26b60 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 7d  1].p4.pColl;.  }
26b70 0a 20 20 28 63 74 78 2e 70 46 75 6e 63 2d 3e 78  .  (ctx.pFunc->x
26b80 53 74 65 70 29 28 26 63 74 78 2c 20 6e 2c 20 61  Step)(&ctx, n, a
26b90 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 63 74 78  pVal);.  if( ctx
26ba0 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
26bb0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
26bc0 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
26bd0 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
26be0 76 61 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e  value_text(&ctx.
26bf0 73 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74  s));.    rc = ct
26c00 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  x.isError;.  }. 
26c10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
26c20 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29 3b 0a  elease(&ctx.s);.
26c30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
26c40 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20  pcode: AggFinal 
26c50 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a  P1 P2 * P4 *.**.
26c60 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
26c70 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f  inalizer functio
26c80 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
26c90 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74 68  te.  P1 is.** th
26ca0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
26cb0 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63  n that is the ac
26cc0 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74 68  cumulator for th
26cd0 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  e aggregate..**.
26ce0 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d  ** P2 is the num
26cf0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26d00 20 74 68 61 74 20 74 68 65 20 73 74 65 70 20 66   that the step f
26d10 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e  unction takes an
26d20 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  d.** P4 is a poi
26d30 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
26d40 44 65 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e  Def for this fun
26d50 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a  ction.  The P2.*
26d60 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  * argument is no
26d70 74 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f  t used by this o
26d80 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e  pcode.  It is on
26d90 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69 73 61  ly there to disa
26da0 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63  mbiguate.** func
26db0 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74  tions that can t
26dc0 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62  ake varying numb
26dd0 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ers of arguments
26de0 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67  .  The.** P4 arg
26df0 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65  ument is only ne
26e00 65 64 65 64 20 66 6f 72 20 74 68 65 20 64 65 67  eded for the deg
26e10 65 6e 65 72 61 74 65 20 63 61 73 65 20 77 68 65  enerate case whe
26e20 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66  re.** the step f
26e30 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  unction was not 
26e40 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
26e50 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67  d..*/.case OP_Ag
26e60 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20  gFinal: {.  Mem 
26e70 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  *pMem;.  assert(
26e80 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
26e90 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29  p->p1<=p->nMem )
26ea0 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  ;.  pMem = &p->a
26eb0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
26ec0 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
26ed0 6c 61 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c  lags & ~(MEM_Nul
26ee0 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29  l|MEM_Agg))==0 )
26ef0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
26f00 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28  VdbeMemFinalize(
26f10 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46  pMem, pOp->p4.pF
26f20 75 6e 63 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unc);.  if( rc==
26f30 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a  SQLITE_ERROR ){.
26f40 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
26f50 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
26f60 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
26f70 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
26f80 4d 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Mem));.  }.  sql
26f90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
26fa0 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63  coding(pMem, enc
26fb0 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45  oding);.  UPDATE
26fc0 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d  _MAX_BLOBSIZE(pM
26fd0 65 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  em);.  if( sqlit
26fe0 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28  e3VdbeMemTooBig(
26ff0 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74  pMem) ){.    got
27000 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
27010 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 20   break;.}...#if 
27020 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
27030 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26 20  OMIT_VACUUM) && 
27040 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
27050 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a 20  OMIT_ATTACH)./* 
27060 4f 70 63 6f 64 65 3a 20 56 61 63 75 75 6d 20 2a  Opcode: Vacuum *
27070 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 56   * * * *.**.** V
27080 61 63 75 75 6d 20 74 68 65 20 65 6e 74 69 72 65  acuum the entire
27090 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
270a0 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 63 61 75   opcode will cau
270b0 73 65 20 6f 74 68 65 72 20 76 69 72 74 75 61 6c  se other virtual
270c0 0a 2a 2a 20 6d 61 63 68 69 6e 65 73 20 74 6f 20  .** machines to 
270d0 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72  be created and r
270e0 75 6e 2e 20 20 49 74 20 6d 61 79 20 6e 6f 74 20  un.  It may not 
270f0 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
27100 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
27110 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  action..*/.case 
27120 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a 20 20 69  OP_Vacuum: {.  i
27130 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
27140 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20 61  Off(db) ) goto a
27150 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75  bort_due_to_misu
27160 73 65 3b 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  se; .  rc = sqli
27170 74 65 33 52 75 6e 56 61 63 75 75 6d 28 26 70 2d  te3RunVacuum(&p-
27180 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29 3b 0a 20  >zErrMsg, db);. 
27190 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
271a0 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20  tyOn(db) ) goto 
271b0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
271c0 75 73 65 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  use;.  break;.}.
271d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
271e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
271f0 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20  _AUTOVACUUM)./* 
27200 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63 75  Opcode: IncrVacu
27210 75 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  um P1 P2 * * *.*
27220 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
27230 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74 68  ingle step of th
27240 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
27250 63 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20 6f  cuum procedure o
27260 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74 61  n.** the P1 data
27270 62 61 73 65 2e 20 49 66 20 74 68 65 20 76 61 63  base. If the vac
27280 75 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65 64  uum has finished
27290 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  , jump to instru
272a0 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68  ction.** P2. Oth
272b0 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
272c0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
272d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
272e0 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61 63  .case OP_IncrVac
272f0 75 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  uum: {        /*
27300 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65   jump */.  Btree
27310 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74   *pBt;..  assert
27320 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
27330 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
27340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
27350 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
27360 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b  <pOp->p1))!=0 );
27370 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
27380 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
27390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
273a0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 70 42 74  eeIncrVacuum(pBt
273b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
273c0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
273d0 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
273e0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
273f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  E_OK;.  }.  brea
27400 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
27410 4f 70 63 6f 64 65 3a 20 45 78 70 69 72 65 20 50  Opcode: Expire P
27420 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
27430 43 61 75 73 65 20 70 72 65 63 6f 6d 70 69 6c 65  Cause precompile
27440 64 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  d statements to 
27450 62 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20  become expired. 
27460 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
27470 6d 65 6e 74 0a 2a 2a 20 66 61 69 6c 73 20 77 69  ment.** fails wi
27480 74 68 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  th an error code
27490 20 6f 66 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   of SQLITE_SCHEM
274a0 41 20 69 66 20 69 74 20 69 73 20 65 76 65 72 20  A if it is ever 
274b0 65 78 65 63 75 74 65 64 20 0a 2a 2a 20 28 76 69  executed .** (vi
274c0 61 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  a sqlite3_step()
274d0 29 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 20  )..** .** If P1 
274e0 69 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c 20 53  is 0, then all S
274f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
27500 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20 49 66  come expired. If
27510 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   P1 is non-zero,
27520 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  .** then only th
27530 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65 63  e currently exec
27540 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  uting statement 
27550 69 73 20 61 66 66 65 63 74 65 64 2e 20 0a 2a 2f  is affected. .*/
27560 0a 63 61 73 65 20 4f 50 5f 45 78 70 69 72 65 3a  .case OP_Expire:
27570 20 7b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70   {.  if( !pOp->p
27580 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
27590 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
275a0 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
275b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78  }else{.    p->ex
275c0 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  pired = 1;.  }. 
275d0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
275e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
275f0 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f  HARED_CACHE./* O
27600 70 63 6f 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b  pcode: TableLock
27610 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
27620 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f  *.** Obtain a lo
27630 63 6b 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ck on a particul
27640 61 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69  ar table. This i
27650 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e  nstruction is on
27660 6c 79 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20  ly used when.** 
27670 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
27680 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62   feature is enab
27690 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50  led. .**.** If P
276a0 31 20 69 73 20 20 74 68 65 20 69 6e 64 65 78 20  1 is  the index 
276b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
276c0 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  in sqlite3.aDb[]
276d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
276e0 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65  .** on which the
276f0 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65   lock is acquire
27700 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b 20 69  d.  A readlock i
27710 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20 50 33  s obtained if P3
27720 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74  ==0 or.** a writ
27730 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e  e lock if P3==1.
27740 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69  .**.** P2 contai
27750 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ns the root-page
27760 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
27770 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20   lock..**.** P4 
27780 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
27790 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f  er to the name o
277a0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
277b0 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20 69  g locked. This i
277c0 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74  s only.** used t
277d0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  o generate an er
277e0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 74  ror message if t
277f0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
27800 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63  e obtained..*/.c
27810 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  ase OP_TableLock
27820 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 0a 20 20  : {.  int p1;.  
27830 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a  u8 isWriteLock;.
27840 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
27850 20 0a 20 20 69 73 57 72 69 74 65 4c 6f 63 6b 20   .  isWriteLock 
27860 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20  = (u8)pOp->p3;. 
27870 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
27880 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  & p1<db->nDb );.
27890 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
278a0 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 31  reeMask & (1<<p1
278b0 29 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))!=0 );.  asser
278c0 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d  t( isWriteLock==
278d0 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  0 || isWriteLock
278e0 3d 3d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==1 );.  rc = sq
278f0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
27900 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e  ble(db->aDb[p1].
27910 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73  pBt, pOp->p2, is
27920 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 69 66  WriteLock);.  if
27930 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
27940 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
27950 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
27960 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
27970 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
27980 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
27990 62 2c 20 22 64 61 74 61 62 61 73 65 20 74 61 62  b, "database tab
279a0 6c 65 20 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73  le is locked: %s
279b0 22 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 62 72 65  ", z);.  }.  bre
279c0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
279d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
279e0 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
279f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27a00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
27a10 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e 20   Opcode: VBegin 
27a20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  * * * P4 *.**.**
27a30 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f 69   P4 may be a poi
27a40 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
27a50 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
27a60 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74  e. If so, call t
27a70 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d 65  he .** xBegin me
27a80 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61  thod for that ta
27a90 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c  ble..**.** Also,
27aa0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
27ab0 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63 6b  P4 is set, check
27ac0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
27ad0 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  t being called f
27ae0 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20  rom.** within a 
27af0 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76 69  callback to a vi
27b00 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79 6e  rtual table xSyn
27b10 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20 69  c() method. If i
27b20 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72 0a  t is, the error.
27b30 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  ** code will be 
27b40 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c 4f  set to SQLITE_LO
27b50 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  CKED..*/.case OP
27b60 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 73 71 6c  _VBegin: {.  sql
27b70 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
27b80 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d  ;.  pVtab = pOp-
27b90 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 72 63 20  >p4.pVtab;.  rc 
27ba0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 42 65 67  = sqlite3VtabBeg
27bb0 69 6e 28 64 62 2c 20 70 56 74 61 62 29 3b 0a 20  in(db, pVtab);. 
27bc0 20 69 66 28 20 70 56 74 61 62 20 29 7b 0a 20 20   if( pVtab ){.  
27bd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27be0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
27bf0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
27c00 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  = pVtab->zErrMsg
27c10 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
27c20 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rMsg = 0;.  }.  
27c30 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
27c40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
27c50 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
27c60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27c70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
27c80 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72 65  ./* Opcode: VCre
27c90 61 74 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ate P1 * * P4 *.
27ca0 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 20  **.** P4 is the 
27cb0 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61  name of a virtua
27cc0 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62  l table in datab
27cd0 61 73 65 20 50 31 2e 20 43 61 6c 6c 20 74 68 65  ase P1. Call the
27ce0 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 0a   xCreate method.
27cf0 2a 2a 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  ** for that tabl
27d00 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43  e..*/.case OP_VC
27d10 72 65 61 74 65 3a 20 7b 0a 20 20 72 63 20 3d 20  reate: {.  rc = 
27d20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
27d30 72 65 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70  reate(db, pOp->p
27d40 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 26 70  1, pOp->p4.z, &p
27d50 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 62 72  ->zErrMsg);.  br
27d60 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
27d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
27d80 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
27d90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27da0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
27db0 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65 73 74 72  * Opcode: VDestr
27dc0 6f 79 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  oy P1 * * P4 *.*
27dd0 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65 20 6e  *.** P4 is the n
27de0 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c  ame of a virtual
27df0 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61   table in databa
27e00 73 65 20 50 31 2e 20 20 43 61 6c 6c 20 74 68 65  se P1.  Call the
27e10 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64   xDestroy method
27e20 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c  .** of that tabl
27e30 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 44  e..*/.case OP_VD
27e40 65 73 74 72 6f 79 3a 20 7b 0a 20 20 70 2d 3e 69  estroy: {.  p->i
27e50 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 32 3b  nVtabMethod = 2;
27e60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
27e70 74 61 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64  tabCallDestroy(d
27e80 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  b, pOp->p1, pOp-
27e90 3e 70 34 2e 7a 29 3b 0a 20 20 70 2d 3e 69 6e 56  >p4.z);.  p->inV
27ea0 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
27eb0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
27ec0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
27ed0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
27ee0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27ef0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
27f00 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70  E./* Opcode: VOp
27f10 65 6e 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  en P1 * * P4 *.*
27f20 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
27f30 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75 61  nter to a virtua
27f40 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20  l table object, 
27f50 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
27f60 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31  structure..** P1
27f70 20 69 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d   is a cursor num
27f80 62 65 72 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ber.  This opcod
27f90 65 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72  e opens a cursor
27fa0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 0a   to the virtual.
27fb0 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f  ** table and sto
27fc0 72 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  res that cursor 
27fd0 69 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f  in P1..*/.case O
27fe0 50 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62  P_VOpen: {.  Vdb
27ff0 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  eCursor *pCur;. 
28000 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
28010 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
28020 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r;.  sqlite3_vta
28030 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  b *pVtab;.  sqli
28040 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
28050 75 6c 65 3b 0a 0a 20 20 70 43 75 72 20 3d 20 30  ule;..  pCur = 0
28060 3b 0a 20 20 70 56 74 61 62 43 75 72 73 6f 72 20  ;.  pVtabCursor 
28070 3d 20 30 3b 0a 20 20 70 56 74 61 62 20 3d 20 70  = 0;.  pVtab = p
28080 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20  Op->p4.pVtab;.  
28090 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71 6c 69 74  pModule = (sqlit
280a0 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61  e3_module *)pVta
280b0 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73  b->pModule;.  as
280c0 73 65 72 74 28 70 56 74 61 62 20 26 26 20 70 4d  sert(pVtab && pM
280d0 6f 64 75 6c 65 29 3b 0a 20 20 69 66 28 20 73 71  odule);.  if( sq
280e0 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
280f0 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  b) ) goto abort_
28100 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20  due_to_misuse;. 
28110 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
28120 4f 70 65 6e 28 70 56 74 61 62 2c 20 26 70 56 74  Open(pVtab, &pVt
28130 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 73 71 6c  abCursor);.  sql
28140 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
28150 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
28160 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62  >zErrMsg = pVtab
28170 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70 56 74  ->zErrMsg;.  pVt
28180 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
28190 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61  .  if( sqlite3Sa
281a0 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74  fetyOn(db) ) got
281b0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
281c0 69 73 75 73 65 3b 0a 20 20 69 66 28 20 53 51 4c  isuse;.  if( SQL
281d0 49 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20  ITE_OK==rc ){.  
281e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
281f0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
28200 73 6f 72 20 62 61 73 65 20 63 6c 61 73 73 20 2a  sor base class *
28210 2f 0a 20 20 20 20 70 56 74 61 62 43 75 72 73 6f  /.    pVtabCurso
28220 72 2d 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62  r->pVtab = pVtab
28230 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ;..    /* Initia
28240 6c 69 73 65 20 76 64 62 65 20 63 75 72 73 6f 72  lise vdbe cursor
28250 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 70   object */.    p
28260 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75  Cur = allocateCu
28270 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c  rsor(p, pOp->p1,
28280 20 30 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20   0, -1, 0);.    
28290 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
282a0 20 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72    pCur->pVtabCur
282b0 73 6f 72 20 3d 20 70 56 74 61 62 43 75 72 73 6f  sor = pVtabCurso
282c0 72 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  r;.      pCur->p
282d0 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75  Module = pVtabCu
282e0 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f  rsor->pVtab->pMo
282f0 64 75 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dule;.    }else{
28300 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
28310 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
28320 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
28330 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
28340 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
28350 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
28360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28370 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
28380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28390 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
283a0 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74 65 72   Opcode: VFilter
283b0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
283c0 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72  *.** P1 is a cur
283d0 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  sor opened using
283e0 20 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61   VOpen.  P2 is a
283f0 6e 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  n address to jum
28400 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66  p to if.** the f
28410 69 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20 73  iltered result s
28420 65 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  et is empty..**.
28430 2a 2a 20 50 34 20 69 73 20 65 69 74 68 65 72 20  ** P4 is either 
28440 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67  NULL or a string
28450 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
28460 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
28470 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20  Index.** method 
28480 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20  of the module.  
28490 54 68 65 20 69 6e 74 65 72 70 72 65 74 61 74 69  The interpretati
284a0 6f 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74 72  on of the P4 str
284b0 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74  ing is left.** t
284c0 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70  o the module imp
284d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
284e0 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
284f0 6e 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74  nvokes the xFilt
28500 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65  er method on the
28510 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73   virtual table s
28520 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50  pecified.** by P
28530 31 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20  1.  The integer 
28540 71 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d  query plan param
28550 65 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20  eter to xFilter 
28560 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
28570 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67  ister.** P3. Reg
28580 69 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65  ister P3+1 store
28590 73 20 74 68 65 20 61 72 67 63 20 70 61 72 61 6d  s the argc param
285a0 65 74 65 72 20 74 6f 20 62 65 20 70 61 73 73 65  eter to be passe
285b0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c  d to the.** xFil
285c0 74 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69  ter method. Regi
285d0 73 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31  sters P3+2..P3+1
285e0 2b 61 72 67 63 20 61 72 65 20 74 68 65 20 61 72  +argc are the ar
285f0 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  gc.** additional
28600 20 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63   parameters whic
28610 68 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a  h are passed to.
28620 2a 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61 72  ** xFilter as ar
28630 67 76 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b  gv. Register P3+
28640 32 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30  2 becomes argv[0
28650 5d 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f  ] when passed to
28660 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   xFilter..**.** 
28670 41 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74  A jump is made t
28680 6f 20 50 32 20 69 66 20 74 68 65 20 72 65 73 75  o P2 if the resu
28690 6c 74 20 73 65 74 20 61 66 74 65 72 20 66 69 6c  lt set after fil
286a0 74 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20  tering would be 
286b0 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  empty..*/.case O
286c0 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f  P_VFilter: {   /
286d0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  * jump */.  int 
286e0 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65  nArg;.  int iQue
286f0 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  ry;.  const sqli
28700 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
28710 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65  ule;.  Mem *pQue
28720 72 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63  ry;.  Mem *pArgc
28730 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
28740 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
28750 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rsor;.  sqlite3_
28760 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56  vtab *pVtab;.  V
28770 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
28780 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
28790 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41  t i;.  Mem **apA
287a0 72 67 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20  rg;..  pQuery = 
287b0 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  &p->aMem[pOp->p3
287c0 5d 3b 0a 20 20 70 41 72 67 63 20 3d 20 26 70 51  ];.  pArgc = &pQ
287d0 75 65 72 79 5b 31 5d 3b 0a 20 20 70 43 75 72 20  uery[1];.  pCur 
287e0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
287f0 70 31 5d 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  p1];.  REGISTER_
28800 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
28810 51 75 65 72 79 29 3b 0a 20 20 61 73 73 65 72 74  Query);.  assert
28820 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  ( pCur->pVtabCur
28830 73 6f 72 20 29 3b 0a 20 20 70 56 74 61 62 43 75  sor );.  pVtabCu
28840 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 56 74  rsor = pCur->pVt
28850 61 62 43 75 72 73 6f 72 3b 0a 20 20 70 56 74 61  abCursor;.  pVta
28860 62 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d  b = pVtabCursor-
28870 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
28880 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
28890 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  le;..  /* Grab t
288a0 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  he index number 
288b0 61 6e 64 20 61 72 67 63 20 70 61 72 61 6d 65 74  and argc paramet
288c0 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
288d0 20 28 70 51 75 65 72 79 2d 3e 66 6c 61 67 73 26   (pQuery->flags&
288e0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26 26 20 70  MEM_Int)!=0 && p
288f0 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  Argc->flags==MEM
28900 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72 67 20 3d  _Int );.  nArg =
28910 20 28 69 6e 74 29 70 41 72 67 63 2d 3e 75 2e 69   (int)pArgc->u.i
28920 3b 0a 20 20 69 51 75 65 72 79 20 3d 20 28 69 6e  ;.  iQuery = (in
28930 74 29 70 51 75 65 72 79 2d 3e 75 2e 69 3b 0a 0a  t)pQuery->u.i;..
28940 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
28950 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 2a  xFilter method *
28960 2f 0a 20 20 7b 0a 20 20 20 20 72 65 73 20 3d 20  /.  {.    res = 
28970 30 3b 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70  0;.    apArg = p
28980 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 66 6f 72  ->apArg;.    for
28990 28 69 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20  (i = 0; i<nArg; 
289a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 41 72  i++){.      apAr
289b0 67 5b 69 5d 20 3d 20 26 70 41 72 67 63 5b 69 2b  g[i] = &pArgc[i+
289c0 31 5d 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 54  1];.      storeT
289d0 79 70 65 49 6e 66 6f 28 61 70 41 72 67 5b 69 5d  ypeInfo(apArg[i]
289e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
289f0 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
28a00 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f  tyOff(db) ) goto
28a10 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69   abort_due_to_mi
28a20 73 75 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  suse;.    sqlite
28a30 33 56 74 61 62 4c 6f 63 6b 28 70 56 74 61 62 29  3VtabLock(pVtab)
28a40 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
28a50 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 72  ethod = 1;.    r
28a60 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 46 69  c = pModule->xFi
28a70 6c 74 65 72 28 70 56 74 61 62 43 75 72 73 6f 72  lter(pVtabCursor
28a80 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e 70  , iQuery, pOp->p
28a90 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72 67  4.z, nArg, apArg
28aa0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
28ab0 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 20 20  Method = 0;.    
28ac0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
28ad0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
28ae0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
28af0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a  pVtab->zErrMsg;.
28b00 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d      pVtab->zErrM
28b10 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  sg = 0;.    sqli
28b20 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 64 62  te3VtabUnlock(db
28b30 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66  , pVtab);.    if
28b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28b50 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
28b60 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 74  Module->xEof(pVt
28b70 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  abCursor);.    }
28b80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
28b90 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67  SafetyOn(db) ) g
28ba0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
28bb0 5f 6d 69 73 75 73 65 3b 0a 0a 20 20 20 20 69 66  _misuse;..    if
28bc0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 70  ( res ){.      p
28bd0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
28be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
28bf0 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  r->nullRow = 0;.
28c00 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
28c10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28c20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
28c30 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
28c40 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28c50 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
28c60 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20  Column P1 P2 P3 
28c70 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  * *.**.** Store 
28c80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
28c90 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66   P2-th column of
28ca0 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f 66 20 74  .** the row of t
28cb0 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  he virtual-table
28cc0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 50 31   that the .** P1
28cd0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
28ce0 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72 65 67 69  ing to into regi
28cf0 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65  ster P3..*/.case
28d00 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20   OP_VColumn: {. 
28d10 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
28d20 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
28d30 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
28d40 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44  odule;.  Mem *pD
28d50 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  est;.  sqlite3_c
28d60 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b  ontext sContext;
28d70 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ..  VdbeCursor *
28d80 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  pCur = p->apCsr[
28d90 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
28da0 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61 62 43  rt( pCur->pVtabC
28db0 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
28dc0 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
28dd0 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
28de0 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 70   );.  pDest = &p
28df0 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b  ->aMem[pOp->p3];
28e00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c  .  if( pCur->nul
28e10 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  lRow ){.    sqli
28e20 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
28e30 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72  l(pDest);.    br
28e40 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62  eak;.  }.  pVtab
28e50 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43 75   = pCur->pVtabCu
28e60 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70  rsor->pVtab;.  p
28e70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
28e80 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72  pModule;.  asser
28e90 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c  t( pModule->xCol
28ea0 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  umn );.  memset(
28eb0 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69  &sContext, 0, si
28ec0 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29 29 3b  zeof(sContext));
28ed0 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75  ..  /* The outpu
28ee0 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61  t cell may alrea
28ef0 64 79 20 68 61 76 65 20 61 20 62 75 66 66 65 72  dy have a buffer
28f00 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65   allocated. Move
28f10 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  .  ** the curren
28f20 74 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 73 43  t contents to sC
28f30 6f 6e 74 65 78 74 2e 73 20 73 6f 20 69 6e 20 63  ontext.s so in c
28f40 61 73 65 20 74 68 65 20 75 73 65 72 2d 66 75 6e  ase the user-fun
28f50 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 63 61 6e 20  ction .  ** can 
28f60 75 73 65 20 74 68 65 20 61 6c 72 65 61 64 79 20  use the already 
28f70 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
28f80 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f   instead of allo
28f90 63 61 74 69 6e 67 20 61 20 0a 20 20 2a 2a 20 6e  cating a .  ** n
28fa0 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73  ew one..  */.  s
28fb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
28fc0 65 28 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 70  e(&sContext.s, p
28fd0 44 65 73 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54  Dest);.  MemSetT
28fe0 79 70 65 46 6c 61 67 28 26 73 43 6f 6e 74 65 78  ypeFlag(&sContex
28ff0 74 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  t.s, MEM_Null);.
29000 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61  .  if( sqlite3Sa
29010 66 65 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f  fetyOff(db) ) go
29020 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
29030 6d 69 73 75 73 65 3b 0a 20 20 72 63 20 3d 20 70  misuse;.  rc = p
29040 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e 28  Module->xColumn(
29050 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
29060 72 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f  r, &sContext, pO
29070 70 2d 3e 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  p->p2);.  sqlite
29080 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
29090 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
290a0 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a  rrMsg = pVtab->z
290b0 45 72 72 4d 73 67 3b 0a 20 20 70 56 74 61 62 2d  ErrMsg;.  pVtab-
290c0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
290d0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65 73   /* Copy the res
290e0 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
290f0 69 6f 6e 20 74 6f 20 74 68 65 20 50 33 20 72 65  ion to the P3 re
29100 67 69 73 74 65 72 2e 20 57 65 0a 20 20 2a 2a 20  gister. We.  ** 
29110 64 6f 20 74 68 69 73 20 72 65 67 61 72 64 6c 65  do this regardle
29120 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
29130 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 6f 63   not an error oc
29140 63 75 72 72 65 64 20 74 6f 20 65 6e 73 75 72 65  curred to ensure
29150 20 61 6e 79 0a 20 20 2a 2a 20 64 79 6e 61 6d 69   any.  ** dynami
29160 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  c allocation in 
29170 73 43 6f 6e 74 65 78 74 2e 73 20 28 61 20 4d 65  sContext.s (a Me
29180 6d 20 73 74 72 75 63 74 29 20 69 73 20 20 72 65  m struct) is  re
29190 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  leased..  */.  s
291a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
291b0 45 6e 63 6f 64 69 6e 67 28 26 73 43 6f 6e 74 65  Encoding(&sConte
291c0 78 74 2e 73 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  xt.s, encoding);
291d0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
291e0 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74  E(pOp->p3, pDest
291f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
29200 4d 65 6d 4d 6f 76 65 28 70 44 65 73 74 2c 20 26  MemMove(pDest, &
29210 73 43 6f 6e 74 65 78 74 2e 73 29 3b 0a 20 20 55  sContext.s);.  U
29220 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
29230 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20 20 69 66  ZE(pDest);..  if
29240 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  ( sqlite3SafetyO
29250 6e 28 64 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  n(db) ){.    got
29260 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
29270 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 69 66 28  isuse;.  }.  if(
29280 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
29290 6f 6f 42 69 67 28 70 44 65 73 74 29 20 29 7b 0a  ooBig(pDest) ){.
292a0 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
292b0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
292c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
292d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
292e0 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
292f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
29300 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
29310 64 65 3a 20 56 4e 65 78 74 20 50 31 20 50 32 20  de: VNext P1 P2 
29320 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61  * * *.**.** Adva
29330 6e 63 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  nce virtual tabl
29340 65 20 50 31 20 74 6f 20 74 68 65 20 6e 65 78 74  e P1 to the next
29350 20 72 6f 77 20 69 6e 20 69 74 73 20 72 65 73 75   row in its resu
29360 6c 74 20 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75  lt set and.** ju
29370 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
29380 6e 20 50 32 2e 20 20 4f 72 2c 20 69 66 20 74 68  n P2.  Or, if th
29390 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
293a0 68 61 73 20 72 65 61 63 68 65 64 0a 2a 2a 20 74  has reached.** t
293b0 68 65 20 65 6e 64 20 6f 66 20 69 74 73 20 72 65  he end of its re
293c0 73 75 6c 74 20 73 65 74 2c 20 74 68 65 6e 20 66  sult set, then f
293d0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
293e0 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
293f0 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
29400 56 4e 65 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75  VNext: {   /* ju
29410 6d 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  mp */.  sqlite3_
29420 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
29430 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
29440 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
29450 69 6e 74 20 72 65 73 3b 0a 20 20 56 64 62 65 43  int res;.  VdbeC
29460 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
29470 72 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 20  res = 0;.  pCur 
29480 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
29490 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
294a0 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  Cur->pVtabCursor
294b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
294c0 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62  nullRow ){.    b
294d0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61  reak;.  }.  pVta
294e0 62 20 3d 20 70 43 75 72 2d 3e 70 56 74 61 62 43  b = pCur->pVtabC
294f0 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20  ursor->pVtab;.  
29500 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
29510 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65  >pModule;.  asse
29520 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  rt( pModule->xNe
29530 78 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  xt );..  /* Invo
29540 6b 65 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d  ke the xNext() m
29550 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64  ethod of the mod
29560 75 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ule. There is no
29570 20 77 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a   way for the.  *
29580 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70  * underlying imp
29590 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72  lementation to r
295a0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
295b0 66 20 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72  f one occurs dur
295c0 69 6e 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29  ing.  ** xNext()
295d0 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e  . Instead, if an
295e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
295f0 72 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  rue is returned 
29600 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
29610 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61   .  ** data is a
29620 76 61 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68  vailable) and th
29630 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  e error code ret
29640 75 72 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75  urned when xColu
29650 6d 6e 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20  mn or.  ** some 
29660 6f 74 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20  other method is 
29670 6e 65 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  next invoked on 
29680 74 68 65 20 73 61 76 65 20 76 69 72 74 75 61 6c  the save virtual
29690 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20   table cursor.. 
296a0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
296b0 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 20 29  3SafetyOff(db) )
296c0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
296d0 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 73 71 6c  to_misuse;.  sql
296e0 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 70 56 74  ite3VtabLock(pVt
296f0 61 62 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61 62  ab);.  p->inVtab
29700 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 72 63  Method = 1;.  rc
29710 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78   = pModule->xNex
29720 74 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  t(pCur->pVtabCur
29730 73 6f 72 29 3b 0a 20 20 70 2d 3e 69 6e 56 74 61  sor);.  p->inVta
29740 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 73  bMethod = 0;.  s
29750 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
29760 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
29770 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70 56 74  p->zErrMsg = pVt
29780 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 70  ab->zErrMsg;.  p
29790 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
297a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  0;.  sqlite3Vtab
297b0 55 6e 6c 6f 63 6b 28 64 62 2c 20 70 56 74 61 62  Unlock(db, pVtab
297c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
297d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
297e0 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f  s = pModule->xEo
297f0 66 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72  f(pCur->pVtabCur
29800 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sor);.  }.  if( 
29810 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
29820 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  db) ) goto abort
29830 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a  _due_to_misuse;.
29840 0a 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20  .  if( !res ){. 
29850 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
29860 73 20 64 61 74 61 2c 20 6a 75 6d 70 20 74 6f 20  s data, jump to 
29870 50 32 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70  P2 */.    pc = p
29880 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
29890 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
298a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
298b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
298c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
298d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
298e0 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52  LE./* Opcode: VR
298f0 65 6e 61 6d 65 20 50 31 20 2a 20 2a 20 50 34 20  ename P1 * * P4 
29900 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
29910 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69 72  pointer to a vir
29920 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63  tual table objec
29930 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  t, an sqlite3_vt
29940 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ab structure..**
29950 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76   This opcode inv
29960 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73 70  okes the corresp
29970 6f 6e 64 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d  onding xRename m
29980 65 74 68 6f 64 2e 20 54 68 65 20 76 61 6c 75 65  ethod. The value
29990 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
299a0 50 31 20 69 73 20 70 61 73 73 65 64 20 61 73 20  P1 is passed as 
299b0 74 68 65 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65  the zName argume
299c0 6e 74 20 74 6f 20 74 68 65 20 78 52 65 6e 61 6d  nt to the xRenam
299d0 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73  e method..*/.cas
299e0 65 20 4f 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a  e OP_VRename: {.
299f0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
29a00 70 56 74 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e  pVtab;.  Mem *pN
29a10 61 6d 65 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20  ame;..  pVtab = 
29a20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
29a30 20 70 4e 61 6d 65 20 3d 20 26 70 2d 3e 61 4d 65   pName = &p->aMe
29a40 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
29a50 73 65 72 74 28 20 70 56 74 61 62 2d 3e 70 4d 6f  sert( pVtab->pMo
29a60 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29 3b  dule->xRename );
29a70 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
29a80 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e 61 6d 65  E(pOp->p1, pName
29a90 29 3b 0a 0a 20 20 53 74 72 69 6e 67 69 66 79 28  );..  Stringify(
29aa0 70 4e 61 6d 65 2c 20 65 6e 63 6f 64 69 6e 67 29  pName, encoding)
29ab0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
29ac0 53 61 66 65 74 79 4f 66 66 28 64 62 29 20 29 20  SafetyOff(db) ) 
29ad0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
29ae0 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 73 71 6c 69  o_misuse;.  sqli
29af0 74 65 33 56 74 61 62 4c 6f 63 6b 28 70 56 74 61  te3VtabLock(pVta
29b00 62 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  b);.  rc = pVtab
29b10 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61  ->pModule->xRena
29b20 6d 65 28 70 56 74 61 62 2c 20 70 4e 61 6d 65 2d  me(pVtab, pName-
29b30 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >z);.  sqlite3Db
29b40 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
29b50 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
29b60 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72  sg = pVtab->zErr
29b70 4d 73 67 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  Msg;.  pVtab->zE
29b80 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c  rrMsg = 0;.  sql
29b90 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 64  ite3VtabUnlock(d
29ba0 62 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28  b, pVtab);.  if(
29bb0 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
29bc0 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72  (db) ) goto abor
29bd0 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b  t_due_to_misuse;
29be0 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ..  break;.}.#en
29bf0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
29c00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29c10 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
29c20 20 56 55 70 64 61 74 65 20 50 31 20 50 32 20 50   VUpdate P1 P2 P
29c30 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  3 P4 *.**.** P4 
29c40 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
29c50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
29c60 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74  object, an sqlit
29c70 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
29c80 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  e..** This opcod
29c90 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  e invokes the co
29ca0 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 55 70 64  rresponding xUpd
29cb0 61 74 65 20 6d 65 74 68 6f 64 2e 20 50 32 20 76  ate method. P2 v
29cc0 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6e  alues.** are con
29cd0 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 63  tiguous memory c
29ce0 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 20 61 74  ells starting at
29cf0 20 50 33 20 74 6f 20 70 61 73 73 20 74 6f 20 74   P3 to pass to t
29d00 68 65 20 78 55 70 64 61 74 65 20 0a 2a 2a 20 69  he xUpdate .** i
29d10 6e 76 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 76  nvocation. The v
29d20 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
29d30 20 28 50 33 2b 50 32 2d 31 29 20 63 6f 72 72 65   (P3+P2-1) corre
29d40 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 0a 2a  sponds to the .*
29d50 2a 20 70 32 74 68 20 65 6c 65 6d 65 6e 74 20 6f  * p2th element o
29d60 66 20 74 68 65 20 61 72 67 76 20 61 72 72 61 79  f the argv array
29d70 20 70 61 73 73 65 64 20 74 6f 20 78 55 70 64 61   passed to xUpda
29d80 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 55  te..**.** The xU
29d90 70 64 61 74 65 20 6d 65 74 68 6f 64 20 77 69 6c  pdate method wil
29da0 6c 20 64 6f 20 61 20 44 45 4c 45 54 45 20 6f 72  l do a DELETE or
29db0 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 62 6f   an INSERT or bo
29dc0 74 68 2e 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b  th..** The argv[
29dd0 30 5d 20 65 6c 65 6d 65 6e 74 20 28 77 68 69 63  0] element (whic
29de0 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  h corresponds to
29df0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 50 33 29   memory cell P3)
29e00 0a 2a 2a 20 69 73 20 74 68 65 20 72 6f 77 69 64  .** is the rowid
29e10 20 6f 66 20 61 20 72 6f 77 20 74 6f 20 64 65 6c   of a row to del
29e20 65 74 65 2e 20 20 49 66 20 61 72 67 76 5b 30 5d  ete.  If argv[0]
29e30 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6e 6f   is NULL then no
29e40 20 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63   .** deletion oc
29e50 63 75 72 73 2e 20 20 54 68 65 20 61 72 67 76 5b  curs.  The argv[
29e60 31 5d 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68  1] element is th
29e70 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  e rowid of the n
29e80 65 77 20 0a 2a 2a 20 72 6f 77 2e 20 20 54 68 69  ew .** row.  Thi
29e90 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 74 6f  s can be NULL to
29ea0 20 68 61 76 65 20 74 68 65 20 76 69 72 74 75 61   have the virtua
29eb0 6c 20 74 61 62 6c 65 20 73 65 6c 65 63 74 20 74  l table select t
29ec0 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 69 64  he new .** rowid
29ed0 20 66 6f 72 20 69 74 73 65 6c 66 2e 20 20 54 68   for itself.  Th
29ee0 65 20 73 75 62 73 65 71 75 65 6e 74 20 65 6c 65  e subsequent ele
29ef0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 61 72 72  ments in the arr
29f00 61 79 20 61 72 65 20 0a 2a 2a 20 74 68 65 20 76  ay are .** the v
29f10 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  alues of columns
29f20 20 69 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 2e   in the new row.
29f30 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20  .**.** If P2==1 
29f40 74 68 65 6e 20 6e 6f 20 69 6e 73 65 72 74 20 69  then no insert i
29f50 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 61 72  s performed.  ar
29f60 67 76 5b 30 5d 20 69 73 20 74 68 65 20 72 6f 77  gv[0] is the row
29f70 69 64 20 6f 66 0a 2a 2a 20 61 20 72 6f 77 20 74  id of.** a row t
29f80 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20  o delete..**.** 
29f90 50 31 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  P1 is a boolean 
29fa0 66 6c 61 67 2e 20 49 66 20 69 74 20 69 73 20 73  flag. If it is s
29fb0 65 74 20 74 6f 20 74 72 75 65 20 61 6e 64 20 74  et to true and t
29fc0 68 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 0a  he xUpdate call.
29fd0 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
29fe0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
29ff0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2a000 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
2a010 5f 72 6f 77 69 64 28 29 20 0a 2a 2a 20 69 73 20  _rowid() .** is 
2a020 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
2a030 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f   of the rowid fo
2a040 72 20 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69  r the row just i
2a050 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 63 61 73 65  nserted..*/.case
2a060 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
2a070 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2a080 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Vtab;.  sqlite3_
2a090 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
2a0a0 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69  .  int nArg;.  i
2a0b0 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69  nt i;.  sqlite_i
2a0c0 6e 74 36 34 20 72 6f 77 69 64 3b 0a 20 20 4d 65  nt64 rowid;.  Me
2a0d0 6d 20 2a 2a 61 70 41 72 67 3b 0a 20 20 4d 65 6d  m **apArg;.  Mem
2a0e0 20 2a 70 58 3b 0a 0a 20 20 70 56 74 61 62 20 3d   *pX;..  pVtab =
2a0f0 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a   pOp->p4.pVtab;.
2a100 20 20 70 4d 6f 64 75 6c 65 20 3d 20 28 73 71 6c    pModule = (sql
2a110 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56  ite3_module *)pV
2a120 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
2a130 6e 41 72 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  nArg = pOp->p2;.
2a140 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2a150 34 74 79 70 65 3d 3d 50 34 5f 56 54 41 42 20 29  4type==P4_VTAB )
2a160 3b 0a 20 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d  ;.  if( pModule-
2a170 3e 78 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20  >xUpdate==0 ){. 
2a180 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2a190 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
2a1a0 20 64 62 2c 20 22 72 65 61 64 2d 6f 6e 6c 79 20   db, "read-only 
2a1b0 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 72 63 20  table");.    rc 
2a1c0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2a1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 70 41    }else{.    apA
2a1e0 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20  rg = p->apArg;. 
2a1f0 20 20 20 70 58 20 3d 20 26 70 2d 3e 61 4d 65 6d     pX = &p->aMem
2a200 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 66  [pOp->p3];.    f
2a210 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
2a220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  i++){.      stor
2a230 65 54 79 70 65 49 6e 66 6f 28 70 58 2c 20 30 29  eTypeInfo(pX, 0)
2a240 3b 0a 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d  ;.      apArg[i]
2a250 20 3d 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b   = pX;.      pX+
2a260 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
2a270 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
2a280 66 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f  f(db) ) goto abo
2a290 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65  rt_due_to_misuse
2a2a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
2a2b0 62 4c 6f 63 6b 28 70 56 74 61 62 29 3b 0a 20 20  bLock(pVtab);.  
2a2c0 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2a2d0 78 55 70 64 61 74 65 28 70 56 74 61 62 2c 20 6e  xUpdate(pVtab, n
2a2e0 41 72 67 2c 20 61 70 41 72 67 2c 20 26 72 6f 77  Arg, apArg, &row
2a2f0 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
2a300 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
2a310 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
2a320 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e  ErrMsg = pVtab->
2a330 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 56 74  zErrMsg;.    pVt
2a340 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
2a350 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
2a360 55 6e 6c 6f 63 6b 28 64 62 2c 20 70 56 74 61 62  Unlock(db, pVtab
2a370 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
2a380 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29  e3SafetyOn(db) )
2a390 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2a3a0 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 20 20 69  to_misuse;.    i
2a3b0 66 28 20 70 4f 70 2d 3e 70 31 20 26 26 20 72 63  f( pOp->p1 && rc
2a3c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a3d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
2a3e0 67 3e 31 20 26 26 20 61 70 41 72 67 5b 30 5d 20  g>1 && apArg[0] 
2a3f0 26 26 20 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c  && (apArg[0]->fl
2a400 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b  ags&MEM_Null) );
2a410 0a 20 20 20 20 20 20 64 62 2d 3e 6c 61 73 74 52  .      db->lastR
2a420 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20  owid = rowid;.  
2a430 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e    }.    p->nChan
2a440 67 65 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  ge++;.  }.  brea
2a450 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2a460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2a470 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
2a480 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  def  SQLITE_OMIT
2a490 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
2a4a0 2a 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 63 6f  * Opcode: Pageco
2a4b0 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  unt P1 P2 * * *.
2a4c0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
2a4d0 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
2a4e0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2a4f0 61 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79  ase P1 to memory
2a500 20 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73   cell P2..*/.cas
2a510 65 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20  e OP_Pagecount: 
2a520 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
2a530 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
2a540 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 0a 20 20 69  */.  int p1;.  i
2a550 6e 74 20 6e 50 61 67 65 3b 0a 20 20 50 61 67 65  nt nPage;.  Page
2a560 72 20 2a 70 50 61 67 65 72 3b 0a 0a 20 20 70 31  r *pPager;..  p1
2a570 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 70   = pOp->p1; .  p
2a580 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
2a590 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
2a5a0 62 5b 70 31 5d 2e 70 42 74 29 3b 0a 20 20 72 63  b[p1].pBt);.  rc
2a5b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2a5c0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2a5d0 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
2a5e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a5f0 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
2a600 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
2a610 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 6e 50 61 67  pOut->u.i = nPag
2a620 65 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  e;.  }.  break;.
2a630 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
2a640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
2a650 41 43 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  ACE./* Opcode: T
2a660 72 61 63 65 20 2a 20 2a 20 2a 20 50 34 20 2a 0a  race * * * P4 *.
2a670 2a 2a 0a 2a 2a 20 49 66 20 74 72 61 63 69 6e 67  **.** If tracing
2a680 20 69 73 20 65 6e 61 62 6c 65 64 20 28 62 79 20   is enabled (by 
2a690 74 68 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63  the sqlite3_trac
2a6a0 65 28 29 29 20 69 6e 74 65 72 66 61 63 65 2c 20  e()) interface, 
2a6b0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 55 54 46 2d  then.** the UTF-
2a6c0 38 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  8 string contain
2a6d0 65 64 20 69 6e 20 50 34 20 69 73 20 65 6d 69 74  ed in P4 is emit
2a6e0 74 65 64 20 6f 6e 20 74 68 65 20 74 72 61 63 65  ted on the trace
2a6f0 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61   callback..*/.ca
2a700 73 65 20 4f 50 5f 54 72 61 63 65 3a 20 7b 0a 20  se OP_Trace: {. 
2a710 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 0a   char *zTrace;..
2a720 20 20 7a 54 72 61 63 65 20 3d 20 28 70 4f 70 2d    zTrace = (pOp-
2a730 3e 70 34 2e 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e  >p4.z ? pOp->p4.
2a740 7a 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  z : p->zSql);.  
2a750 69 66 28 20 7a 54 72 61 63 65 20 29 7b 0a 20 20  if( zTrace ){.  
2a760 20 20 69 66 28 20 64 62 2d 3e 78 54 72 61 63 65    if( db->xTrace
2a770 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 54   ){.      db->xT
2a780 72 61 63 65 28 64 62 2d 3e 70 54 72 61 63 65 41  race(db->pTraceA
2a790 72 67 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20  rg, zTrace);.   
2a7a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2a7b0 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 28  _DEBUG.    if( (
2a7c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2a7d0 54 45 5f 53 71 6c 54 72 61 63 65 29 21 3d 30 20  TE_SqlTrace)!=0 
2a7e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a7f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 51 4c  DebugPrintf("SQL
2a800 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22 2c 20 7a  -trace: %s\n", z
2a810 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
2a820 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
2a830 45 42 55 47 20 2a 2f 0a 20 20 7d 0a 20 20 62 72  EBUG */.  }.  br
2a840 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  eak;.}.#endif...
2a850 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 6f 70 20  /* Opcode: Noop 
2a860 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  * * * * *.**.** 
2a870 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68 69  Do nothing.  Thi
2a880 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
2a890 20 6f 66 74 65 6e 20 75 73 65 66 75 6c 20 61 73   often useful as
2a8a0 20 61 20 6a 75 6d 70 0a 2a 2a 20 64 65 73 74 69   a jump.** desti
2a8b0 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  nation..*/./*.**
2a8c0 20 54 68 65 20 6d 61 67 69 63 20 45 78 70 6c 61   The magic Expla
2a8d0 69 6e 20 6f 70 63 6f 64 65 20 61 72 65 20 6f 6e  in opcode are on
2a8e0 6c 79 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  ly inserted when
2a8f0 20 65 78 70 6c 61 69 6e 3d 3d 32 20 28 77 68 69   explain==2 (whi
2a900 63 68 0a 2a 2a 20 69 73 20 74 6f 20 73 61 79 20  ch.** is to say 
2a910 77 68 65 6e 20 74 68 65 20 45 58 50 4c 41 49 4e  when the EXPLAIN
2a920 20 51 55 45 52 59 20 50 4c 41 4e 20 73 79 6e 74   QUERY PLAN synt
2a930 61 78 20 69 73 20 75 73 65 64 2e 29 0a 2a 2a 20  ax is used.).** 
2a940 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 63 6f  This opcode reco
2a950 72 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rds information 
2a960 66 72 6f 6d 20 74 68 65 20 6f 70 74 69 6d 69 7a  from the optimiz
2a970 65 72 2e 20 20 49 74 20 69 73 20 74 68 65 0a 2a  er.  It is the.*
2a980 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  * the same as a 
2a990 6e 6f 2d 6f 70 2e 20 20 54 68 69 73 20 6f 70 63  no-op.  This opc
2a9a0 6f 64 65 73 6e 65 76 65 72 20 61 70 70 65 61 72  odesnever appear
2a9b0 73 20 69 6e 20 61 20 72 65 61 6c 20 56 4d 20 70  s in a real VM p
2a9c0 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 64 65 66 61 75  rogram..*/.defau
2a9d0 6c 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f  lt: {          /
2a9e0 2a 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79  * This is really
2a9f0 20 4f 50 5f 4e 6f 6f 70 20 61 6e 64 20 4f 50 5f   OP_Noop and OP_
2aa00 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 62 72 65  Explain */.  bre
2aa10 61 6b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ak;.}../********
2aa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa60 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 73  *****.** The cas
2aa70 65 73 20 6f 66 20 74 68 65 20 73 77 69 74 63 68  es of the switch
2aa80 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 76 65   statement above
2aa90 20 74 68 69 73 20 6c 69 6e 65 20 73 68 6f 75 6c   this line shoul
2aaa0 64 20 61 6c 6c 20 62 65 20 69 6e 64 65 6e 74 65  d all be indente
2aab0 64 0a 2a 2a 20 62 79 20 36 20 73 70 61 63 65 73  d.** by 6 spaces
2aac0 2e 20 20 42 75 74 20 74 68 65 20 6c 65 66 74 2d  .  But the left-
2aad0 6d 6f 73 74 20 36 20 73 70 61 63 65 73 20 68 61  most 6 spaces ha
2aae0 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  ve been removed 
2aaf0 74 6f 20 69 6d 70 72 6f 76 65 20 74 68 65 0a 2a  to improve the.*
2ab00 2a 20 72 65 61 64 61 62 69 6c 69 74 79 2e 20 20  * readability.  
2ab10 46 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20  From this point 
2ab20 6f 6e 20 64 6f 77 6e 2c 20 74 68 65 20 6e 6f 72  on down, the nor
2ab30 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20  mal indentation 
2ab40 72 75 6c 65 73 20 61 72 65 0a 2a 2a 20 72 65 73  rules are.** res
2ab50 74 6f 72 65 64 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tored..*********
2ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aba0 2a 2a 2a 2a 2f 0a 20 20 20 20 7d 0a 0a 23 69 66  ****/.    }..#if
2abb0 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
2abc0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75 36 34  .    {.      u64
2abd0 20 65 6c 61 70 73 65 64 20 3d 20 73 71 6c 69 74   elapsed = sqlit
2abe0 65 33 48 77 74 69 6d 65 28 29 20 2d 20 73 74 61  e3Hwtime() - sta
2abf0 72 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 63  rt;.      pOp->c
2ac00 79 63 6c 65 73 20 2b 3d 20 65 6c 61 70 73 65 64  ycles += elapsed
2ac10 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 63 6e 74  ;.      pOp->cnt
2ac20 2b 2b 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20  ++;.#if 0.      
2ac30 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
2ac40 2c 20 22 25 31 30 6c 6c 75 20 22 2c 20 65 6c 61  , "%10llu ", ela
2ac50 70 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20 73  psed);.        s
2ac60 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2ac70 70 28 73 74 64 6f 75 74 2c 20 6f 72 69 67 50 63  p(stdout, origPc
2ac80 2c 20 26 70 2d 3e 61 4f 70 5b 6f 72 69 67 50 63  , &p->aOp[origPc
2ac90 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ]);.#endif.    }
2aca0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2acb0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
2acc0 64 65 20 61 64 64 73 20 6e 6f 74 68 69 6e 67 20  de adds nothing 
2acd0 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 75  to the actual fu
2ace0 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20  nctionality.    
2acf0 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ** of the progra
2ad00 6d 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 68  m.  It is only h
2ad10 65 72 65 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ere for testing 
2ad20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a 20  and debugging.. 
2ad30 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
2ad40 65 72 20 68 61 6e 64 2c 20 69 74 20 64 6f 65 73  er hand, it does
2ad50 20 62 75 72 6e 20 43 50 55 20 63 79 63 6c 65 73   burn CPU cycles
2ad60 20 65 76 65 72 79 20 74 69 6d 65 20 74 68 72 6f   every time thro
2ad70 75 67 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  ugh.    ** the e
2ad80 76 61 6c 75 61 74 6f 72 20 6c 6f 6f 70 2e 20 20  valuator loop.  
2ad90 53 6f 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20  So we can leave 
2ada0 69 74 20 6f 75 74 20 77 68 65 6e 20 4e 44 45 42  it out when NDEB
2adb0 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20  UG is defined.. 
2adc0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44     */.#ifndef ND
2add0 45 42 55 47 0a 20 20 20 20 61 73 73 65 72 74 28  EBUG.    assert(
2ade0 20 70 63 3e 3d 2d 31 20 26 26 20 70 63 3c 70 2d   pc>=-1 && pc<p-
2adf0 3e 6e 4f 70 20 29 3b 0a 0a 23 69 66 64 65 66 20  >nOp );..#ifdef 
2ae00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2ae10 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20 29 7b   if( p->trace ){
2ae20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
2ae30 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72   ) fprintf(p->tr
2ae40 61 63 65 2c 22 72 63 3d 25 64 5c 6e 22 2c 72 63  ace,"rc=%d\n",rc
2ae50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 50  );.      if( opP
2ae60 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f  roperty & OPFLG_
2ae70 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53 45 20  OUT2_PRERELEASE 
2ae80 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73  ){.        regis
2ae90 74 65 72 54 72 61 63 65 28 70 2d 3e 74 72 61 63  terTrace(p->trac
2aea0 65 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74  e, pOp->p2, pOut
2aeb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2aec0 20 69 66 28 20 6f 70 50 72 6f 70 65 72 74 79 20   if( opProperty 
2aed0 26 20 4f 50 46 4c 47 5f 4f 55 54 33 20 29 7b 0a  & OPFLG_OUT3 ){.
2aee0 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
2aef0 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 20  Trace(p->trace, 
2af00 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a  pOp->p3, pOut);.
2af10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2af20 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
2af30 44 45 42 55 47 20 2a 2f 0a 23 65 6e 64 69 66 20  DEBUG */.#endif 
2af40 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 20 20   /* NDEBUG */.  
2af50 7d 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66  }  /* The end of
2af60 20 74 68 65 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f   the for(;;) loo
2af70 70 20 74 68 65 20 6c 6f 6f 70 73 20 74 68 72 6f  p the loops thro
2af80 75 67 68 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 0a  ugh opcodes */..
2af90 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2afa0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
2afb0 6d 65 61 6e 73 20 74 68 61 74 20 65 78 65 63 75  means that execu
2afc0 74 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64  tion is finished
2afd0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 72   with.  ** an er
2afe0 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ror of some kind
2aff0 2e 0a 20 20 2a 2f 0a 76 64 62 65 5f 65 72 72 6f  ..  */.vdbe_erro
2b000 72 5f 68 61 6c 74 3a 0a 20 20 61 73 73 65 72 74  r_halt:.  assert
2b010 28 20 72 63 20 29 3b 0a 20 20 70 2d 3e 72 63 20  ( rc );.  p->rc 
2b020 3d 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 56  = rc;.  sqlite3V
2b030 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 69 66  dbeHalt(p);.  if
2b040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
2b050 52 52 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  RR_NOMEM ) db->m
2b060 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
2b070 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  .  rc = SQLITE_E
2b080 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  RROR;..  /* This
2b090 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
2b0a0 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f   out of this pro
2b0b0 63 65 64 75 72 65 2e 20 20 57 65 20 68 61 76 65  cedure.  We have
2b0c0 20 74 6f 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65   to.  ** release
2b0d0 20 74 68 65 20 6d 75 74 65 78 65 73 20 6f 6e 20   the mutexes on 
2b0e0 62 74 72 65 65 73 20 74 68 61 74 20 77 65 72 65  btrees that were
2b0f0 20 61 63 71 75 69 72 65 64 20 61 74 20 74 68 65   acquired at the
2b100 0a 20 20 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 64  .  ** top. */.vd
2b110 62 65 5f 72 65 74 75 72 6e 3a 0a 20 20 73 71 6c  be_return:.  sql
2b120 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
2b130 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
2b140 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
2b150 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  c;..  /* Jump to
2b160 20 68 65 72 65 20 69 66 20 61 20 73 74 72 69 6e   here if a strin
2b170 67 20 6f 72 20 62 6c 6f 62 20 6c 61 72 67 65 72  g or blob larger
2b180 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
2b190 5f 4c 45 4e 47 54 48 0a 20 20 2a 2a 20 69 73 20  _LENGTH.  ** is 
2b1a0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 20 20 2a  encountered..  *
2b1b0 2f 0a 74 6f 6f 5f 62 69 67 3a 0a 20 20 73 71 6c  /.too_big:.  sql
2b1c0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2b1d0 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
2b1e0 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
2b1f0 6f 6f 20 62 69 67 22 29 3b 0a 20 20 72 63 20 3d  oo big");.  rc =
2b200 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
2b210 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
2b220 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75  r_halt;..  /* Ju
2b230 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61 20  mp to here if a 
2b240 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
2b250 20 20 2a 2f 0a 6e 6f 5f 6d 65 6d 3a 0a 20 20 64    */.no_mem:.  d
2b260 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2b270 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  = 1;.  sqlite3Se
2b280 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
2b290 4d 73 67 2c 20 64 62 2c 20 22 6f 75 74 20 6f 66  Msg, db, "out of
2b2a0 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 72 63 20   memory");.  rc 
2b2b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b2c0 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
2b2d0 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75  r_halt;..  /* Ju
2b2e0 6d 70 20 74 6f 20 68 65 72 65 20 66 6f 72 20 61  mp to here for a
2b2f0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  n SQLITE_MISUSE 
2b300 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 61 62 6f 72  error..  */.abor
2b310 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3a  t_due_to_misuse:
2b320 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d  .  rc = SQLITE_M
2b330 49 53 55 53 45 3b 0a 20 20 2f 2a 20 46 61 6c 6c  ISUSE;.  /* Fall
2b340 20 74 68 72 75 20 69 6e 74 6f 20 61 62 6f 72 74   thru into abort
2b350 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 20 2a 2f  _due_to_error */
2b360 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68  ..  /* Jump to h
2b370 65 72 65 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ere for any othe
2b380 72 20 6b 69 6e 64 20 6f 66 20 66 61 74 61 6c 20  r kind of fatal 
2b390 65 72 72 6f 72 2e 20 20 54 68 65 20 22 72 63 22  error.  The "rc"
2b3a0 20 76 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 73   variable.  ** s
2b3b0 68 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  hould hold the e
2b3c0 72 72 6f 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  rror number..  *
2b3d0 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  /.abort_due_to_e
2b3e0 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
2b3f0 70 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b  p->zErrMsg==0 );
2b400 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2b410 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53  cFailed ) rc = S
2b420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69  QLITE_NOMEM;.  i
2b430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  f( rc!=SQLITE_IO
2b440 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
2b450 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
2b460 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
2b470 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
2b480 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 7d  ErrStr(rc));.  }
2b490 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72  .  goto vdbe_err
2b4a0 6f 72 5f 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a  or_halt;..  /* J
2b4b0 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 74  ump to here if t
2b4c0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  he sqlite3_inter
2b4d0 72 75 70 74 28 29 20 41 50 49 20 73 65 74 73 20  rupt() API sets 
2b4e0 74 68 65 20 69 6e 74 65 72 72 75 70 74 0a 20 20  the interrupt.  
2b4f0 2a 2a 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62  ** flag..  */.ab
2b500 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72  ort_due_to_inter
2b510 72 75 70 74 3a 0a 20 20 61 73 73 65 72 74 28 20  rupt:.  assert( 
2b520 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
2b530 70 74 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 53  pted );.  rc = S
2b540 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
2b550 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  .  p->rc = rc;. 
2b560 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
2b570 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
2b580 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
2b590 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 67  ErrStr(rc));.  g
2b5a0 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f 68  oto vdbe_error_h
2b5b0 61 6c 74 3b 0a 7d 0a                             alt;.}.